Cassandra中Gossip具體實現方式

來源:互聯網
上載者:User

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

 

 

 

 

 

 

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.