-
事務請求的唯一排程和處理者,保證叢集事務處理的順序性。
-
叢集內部各伺服器的排程者。
-
處理客戶端非事務請求,轉發事務請求給 Leader 伺服器。
-
參與事務請求 Proposal 的投票。
-
參與 Leader 選舉投票。
-
在 Client 向 Follower 發出一個寫請求。
-
Follower 把請求轉發給 Leader。
-
Leader 接收到以後開始發起投票並通知 Follower 進行投票。
-
Follower 把投票結果傳送給 Leader。
-
Leader 將結果彙總後,如果需要寫入,則開始寫入,同時把寫入操作通知給 Follower,然後 commit。
-
Follower 把請求結果傳回給 Client。
-
順序一致性,來自任意特定客戶端的更新都會按其傳送順序被提交。也就是說,如果一個客戶端將 Znode z 的值更新為 a,在之後的操作中,它又將 z 的值更新為 b,則沒有客戶端能夠在看到z的值是b之後再看到值 a(如果沒有其他對z的更新)。
-
原子性,每個更新要麼成功,要麼失敗。這意味著如果一個更新失敗,則不會有客戶端會看到這個更新的結果。
-
單一系統映像,一個客戶端無論連線到哪一臺伺服器,它看到的都是同樣的系統檢視。這意味著,如果一個客戶端在同一個會話中連線到一臺新的伺服器,它所看到的系統狀態不會比 在之前伺服器上所看到的更老。當一臺伺服器出現故障,導致它的一個客戶端需要嘗試連線集合體中其他的伺服器時,所有滯後於故障伺服器的伺服器都不會接受該 連線請求,除非這些伺服器趕上故障伺服器。
-
永續性,一個更新一旦成功,其結果就會持久存在並且不會被撤銷。這表明更新不會受到伺服器故障的影響。
-
ServerCnxnFactory,ZooKeeper服務端網路連線工廠。在早期版本中,ZooKeeper 都是自己實現 NIO 框架,從 3.4.0 版本開始,引入了 Netty。可以透過 zookeeper.serverCnxnFactory 來指定使用具體的實現。
-
SessionTracker,ZooKeeper 服務端會話管理器。建立時,會初始化 expirationInterval、nextExpirationTime、sessionsWithTimeout(用於儲存每個會話的超時時間),同時還會計算出一個初始化的sessionID。
-
RequestProcessor,ZooKeeper的請求處理方式是典型的責任鏈樣式,在服務端,會有多個請求處理器依次來處理一個客戶的請求。在伺服器啟動的時候,會將這些請求處理器串聯起來形成一個請求處理鏈。基本的請求處理鏈如下:
-
LearnerCnxAcceptor,Learner伺服器(等於 Follower 伺服器)連線請求接收器。負責 Leader 伺服器和 Follower 伺服器保持連線,以確定叢集機器存活情況,並處理連線請求。
-
LearnerHandler,Leader 接收來自其他機器的連線建立請求後,會建立一個 LearnerHandler 實體。每個 LearnerHandler 實體都對應了一個 Leader 和 Learner 伺服器之間的連線,其負責 Leader 和 Learner 伺服器之間幾乎所有的訊息通訊和資料同步。
-
ZKDatabase,ZooKeeper 記憶體資料庫,負責管理 ZooKeeper 的所有會話記錄以及 DataTree 和事務日誌的儲存。
-
FileTxnSnapLog,ZooKeeper 上層服務和底層資料儲存之間的對接層,提供了一系列的運算元據檔案的介面,包括事務檔案和快照資料檔案。ZooKeeper 根據 zoo.cfg 檔案中解析出的快照資料目錄 dataDir 和事務日誌目錄 dataLogDir 來建立 FileTxnSnapLog。
-
LeaderElection,ZooKeeper 會根據 zoo.cfg 中的配置,建立相應的 Leader 選舉演演算法實現。在 ZooKeeper 中,預設提供了三種 Leader 選舉演演算法的實現,分別是 LeaderElection、AuthFastLeaderElection、FastLeaderElection,可以透過配置檔案中 electionAlg 屬性來指定,分別用 0 ~ 3 來表示。從 3.4.0 版本開始,ZooKeeper 廢棄了前兩種演演算法,只支援 FastLeaderEletion 選舉演演算法。