(一)Gossip的作用
Cassandra叢集沒有中心節點,各個節點的地位完全相同,它們通過一種叫做gossip的協議維護叢集的狀態。
通過gossip,每個節點都能知道叢集中包含哪些節點,以及這些節點的狀態,這使得Cassandra叢集中的任何一個節點都可以完成任意key的路由,任意一個節點不可用都不會造成災難性的後果。
(二)Gossip協議介紹
gossip的學名叫做Anti-entropy(逆熵?),比較適合在沒有很高一致性要求的情境中用作同步資訊。資訊達到同步的時間大概是log(N),這裡N表示節點的數量。
gossip有兩種形式:anti-entropy和rumor-mongering。
gossip中的每個節點維護一組狀態,狀態可以用一個key/value對錶示,還附帶一個版本號碼,版本號碼大的為更新的狀態。
訊息的處理有3種方式,Cassandra採用第三種方式——Push-pull-gossip
(三)Gossip訊息如何如何發送
當一個節點啟動時,擷取設定檔(cassandra.yaml)中的seeds配置,從而知道叢集中所有的seed節點。
Cassandra內部有一個Gossiper,每隔一秒運行一次(在Gossiper.java的start方法中),按照以下規則向其他節點發送同步訊息:
1、隨機取一個當前活著的節點,並向它發送同步請求
2、向隨機一台不可達的機器發送同步請求
3、如果第一步中所選擇的節點不是seed,或者當前活著的節點數少於seed數,則向隨意一台seed發送同步請求
如果沒有這個判斷,考慮這樣一種情境,有4台機器,{A, B, C, D},並且配置了它們都是seed,如果它們同時啟動,可能會出現這樣的情形:
1、A節點起來,發現沒有活著的節點,走到第三步,和任意一個種子同步,假設選擇了B
2、B節點和A完成同步,則認為A活著,它將和A同步,由於A是種子,B將不再和其他種子同步
3、C節點起來,發現沒有活著的節點,同樣走到第三步,和任意一個種子同步,假設這次選擇了D
4、C節點和D完成同步,認為D活著,則它將和D同步,由於D也是種子,所以C也不再和其他種子同步
這時就形成了兩個孤島,A和B互相同步,C和D之間互相同步,但是{A,B}和{C,D}之間將不再互相同步,它們也就不知道對方的存在了。
加入第二個判斷後,A和B同步完,發現只有一個節點活著,但是seed有4個,這時會再和任意一個seed通訊,從而打破這個孤島。
(四)Cassandra中Gossip資料結構
gossip通訊的狀態資訊主要有3種:
1、EndPointState
2、HeartBeatState
3、ApplicationState
HeartBeatState 由generation和version組成,generation每次啟動都會變化,用於區分機器重啟前後的狀態;Version是只能增長的,每次心跳之前進行遞增
ApplicationState用於表示系統的狀態,由state和version組成,state表示節點的狀態,version是遞增的,每個對象表示節點一種狀態,比如表示當前load的狀態大概是這樣:(1.2, 20),含義為版本號碼為20時該節點的load是1.2
EndPointState 封裝了一個節點的ApplicationState構成的映射(Map<String, ApplicationState> applicationState_)和HeartBeatState
一個節點自身的狀態只能由自己修改,其他節點的狀態只能通過同步更新。
(六)Gossip狀態資訊有哪些
負載資訊(LOAD-INFORMATION)
遷移資訊(MIGRATION)
節點狀態資訊(MOVE)
BOOT(啟動階段)節點正在啟動
NORMAL(正常)節點加入了Token的ring,可以提供讀
LEAVING,節點準備離開Ring
LEFT,節點被踢出叢集或者是Token資訊被手工變更
(七)Gossip訊息同步過程
(八)Gossip訊息同步執行個體
(1)Node 10.0.0.1(endPointStateMap):
EndPointState 10.0.0.1<br /> HeartBeatState: generation 1259909635, version 325<br /> ApplicationState "load-information": 5.2, generation 1259909635, version 45<br /> ApplicationState "bootstrapping": bxLpassF3XD8Kyks, generation 1259909635, version 56<br /> ApplicationState "normal": bxLpassF3XD8Kyks, generation 1259909635, version 87<br />EndPointState 10.0.0.2<br /> HeartBeatState: generation 1259911052, version 61<br /> ApplicationState "load-information": 2.7, generation 1259911052, version 2<br /> ApplicationState "bootstrapping": AujDMftpyUvebtnn, generation 1259911052, version 31<br />EndPointState 10.0.0.3<br /> HeartBeatState: generation 1259912238, version 5<br /> ApplicationState "load-information": 12.0, generation 1259912238, version 3<br />EndPointState 10.0.0.4<br /> HeartBeatState: generation 1259912942, version 18<br /> ApplicationState "load-information": 6.7, generation 1259912942, version 3<br /> ApplicationState "normal": bj05IVc0lvRXw2xH, generation 1259912942, version 7
(2)Node 10.0.0.2(endPointStateMap):
EndPointState 10.0.0.1<br /> HeartBeatState: generation 1259909635, version 324<br /> ApplicationState "load-information": 5.2, generation 1259909635, version 45<br /> ApplicationState "bootstrapping": bxLpassF3XD8Kyks, generation 1259909635, version 56<br /> ApplicationState "normal": bxLpassF3XD8Kyks, generation 1259909635, version 87<br />EndPointState 10.0.0.2<br /> HeartBeatState: generation 1259911052, version 63<br /> ApplicationState "load-information": 2.7, generation 1259911052, version 2<br /> ApplicationState "bootstrapping": AujDMftpyUvebtnn, generation 1259911052, version 31<br /> ApplicationState "normal": AujDMftpyUvebtnn, generation 1259911052, version 62<br />EndPointState 10.0.0.3<br /> HeartBeatState: generation 1259812143, version 2142<br /> ApplicationState "load-information": 16.0, generation 1259812143, version 1803<br /> ApplicationState "normal": W2U1XYUC3wMppcY7, generation 1259812143, version 6
GossipDigestSynMessage(節點10.0.0.1):
10.0.0.1:1259909635:325
10.0.0.2:1259911052:61
10.0.0.3:1259912238:5
10.0.0.4:1259912942:18
GossipDigestAckMessage(節點10.0.0.2):
10.0.0.1:1259909635:324
10.0.0.3:1259912238:0
10.0.0.4:1259912942:0
10.0.0.2:
[ApplicationState "normal": AujDMftpyUvebtnn, generation 1259911052, version 62],
[HeartBeatState, generation 1259911052, version 63]
GossipDigestAck2Message(節點10.0.0.1):
10.0.0.1:
HeartBeatState: generation 1259909635, version 325
ApplicationState "load-information": 5.2, generation 1259909635, version 45
ApplicationState "bootstrapping": bxLpassF3XD8Kyks, generation 1259909635, version 56
ApplicationState "normal": bxLpassF3XD8Kyks, generation 1259909635, version 87
10.0.0.3:
HeartBeatState: generation 1259912238, version 5
ApplicationState "load-information": 12.0, generation 1259912238, version 3
10.0.0.4:
HeartBeatState: generation 1259912942, version 18
ApplicationState "load-information": 6.7, generation 1259912942, version 3
ApplicationState "normal": bj05IVc0lvRXw2xH, generation 1259912942, version 7