深入理解zookeeper基本原理

2021-08-04 19:13:34 字數 3474 閱讀 4477

zookeeper 是乙個針對大型分布式系統的可靠協調系統;它提供的功能包括:配置維護、名字服務、分布式同步、組服務等; 它的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。

zookeeper 主要包含以下幾個特點:

1)、最終一致性:為客戶端展示同一檢視,這是 zookeeper 最重要的效能。

2)、可靠性:如果訊息被一台伺服器接受,那麼它將被所有的伺服器接受。

3)、實時性:zookeeper 不能保證兩個客戶端同時得到剛更新的資料,如果需要最新資料,應該在讀資料之前呼叫sync()介面。

4)、等待無關(wait-free):慢的或者失效的 client 不干預快速的client的請求。

5)、原子性:更新只能成功或者失敗,沒有中間其它狀態。

6)、順序性:對於所有server,同一訊息發布順序一致。

zookeeper 的寫資料流程主要分為以下幾步:

1)、比如 client 向 zookeeper 的 server1 上寫資料,傳送乙個寫請求。

2)、如果server1不是leader,那麼server1 會把接受到的請求進一步**給leader,因為每個zookeeper的server裡面有乙個是leader。這個leader 會將寫請求廣播給各個server,比如server1和server2, 各個server寫成功後就會通知leader。

3)、當leader收到大多數 server 資料寫成功了,那麼就說明資料寫成功了。如果這裡三個節點的話,只要有兩個節點資料寫成功了,那麼就認為資料寫成功了。寫成功之後,leader會告訴server1資料寫成功了。

4)、server1會進一步通知 client 資料寫成功了,這時就認為整個寫操作成功。

1、在分布式環境下,經常需要對應用/服務進行統一命名,便於識別不同服務。

1)類似於網域名稱與ip之間對應關係,ip不容易記住,而網域名稱容易記住。

2)通過名稱來獲取資源或服務的位址,提供者等資訊。

2、按照層次結構組織服務/應用名稱。

1)可將服務名稱以及位址資訊寫到zookeeper上,客戶端通過zookeeper獲取可用服務列表類。

配置管理結構圖如下所示。

1、分布式環境下,配置檔案管理和同步是乙個常見問題。

1)乙個集群中,所有節點的配置資訊是一致的,比如 hadoop 集群。

2)對配置檔案修改後,希望能夠快速同步到各個節點上。

2、配置管理可交由zookeeper實現。 

1)可將配置資訊寫入zookeeper上的乙個znode。

2)各個節點監聽這個znode。

3)一旦znode中的資料被修改,zookeeper將通知各個節點。

1、分布式環境中,實時掌握每個節點的狀態是必要的。

1)可根據節點實時狀態做出一些調整。

2、可交由zookeeper實現。

1)可將節點資訊寫入zookeeper上的乙個znode。

2)監聽這個znode可獲取它的實時狀態變化。

3、典型應用

1)hbase中master狀態監控與選舉。

1、分布式環境中,經常存在乙個服務需要知道它所管理的子服務的狀態。

1)namenode需知道各個datanode的狀態。

2)jobtracker需知道各個tasktracker的狀態。

2、心跳檢測機制可通過zookeeper來實現。

3、資訊推送可由zookeeper來實現,zookeeper相當於乙個發布/訂閱系統。

處於不同節點上不同的服務,它們可能需要順序的訪問一些資源,這裡需要一把分布式的鎖。分布式鎖具有以下特性:

1、zookeeper是強一致的。比如各個節點上執行乙個zookeeper客戶端,它們同時建立相同的znode,但是只有乙個客戶端建立成功。

2、實現鎖的獨占性。建立znode成功的那個客戶端才能得到鎖,其它客戶端只能等待。當前客戶端用完這個鎖後,會刪除這個znode,其它客戶端再嘗試建立znode,獲取分布式鎖。

3、控制鎖的時序。各個客戶端在某個znode下建立臨時znode,這個型別必須為createmode.ephemeral_sequential,這樣該znode可掌握全域性訪問時序。

分布式佇列分為兩種:

1、當乙個佇列的成員都聚齊時,這個佇列才可用,否則一直等待所有成員到達,這種是同步佇列。

1)乙個job由多個task組成,只有所有任務完成後,job才執行完成。

2)可為job建立乙個/job目錄,然後在該目錄下,為每個完成的task建立乙個臨時的znode,一旦臨時節點數目達到task總數,則表明job執行完成。

2、佇列按照fifo方式進行入隊和出隊操作,例如實現生產者和消費者模型。

1.上傳zookeeper安裝包

2.解壓 

tar -zxvf zookeeper-3.4.5.tar.gz -c /zookeeper/ 

3.配置(先在一台節點上配置) 

3.1新增乙個zoo.cfg配置檔案 

在解壓目錄 /zookeeper/zookeeper-3.4.5/conf 下將zoo_sample.cfg重新命名為zoo.cfg 

mv zoo_sample.cfg zoo.cfg

3.2修改配置檔案(zoo.cfg) 

datadir=/zookeeper/zookeeper-3.4.5/data

server.1=cs0:2888:3888

server.2=cs1:2888:3888

server.3=cs2:2888:3888

3.3在(datadir=/zookeeper/zookeeper-3.4.5/data)建立乙個myid檔案,裡面內容是server.n中的n(server.2裡面內容為2) 

echo 「1」 > myid

3.4將配置好的zk拷貝到其他節點

scp -r /zookeeper/zookeeper-3.4.5/  cs1:/

scp -r /zookeeper/zookeeper-3.4.5/  cs2:/

3.5注意:在其他節點上一定要修改myid的內容

在cs1應該講myid的內容改為2 (echo 「2」 > myid) 

在cs2應該講myid的內容改為3 (echo 「3」 > myid)

4.在解壓目錄下啟動集群 

分別啟動zk 

bin/zkserver.sh start

檢視znode的狀態 

bin/zkserver.sh status

深入理解JPA JPA基本註解

對沒有任何標註的get xx 方法,預設為 basic。1.length 2.nullable 使用 transient代替預設的 basic。使用 temporal temporaltype.timestamp 對應的是datatime型別 使用。temporal temporaltype.dat...

深入理解JPA JPA基本註解

對沒有任何標註的get xx 方法,預設為 basic。1.length 2.nullable 使用 transient代替預設的 basic。使用 temporal temporaltype.timestamp 對應的是datatime型別 使用。temporal temporaltype.dat...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...