Storm Nimbus的HA

Storm在1.0之后對nimbus支持了HA,根據(jù)官方提供的文檔,同樣是利用了zk來做分布式鎖,并且配置文件中新增了storm.seeds,而原來的storm.hosts改為deprecated。但是nimbus如果想成為leader,必須有一個先決條件就是這個nimbus本地必須包含所有的topo的代碼(code),否則這個nimbus是不會接受leader角色的。

首先看啟動,nimbus的啟動通過命令行的方式./storm nimbus,在啟動腳本中又調(diào)用storm.py的腳本,而這個python腳本則直接指向了

o.a.s.d.nimbus


在初始化的過程中,首先實現(xiàn)了INimbus的接口


接下來,-lauch方法對配置文件做了解析,然后實際啟動server是launch-server方法


launch-server方法做了如下幾件事情


1. 驗證是否為本地模式,如果是local模式則拋異常

2. 驗證端口是否可用,就是配置文件中的thrift.server的端口

3. 注意service-handler這個方法,在它的內(nèi)部其實做了很多事情

接下來看看service-handler這個方法,service-handler定義了一系列的方法,這些方法都是用于提供對外服務(wù)。

首先service-handler通過let綁定了nimbus (nimbus-data conf inimbus), nimbus-data其實提供了許多運行時需要的nimbus數(shù)據(jù)。


這里只談HA,在nimbus-data中有這樣一對鍵值對


而zk-leader-elector利用了zk的leader-latch做leader選舉

nimbus.clj下的這一段是定時從其他nimbus同步代碼的核心


在這里,blob-sync做了在不同nimbus上同步sync。這里的注釋寫的很明白,定期去同步其他nimbus的code。blob-sync是個多態(tài)方法。首先看看下面這個邏輯

1. 判斷是不是leader,如果不是leader,轉(zhuǎn)到2(是leader就有全部的code了,自然不需要做其他事情)

2. 構(gòu)建一個BlobSyncronizer對象,執(zhí)行syncBlobs方法


blob-sync方法中通過let綁定的值有幾個,這里可以看一下相對比較復(fù)雜的zk-key-set,這個zk-key-set綁定了一個set的數(shù)據(jù)結(jié)構(gòu),

而這個set的數(shù)據(jù)結(jié)構(gòu)的值又是來源于storm-cluster-stat的blobstore方法。那么現(xiàn)在就看看storm-cluster-state方法是怎么來的。

可以看到通過追溯代碼,能夠發(fā)現(xiàn)其來源于nimbus-data的一個綁定,這個綁定中的一個方法就是mk-storm-cluster-state.


那么mk-storm-cluster-state這個方法有做了什么呢?

讓我們進入定義它的cluster.clj去看一下。


這里詳細解釋了cluster-state的來源,其實它是通過mk-distributed-cluster-state方法創(chuàng)建出來的一個對象,而這個對象就是通過反射得到的org.apache.storm.cluster_state.zookeeper_state_factory這樣一個對象


弄清楚cluster-state的來源,我們回頭再看zk-key-set的blobstore方法


這個方法其實就是調(diào)用了org.apache.storm.cluster_state.zookeeper_state_factory的幾個方法。至于sync_path和get_chmk的邏輯就不再贅述了。

blob-sync方法在做完綁定之后,執(zhí)行了syncBlobs方法,這個方法定義在BlobSyncronizer中。首先這個方法利用synchronized表明這是個同步方法。這個方法中

1. ?刪除不在zk上,而在blobstore中的key


2. updateKeySetForBlobStore,這個方法里檢查了zk上所有的最近一個version的blobstore,并且檢查當前的nimbus是否含有這個最近版本的key。如果沒有,那么則在zk上創(chuàng)建一個。而創(chuàng)建的方法則是通過thrift接口調(diào)用createStateInZookeeper實現(xiàn)的



3. 既然zk上的路徑也創(chuàng)建了,那么接下來就應(yīng)該創(chuàng)建本地文件了(如何下載的沒有深究,好像是用到了bt協(xié)議?)


這樣就完成了HA的分析,總結(jié)一下:

通過定時任務(wù),定時去檢查是否有未下載的blob,如果有則下去下載。另外通過zk的leader-latch做選舉,

如果被選為leader,那么需要檢查是否有足夠多的key,如果沒有則放棄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 OpenShift是目前比較主流的基于Kubernetes的容器云解決方案,OpenShift在kubern...
    小白_18M閱讀 1,310評論 0 5
  • kafka的定義:是一個分布式消息系統(tǒng),由LinkedIn使用Scala編寫,用作LinkedIn的活動流(Act...
    時待吾閱讀 5,537評論 1 15
  • 目錄 場景假設(shè) 調(diào)優(yōu)步驟和方法 Storm 的部分特性 Storm 并行度 Storm 消息機制 Storm UI...
    mtide閱讀 17,274評論 30 60
  • 馮陳陳閱讀 361評論 0 0
  • 寂靜的深夜,漸涼的冷意,邃然的星空,一切未入表面的平靜,還有你我起伏的夢境,于夢境盲行,生活還會怎樣茫然…...
    Whereever閱讀 309評論 0 0

友情鏈接更多精彩內(nèi)容