集群腦裂處理方法和裝置的制造方法
【技術領域】
[0001]本發(fā)明涉及計算機應用領域,尤其涉及一種集群腦裂處理方法和裝置。
【背景技術】
[0002]高可用集群是以減少服務中斷時間為目的的服務器集群技術。正在運行服務的節(jié)點稱為主用機。不在運行服務,但后續(xù)可能接替主用機運行服務的節(jié)點稱為備用機。當主用機故障后,備用機就會接手繼續(xù)運行服務,達到提供持續(xù)的服務的效果。
[0003]節(jié)點間互聯(lián)網絡稱為心跳線。通過心跳線,集群中的每個節(jié)點都可以跟任何其它節(jié)點進行通信,通過通信協(xié)議還可以獲知當前集群中有哪些節(jié)點(下文將提供通信功能的模塊稱為“心跳通信模塊”)。一旦某個節(jié)點發(fā)現(xiàn)跟另外一個節(jié)點通信出現(xiàn)問題,則有可能是心跳線故障了,也有可能是對端節(jié)點故障了??傊嚎赡軙至褳槿舾蓚€子集。業(yè)界將這種情況叫做“腦裂”。當某個子集中的節(jié)點無法了解其他子集失去聯(lián)系的具體原因時,它不能猜測原因,更不能基于猜測來決定要不要運行服務(下文將控制服務啟動或停止的模塊稱為“服務控制邏輯模塊”),否則集群可能會出現(xiàn)丟失主用或出現(xiàn)多主的問題。
[0004]舉兩個節(jié)點A,B組成集群為例,A上正運行某服務,B作為備機。當節(jié)點B發(fā)現(xiàn)無法跟A通信時,如果它猜測是網絡故障,則B會保持備機角色不變。但如果實際上是A節(jié)點故障,那么集群將失去主用,上層應用無法繼續(xù)運行。反之,如果B節(jié)點猜測是A節(jié)點故障,則B將接替A來運行服務。但如果只是網絡故障,A還在正常運行的話,則集群出現(xiàn)了 A,B兩個主用機。多個主用機的情況也是集群需要極力避免的,因為多個主用機互相競爭資源,嚴重情況下可能導致數據被破壞。
[0005]綜上,在集群發(fā)生腦裂時,如何繼續(xù)對集群進行控制存在問題。
【發(fā)明內容】
[0006]本發(fā)明提供了一種集群腦裂處理方法和裝置,解決了集群腦裂后的控制問題。
[0007]一種集群腦裂處理方法,包括:
[0008]在集群發(fā)生腦裂時,選取該集群中唯一允許繼續(xù)服務的子集;
[0009]控制除所述唯一允許繼續(xù)服務的子集外的其他子集中的節(jié)點停止工作。
[0010]優(yōu)選的,在集群發(fā)生腦裂時,選取該集群中唯一允許繼續(xù)服務的子集包括:
[0011]選取在腦裂發(fā)生前的主要節(jié)點所在子集為期望的主要子集;
[0012]選取節(jié)點數量大于腦裂發(fā)生前集群節(jié)點數量一半的子集作為唯一大子集;
[0013]從所述期望的主要子集和所述唯一大子集中,選擇唯一允許繼續(xù)服務的子集。
[0014]優(yōu)選的,該方法還包括:
[0015]在集群初始化時,在共享介質上開辟一塊磁盤空間作為判決盤,將所述判決盤分區(qū),將所述集群中的每個節(jié)點唯一對應到所述判決盤的一個分區(qū)上;
[0016]所述集群中的各個節(jié)點通過磁盤I/O操作向所述判決盤中對應的分區(qū)里寫入當前時間戳;
[0017]選擇持續(xù)更新時間戳的節(jié)點之一作為主要節(jié)點。
[0018]優(yōu)選的,該方法還包括:
[0019]所述集群中的各個節(jié)點在沒有發(fā)生腦裂的正常情況下,通過額外的Ethernet網絡周期廣播或組播KeepAlive消息;
[0020]選擇持續(xù)發(fā)出所述KeepAlive消息的節(jié)點之一作為主要節(jié)點。
[0021]優(yōu)選的,選取在腦裂發(fā)生前的主要節(jié)點所在子集為期望的主要子集的步驟之后,還包括:
[0022]從所述期望的主要子集中指派一個代表節(jié)點,指示所述代表節(jié)點在第一延遲時間之后通知除所述期望的主要子集外的其他各個子集的全部節(jié)點停止工作。
[0023]優(yōu)選的,從所述期望的主要子集和所述唯一大子集中,選擇唯一允許繼續(xù)服務的子集包括:
[0024]在不存在唯一大子集時,選擇所述期望的主要子集作為唯一允許繼續(xù)服務的子集;
[0025]在所述期望的主要子集與所述唯一大子集為同一子集時,以該子集作為唯一允許繼續(xù)服務的子集;
[0026]在所述期望的主要子集與所述唯一大子集為不同子集時,以所述唯一大子集作為唯一允許繼續(xù)服務的子集。
[0027]優(yōu)選的,選取節(jié)點數量大于腦裂發(fā)生前集群節(jié)點數量一半的子集作為唯一大子集的步驟之后,還包括:
[0028]從所述唯一大子集中選擇一個節(jié)點作為唯一大子集代表;
[0029]指示所述唯一大子集代表判定所述唯一大子集與所述期望的主要子集為不同子集時,在零時延或第二延遲時間后,通知除所述唯一大子集外的其他子集的全部節(jié)點停止工作,所述第二延遲時間小于所述第一延遲時間。
[0030]優(yōu)選的,該方法還包括:
[0031]在節(jié)點檢測到心跳線通信發(fā)生中斷時,中斷該節(jié)點底層心跳通信與上層服務控制邏輯間的通信,至達到第一時間長度后,判定腦裂發(fā)生,恢復所述底層心跳通信與上層服務控制邏輯間的通信。
[0032]優(yōu)選的,在以所述唯一大子集作為唯一允許繼續(xù)服務的子集時,該方法還包括:
[0033]從所述唯一大子集中選舉一個節(jié)點作為新的主要節(jié)點,選舉所述新的主要節(jié)點耗時從判定發(fā)生腦裂時起至第二時間長度止,所述第二時間長度小于所述第一時間長度。
[0034]優(yōu)選的,該方法還包括:
[0035]在所述集群的各個節(jié)點維護當前集群成員列表、成員數量和集群成員變化通知信肩、O
[0036]本發(fā)明還提供了一種集群腦裂處理裝置,包括:
[0037]繼續(xù)服務子集選擇模塊,用于在集群發(fā)生腦裂時,選取該集群中唯一允許繼續(xù)服務的子集;
[0038]節(jié)點停工控制模塊,用于控制除所述唯一允許繼續(xù)服務的子集外的其他子集中的節(jié)點停止工作。
[0039]優(yōu)選的,所述繼續(xù)服務子集選擇模塊包括:
[0040]期望主要子集選取單元,用于選取在腦裂發(fā)生前的主要節(jié)點所在子集為期望的主要子集;
[0041]唯一大子集選取單元,用于選取節(jié)點數量大于腦裂發(fā)生前集群節(jié)點數量一半的子集作為唯一大子集;
[0042]繼續(xù)服務子集選取單元,用于從所述期望的主要子集和所述唯一大子集中,選擇唯一允許繼續(xù)服務的子集。
[0043]優(yōu)選的,所述繼續(xù)服務子集選擇模塊還包括:
[0044]代表節(jié)點選擇單元,用于從所述期望的主要子集中指派一個代表節(jié)點,指示所述代表節(jié)點在第一延遲時間之后通知除所述期望的主要子集外的其他各個子集的全部節(jié)點停止工作。
[0045]優(yōu)選的,所述繼續(xù)服務子集選取單元包括:
[0046]第一選取子單元,用于在不存在唯一大子集時,選擇所述期望的主要子集作為唯一允許繼續(xù)服務的子集;
[0047]第二選取子單元,用于在所述期望的主要子集與所述唯一大子集為同一子集時,以該子集作為唯一允許繼續(xù)服務的子集;
[0048]第三選取子單元,用于在所述期望的主要子集與所述唯一大子集為不同子集時,以所述唯一大子集作為唯一允許繼續(xù)服務的子集。
[0049]優(yōu)選的,所述繼續(xù)服務子集選擇模塊還包括:
[0050]唯一大子集代表選擇單元,用于從所述唯一大子集中選擇一個節(jié)點作為唯一大子集代表,指示所述唯一大子集代表判定所述唯一大子集與所述期望的主要子集為不同子集時,在零時延或第二延遲時間后,通知除所述唯一大子集外的其他子集的全部節(jié)點停止工作,所述第二延遲時間小于所述第一延遲時間。
[0051]優(yōu)選的,該裝置還包括:
[0052]內部通信管理模塊,用于在節(jié)點檢測到心跳線通信發(fā)生中斷時,中斷該節(jié)點底層心跳通信與上層服務控制邏輯間的通信,至達到第一時間長度后,判定腦裂發(fā)生,恢復所述底層心跳通信與上層服務控制邏輯間的通信。
[0053]優(yōu)選的,在以所述唯一大子集作為唯一允許繼續(xù)服務的子集時,該裝置還包括:
[0054]主要節(jié)點選舉模塊,用于從所述唯一大子集中選舉一個節(jié)點作為新的主要節(jié)點,選舉所述新的主要節(jié)點耗時從判定發(fā)生腦裂時起至第二時間長度止,所述第二時間長度小于所述第一時間長度。
[0055]優(yōu)選的,該裝置還包括:
[0056]存儲模塊,用于維護當前集群成員列表、成員數量和集群成員變化通知信息。
[0057]本發(fā)明提供了