1. 程式人生 > >【大資料技術】2.協調服務zookeeper

【大資料技術】2.協調服務zookeeper

本文主要按以下六個部分進行描述:
一、概念與作用
二、資料模型與特徵
三、角色
四、工作原理
五、選舉機制
六、zookeeper實戰操作(shell命令與API)

一、概念與作用

zookeeper主要是為分散式應用提供一致性服務
主要提供:維護配置資訊、名字服務、分散式同步、組服務
其結構類似於檔案系統,但沒有檔案和目錄
節點名znode,儲存資料的容器,限定在1M內

二、資料模型與特徵

1.唯一路徑表示,節點標識:/APP1/SERVER1,擁有一個層次的名稱空間
2.節點裡的資料可以有多個版本
3.可以有臨時節點,session失效就自動刪除,一般是保持長連線的方式,通過心跳機制保持連線。
4.可以自動編號。
5.也可以被監控。

三、角色

領導者
跟隨者
觀察者

四、工作原理

通過zab協議進行溝通,有兩種工作模式:恢復模式與廣播模式
1.領導者與跟隨者正常狀態下,使用廣播模式進行節點同步,節點同步按zxid順序執行,zxid為64位,高32位是epoch標識,表示leader關係是否改變,每次改變都會有個新epoch,低32位是個遞增計數。
2.有服務啟動狀態或領導者崩潰狀態,進入恢復模式,需要zookeeper根據選舉機制進行投票,選出leader

五、選舉機制

假設有3臺伺服器,每臺伺服器均沒有資料,它們的編號分別是1,2,3,按編號依次啟動,它們的選舉過程如下:

每個Server發出一個投票。由於是初始情況,Server1和Server2都會將自己作為Leader伺服器來進行投票,每次投票會包含所推舉的伺服器的myid和ZXID,使用(myid, ZXID)來表示,此時Server1的投票為(1, 0),Server2的投票為(2, 0),然後各自將這個投票發給叢集中其他機器。


**伺服器啟動時的選舉:**
    1.伺服器1啟動,給自己投票,然後發投票資訊,由於其它機器還沒有啟動所以它收不到反饋資訊,伺服器1的狀態一直屬於Looking狀態。
    2.伺服器2啟動,給自己投票,同時與之前啟動的伺服器1相互通訊,開始進入競爭模式,Server1和Server2都會將自己作為Leader伺服器來進行投票,每次投票會包含所推舉的伺服器的myid和ZXID,使用(myid, ZXID)來表示,由於ZXID表示上一次處理事務的id,剛啟動的表示0,此時Server1的投票為(1, 0),Server2的投票為(2, 0),然後各自將這個投票發給叢集中其他機器。
    3.叢集的每個伺服器收到投票後,首先判斷該投票的有效性,如檢查是否是本輪投票、是否來自LOOKING狀態的伺服器。
    **4.伺服器PK,首先比較ZXID,如果ZXID相同再比較myid,比較後發現server2的myid較大,於是重新整理server1的投票為(2,0),**
    5.計算票數,由於server2的票數過半,因此server2是領導者,server1是跟隨者。
    **zookeeper執行期間的選舉:**

    在Zookeeper執行期間,Leader與非Leader伺服器各司其職,即便當有非Leader伺服器宕機或新加入,此時也不會影響Leader,但是一旦Leader伺服器掛了,那麼整個叢集將暫停對外服務,進入新一輪Leader選舉,其過程和啟動時期的Leader選舉過程基本一致。
    1.伺服器3啟動加入,預設是跟隨者,但是若伺服器2宕機,就要重新進入選舉模式。
    2.首先所有伺服器進入LOOKING狀態,伺服器3給自己投票,同時與之前啟動的伺服器1交換資訊,同樣伺服器1也一樣,那麼伺服器1的投票為(1,2),伺服器3的投票為(3,2),根據以上步驟,由於伺服器3的編號最大所以伺服器3勝出,所以伺服器3成為領導者,伺服器1成為小弟。
    那麼如何加入伺服器4,5,都是小弟。
注意:以上是我對zookeeper選舉機制的理解,歡迎大家指正。

六、zookeeper實戰操作(shell命令與API)

 zookeeper配置與啟動

1.先解壓zookeeper壓縮檔案, tar -zvxf /壓縮檔案地址

2.在zookeeper目錄下建立資料夾mkdir data_single,並建立myid 輸入值為1  命令:echo 1 >>myid

3.依次再去別的namenode的zookeeper目錄下建立資料夾,以及myid檔案,假如建立了2個,輸入值為2,3,表示有三個叢集

4.修改zookeeper目錄的conf下zoo_sample.cfg檔案,並改名zoo.cfg,修改該檔案

5.設定叢集引數,比如

server.1=192.168.213.10:2222:2223

server.2=192.168.213.11:2222:2223

server.3=192.168.213.10:2222:2223

格式server.myid=伺服器ip:埠號1:埠號2

埠號1:用於F和L之間的資料同步和其它通訊

埠號2:用於Leader選舉過程中投票通訊

6.啟動服務,bin目錄下執行,./zkServer.sh start (可加配置檔名 如zoo.cfg)

7.建立會話

可通過bin/zkCli.sh -timeout 5000 -server 192.168.213.11:2181 命令連線zk的服務

即建立會話,每次讀操作會建立一個一次性觸發器watch

根據叢集的高可用性,一般hbase會依賴zookeeper  hbase會用到hdfs依賴Hadoop  因此

啟動順序:Hadoop->zookeeper->hbase

關閉順序:hbase->zookeeper->Hadoop

隨後就可以通過shell命令或java程式連線服務端,實現節點的增刪改查了。

比如命令

create /zk “test”   ,

get /zk ,

set /zk "zzzz",

delete "zk" ,

個人覺得這些節點操作可檢查zookeeper叢集是否同步問題。

 

以上是個人的理解,歡迎批評指正,謝謝!