ZooKeeper架構篇 - 認識ZooKeeper


一、什麼是ZooKeeper?

ZooKeeper是一個開源的致力於分佈式協調服務的服務器。

Apache ZooKeeper is an effort to develop and maintain an open-source server which enables highly reliable distributed coordination.

ZooKeeper爲分佈式應用提供了配置信息管理、命名服務、分佈式鎖等基礎服務。在解決分佈式數據一致性方面,並沒有直接採用Paxos算法,而是採用ZAB(ZooKeeper Atomic Broadcast)的分佈式數據一致性協議。

ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them, which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.


二、 一致性保證

ZooKeeper可以保證如下的分佈式一致性特性。

  • 順序一致性。一個客戶端發起的事務請求,按照發送的順序應用到ZooKeeper中。
  • 原子性。事務請求在整個集羣的應用情況都是相同的,要麼成功應用,要麼沒有應用。
  • 單一系統視圖。無論客戶端連接的是哪個ZooKeeper服務器,其看到的服務端數據模型都是相同的。
  • 可靠性。一旦服務端成功應用了一個事務,並且完成了對客戶端的響應。那麼該事務所引起的服務器狀態變更將會一直保留下來。
  • 實時性。保證在某一個時間段範圍內,客戶端能夠從服務端讀取最新的數據。
    在這裏插入圖片描述

三、 數據模型

ZooKeeper使用ZNode結構存儲數據。

ZNode是ZooKeeper數據的最小單元,大小應該小於1MB。除了可以存儲數據,還可以掛載子節點。

多個數據節點按照層次化結構進行組織,形成了樹。

The ZooKeeper client and the server implementations have sanity checks to ensure that znodes have less than 1M of data, but the data should be much less than that on average.

在這裏插入圖片描述


節點特性

節點類型有:持久節點、臨時節點、順序節點、容器節點(3.5.3版本)、TTL節點(3.5.3版本)五種類型。

  • 持久節點:節點被創建之後,一直存儲在ZooKeeper服務器上。
  • 臨時節點:生命週期與客戶端會話綁定在一起。如果客戶端會話失效,而非TCP連接斷開,該節點會被自動清理。臨時節點不允許有子節點。
  • 順序節點:具有順序性。會在節點路徑的末尾添加10位單調遞增的數字。數字對於父節點來說是唯一的。
  • 容器節點:當容器中的所有子節點被刪除後,該容器會在將來的某一時刻被刪除。
  • TTL節點:對於持久節點、持久順序節點,在指定時間內沒有被修改並且沒有子節點,該節點會在將來的某一時刻被刪除。

五種類型的節點可以組合成多種類型的節點。

  • PERSISTENT
  • PERSISTENT_SEQUENTIAL
  • EPHEMERAL
  • EPHEMERAL_SEQUENTIAL
  • CONTAINER
  • PERSISTENT_WITH_TTL
  • PERSISTENT_SEQUENTIAL_WITH_TTL

狀態信息

每個數據節點除了存儲數據內容之外,還會存儲節點本身的狀態信息。

可以通過get或者stat命令獲取節點的狀態信息。(get命令額外輸出節點的內容)

stat命令
get命令

  • czxid:節點被創建時的事務ID
  • mzxid:節點最近一次被修改時的事務ID
  • ctime:節點被創建的時間
  • mtime:節點最近一次被修改的時間
  • pzxid:子節點列表最近一次被修改時的事務ID
  • cversion:子節點的版本號
  • dataVersion:當前數據節點的版本號
  • aclVersion:當前節點的acl版本號
  • ephemeralOwner:創建臨時節點的session id。如果是非臨時節點,值爲0
  • dataLength:數據內容的長度
  • numChildren:子節點的個數

四、服務器角色

服務器角色分爲:Leader、Follower、Observer。

  • Leader

    事務請求的唯一調度者和處理者。保證集羣事務處理的順序性。
    集羣內部各服務器的調度者。

  • Follower

    處理客戶端的非事務請求,轉發事務請求給Leader。
    參與事務請求Proposal的投票。
    參與Leader選舉投票。

  • Observer

    處理客戶端的非事務請求,轉發事務請求給Leader。