Gossip in Cassandra

(一)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):

 

[xhtml] view plain copy
  1. EndPointState 10.0.0.1  
  2.   HeartBeatState: generation 1259909635, version 325  
  3.   ApplicationState "load-information": 5.2, generation 1259909635, version 45  
  4.   ApplicationState "bootstrapping": bxLpassF3XD8Kyks, generation 1259909635, version 56  
  5.   ApplicationState "normal": bxLpassF3XD8Kyks, generation 1259909635, version 87  
  6. EndPointState 10.0.0.2  
  7.   HeartBeatState: generation 1259911052, version 61  
  8.   ApplicationState "load-information": 2.7, generation 1259911052, version 2  
  9.   ApplicationState "bootstrapping": AujDMftpyUvebtnn, generation 1259911052, version 31  
  10. EndPointState 10.0.0.3  
  11.   HeartBeatState: generation 1259912238, version 5  
  12.   ApplicationState "load-information": 12.0, generation 1259912238, version 3  
  13. EndPointState 10.0.0.4  
  14.   HeartBeatState: generation 1259912942, version 18  
  15.   ApplicationState "load-information": 6.7, generation 1259912942, version 3  
  16.   ApplicationState "normal": bj05IVc0lvRXw2xH, generation 1259912942, version 7  

(2)Node 10.0.0.2(endPointStateMap):

[c-sharp] view plain copy
  1. EndPointState 10.0.0.1  
  2.   HeartBeatState: generation 1259909635, version 324  
  3.   ApplicationState "load-information": 5.2, generation 1259909635, version 45  
  4.   ApplicationState "bootstrapping": bxLpassF3XD8Kyks, generation 1259909635, version 56  
  5.   ApplicationState "normal": bxLpassF3XD8Kyks, generation 1259909635, version 87  
  6. EndPointState 10.0.0.2  
  7.   HeartBeatState: generation 1259911052, version 63  
  8.   ApplicationState "load-information": 2.7, generation 1259911052, version 2  
  9.   ApplicationState "bootstrapping": AujDMftpyUvebtnn, generation 1259911052, version 31  
  10.   ApplicationState "normal": AujDMftpyUvebtnn, generation 1259911052, version 62  
  11. EndPointState 10.0.0.3  
  12.   HeartBeatState: generation 1259812143, version 2142  
  13.   ApplicationState "load-information": 16.0, generation 1259812143, version 1803  
  14.   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

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章