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,如果沒有則放棄。