一、叢集部署
1.準備三臺機器,安裝好ZK。強烈建議奇數臺機器,因為zookeeper 通過判斷大多數節點的存活來判斷整個服務是否可用。3個節點,掛掉了2個表示整個叢集掛掉,而用偶數4個,掛掉了2個也表示其並不是大部分存活,因此也會掛掉,這樣反而覺得多浪費了一臺機器資源。
2.修改配置檔案
固定語法格式:server.節點ID=ip:資料同步埠:選舉埠
節點ID:服務id手動指定1至125之間的數字,並寫到對應服務節點的 {dataDir}/myid 檔案中。
IP地址:節點的遠端IP地址
資料同步埠:主從同步資料複製埠。
遠舉埠:主節點掛了,選舉新的主節點的通訊埠。
如:
server.1=192.168.0.67:28888:38888
server.2=192.168.0.68:28888:38888
server.3=192.168.0.69:28888:38888
三臺機器都是一樣的內容:
3.配置檔案中指定的dataDir目錄下面建立myid檔案並寫入配置中的對應值
我的dataDir目錄是/tmp/zookeeper
對應配置中的IP對應的節點ID寫入
192.168.0.67:
192.168.0.68:
192.168.0.69:
4.各自使用配置檔案啟動服務
./zkServer.sh start ../conf/zoo.cfg
5.檢視各自的節點的狀態
./zkServer.sh status
我們可以看到有兩臺是follower 一臺是leader
6.連線叢集
連線任意一臺節點即可連線叢集,也可以每一臺都去連線,使用,分割
zkCli.sh 後加引數-server 表示連線指定IP與埠
./zkCli.sh -server 192.168.0.67:2181
連線叢集67節點 寫入資料,然後再連線68一樣可以看到寫入的資料,說明資料同步了
如果我們停掉一臺機器,叢集仍然可用,如果停掉的是leader,那麼叢集會選舉新的leader,選舉的時候整個叢集是不可用的。如果停掉兩臺機器,叢集就會不可用了。
二、叢集角色
前面通過./zkServer.sh status 指令我們看到了叢集角色中的leader和follower,還有一個observer
leader |
主節點,又名領導者。用於寫入資料,通過選舉產生,如果當機將會選舉新的主節點。 |
follower |
子節點,又名追隨者。用於實現資料的讀取。同時他也是主節點的備選節點,並用擁有投票權。 |
observer |
次級子節點,又名觀察者。用於讀取資料,與follower區別在於沒有投票權,不能選為主節點。並且在計算叢集可用狀態時不會將observer計算入內。 |
observer配置:
只要在叢集配置中加上observer字尾即可,示例如下:
server.3=192.168.0.69:2889:3889:observer
三、叢集選舉
前面我們通過./zkServer.sh status 指令已經看到68機器的leader, 67和69是follower
為什麼68是leader呢?叢集選舉的時候,第一輪全部投給自己,後面每次都遞增投給比自己myid大的相鄰結點。如果票數過半選舉結束。
假如是四個節點還會進行第三輪選舉,第三輪第一個節點會投給第三個節點,所以如果是4個節點那麼leader就會是第三個節點。
叢集節點中出現選舉有兩種情況,一種是節點啟動,另一種是半數以上節點無法和leader建立連線。
當節點初始起動時會在叢集中尋找Leader節點,如果找到則與Leader建立連線,其自身狀態變化follower或observer。如果沒有找到Leader,當前節點狀態將變化LOOKING,進入選舉流程。
在叢集執行其間如果有follower或observer節點當機只要不超過半數並不會影響整個叢集服務的正常執行。但如果leader當機,將暫停對外服務,所有follower將進入LOOKING 狀態,進入選舉流程。
四、資料同步
zookeeper的資料同步是為了保證各節點中資料的一致性。一個是正常客戶端資料提交,另一個是服務當機恢復之後的資料同步。之前的操作我們也看見了在一臺機器上面寫入資料之後,在其他的機器上面也是有資料的。
資料寫入時,請求可能是傳送給follower的,這個時候會將請求轉發給leader
1.client向zk中的server傳送寫請求,如果該server不是leader,則會將該寫請求轉發給leader server,leader將請求事務以proposal形式分發給follower;
2.當follower收到收到leader的proposal時,根據接收的先後順序處理proposal;
3.當Leader收到follower針對某個proposal過半的ack後,則發起事務提交,重新發起一個commit的proposal
4.Follower收到commit的proposal後,記錄事務提交,並把資料更新到記憶體資料庫;當寫成功後,反饋給client。
在叢集執行過程當中如果有一個follower節點當機,由於當機節點沒過半,叢集仍然能正常服務。當leader 收到新的客戶端請求,此時無法同步給當機的節點。造成資料不一至。為了解決這個問題,當節點啟動時,第一件事情就是找當前的Leader,比對資料是否一至。不一至則開始同步,同步完成之後在進行對外提供服務。
那麼zk是怎麼來確認資料版本呢,是通過前面介紹過的Zxid,來進行對比的。能參與leader選舉的節點也是zxid最新的節點(最新zxid資料是完整的)
Zxid是一個長度64位的數字,其中低32位是按照數字遞增,任何資料的變更都會導致,低32位的數字簡單加1。高32位是leader週期編號,每當選舉出一個新的leader時,新的leader就從本地事物日誌中取出ZXID,然後解析出高32位的週期編號,進行加1,再將低32位的全部設定為0。這樣就保證了每次新選舉的leader後,保證了ZXID的唯一性而且是保證遞增的。
簡單來說就是選舉會讓zxid的高32的資料加1,每次資料變更會讓zxid的低32位資料加1,所以zxid最大的節點資料永遠是最完整的一個。
五、叢集運維指令
Zk提供了一些運維相關的指令,可以通過telnet或nc向zk發出命令。這些命令都有4個字母組成又叫四字運維命令。
預設這些指令是關閉的,通過配置檔案中配置4lw.commands.whitelist來開啟這些命令
部分開啟:4lw.commands.whitelist=stat, conf, isro,envi
全部開啟:4lw.commands.whitelist=*
可能需要安裝Netcat工具:
yum install -y nc
檢視伺服器及客戶端連線狀態:
echo stat | nc localhost 2181
1.conf:3.3.0中的新增功能:列印有關服務配置的詳細資訊。
2.crst:3.3.0中的新增功能:重置所有連線的連線/會話統計資訊。
3.dump:列出未完成的會話和臨時節點。這僅適用於leader。
4.envi:列印有關服務環境的詳細資訊
6.ruok:測試伺服器是否以非錯誤狀態執行。如果伺服器正在執行,它將以imok響應。否則,它將完全不響應。響應“ imok”不一定表示伺服器已加入仲裁,只是伺服器程式處於活動狀態並繫結到指定的客戶端埠。使用“ stat”獲取有關狀態仲裁和客戶端連線資訊的詳細資訊。
7.srst:重置伺服器統計資訊。
8.srvr:3.3.0中的新功能:列出伺服器的完整詳細資訊。
9.stat:列出伺服器和連線的客戶端的簡要詳細資訊。
10.wchs:3.3.0中的新增功能:列出有關伺服器監視的簡要資訊。
11.wchc:3.3.0中的新增功能:按會話列出有關伺服器監視的詳細資訊。這將輸出具有相關監視(路徑)的會話(連線)列表。請注意,根據watch的數量,此操作可能會很昂貴(即影響伺服器效能),請小心使用。
12.dirs:3.5.1中的新增功能:以位元組為單位顯示快照和日誌檔案的總大小
13.wchp:3.3.0中的新增功能:按路徑列出有關伺服器監視的詳細資訊。這將輸出具有關聯會話的路徑(znode)列表。請注意,根據手錶的數量,此操作可能會很昂貴(即影響伺服器效能),請小心使用。
14.mntr:3.4.0中的新增功能:輸出可用於監視叢集執行狀況的變數列表。