天天看點

ZooKeeper 到底解決了什麼問題?

目标

ZooKeeper 很流行,有個基本的疑問:

ZooKeeper 是用來做什麼的?

之前沒有ZK,為什麼會誕生 ZK?

OK,解答一下上面的疑問:(下面是憑直覺說的)

ZooKeeper 是用于簡化分布式應用開發的,對開發者屏蔽一些分布式應用開發過程中的底層細節

ZooKeeper 對外暴露簡單的 API,用于支援分布式應用開發

ZooKeeper 在提供上述功能的同時,其還是一個 高性能、高可用、高可靠的分布式叢集

上面說這麼多,總結一下,ZK 能解決分布式應用開發的問題,ZK 能很好的解決問題。 到這一步,疑問就更多了:

分布式應用開發,有哪些常見問題?ZK 是如何屏蔽這些底層細節的?

ZooKeeper 對外暴露了那些 API?這些 API 如何支援分布式應用開發的?這些 API 還能簡化嗎?API 的語義性怎麼樣?

ZooKeeper 自身是一個高性能、高可用、高可靠的分布式叢集,那有個簡單的問題:

高性能是指什麼?ZooKeeper 為了達到高性能,做了哪些工作?

高可用同上

高可靠同上

Note:本篇 wiki 就是為了解決上述第一個疑問的。(其他疑問會在其他 blog 中逐漸解答)

為什麼有 ZooKeeper

一個應用程式,涉及多個程序協作時,業務邏輯代碼中混雜有大量複雜的程序協作邏輯。

ZooKeeper 到底解決了什麼問題?

上述多程序協作邏輯,有 2 個特點:

處理複雜

處理邏輯可重用

是以,考慮将多程序協作的共性問題拎出,作為基礎設施,讓 RD 更加專注業務邏輯開發,即:

ZooKeeper 到底解決了什麼問題?

ZooKeeper 就是上述多程序協作基礎服務的一種。

ZooKeeper 的特點

ZooKeeper 有幾個簡單特點:

ZooKeeper 的 API:從 檔案系統 API 得到的啟發,提供簡單的 API

ZooKeeper 運作在專用伺服器上,跟業務邏輯分離,保證了高容錯性和可擴充性

ZooKeeper 是存儲設施,但特别注意

ZK上存儲的資料聚焦為:協作資料(中繼資料),而不是應用資料,應用資料有自己的存儲方案,例如 HDFS 等

ZK 本質上,可以看作一種特殊的 FS

特别說明:

應用資料和中繼資料,由于使用場景不同,對一緻性和持久性的要求有差異, 是以,架構設計、資料治理過程中,應将 2 類資料獨立看待、獨立存儲。

ZooKeeper 的使命

ZK 要解決的核心問題:

ZK 目标:簡化分布式應用開發中,多程序協作問題。為分布式應用,提供高效、可靠的分布式協調服務(基礎服務),例如:

統一的命名服務

分布式鎖

程序崩潰檢測

Leader 選舉

配置管理:配置變更時,及時下發到各個 Client。

一個簡單的問題:多程序的協作是什麼?尼瑪呀,有完沒完,啥問題你都有,面對這個掉咋天的腦殼,還是回答一下。

多程序協作,整體分為 2 類:

協作:多程序需要一同處理某些事情,一些程序采取行動是的其他程序能夠正常工作,例如:主從結構,M 向 S 配置設定任務,S 才會執行,否則 S 就保持空閑狀态

競争:兩個程序不能同時工作,一個程序必須等待另個程序執行完畢,例如:主從結構,M 節點失效後,很多 S 都想成為 M,這時,就需要互斥鎖,隻有第一個獲得鎖的 S 成為 M

不跨網絡協作:多程序,可以在同一台實體主機上,同步原語很友善(比如?管道、共享記憶體、消息隊列、信号量)

跨網絡協作:多程序,分布在不同的實體主機上,ZK 關注這一類

跨網絡多程序協作,程序通信,基本思路有 2 個:

消息機制:通過網絡,直接資訊交換,多消息傳遞算法,實作同步原語

共享存儲:利用外部共享存儲,實作多程序協作,要求共享存儲提供有序通路,ZK 采用這種方式

真實系統中,跨網絡通信,有幾個共性問題:

消息延遲:由于網絡原因,後發送先到達

處理器性能:由于系統排程原因,消息到達後,延遲處理

時鐘偏移:不同實體主機,時鐘發生偏移

ZK 精心設計用于屏蔽上述 3 個共性問題,使得這些問題在應用服務層面完全透明化。

ZooKeeper 特性

ZooKeeper 解決的本質問題

分布式系統的一緻性問題:

消息傳遞:延遲性,先發送的消息,不一定先到達;

消息傳遞:丢失性,發送的消息,可能丢失;

節點崩潰:分布式系統内,任何一個節點都可能崩潰;

在這種情況下,如何保證資料的一緻性?

提案投票:基于投票政策,2PC

選舉投票:基于投票政策,投出優先級最高的節點(包含最新資料的節點)

Paxos 目标:解決分布式一緻性問題,提高分布式系統容錯性的一緻性算法。

Paxos 本質:基于消息傳遞的高度容錯的一緻性算法

ZooKeeper 定位

ZooKeeper 是:

分布式協調服務

高效、可靠

友善應用程式,聚焦業務邏輯開發,而不需要過多關注分布式程序間協作細節

ZooKeeper 不直接暴露原語,而是,暴露一部分調用方法組成的 API,類似檔案系統的 API,支援應用程式實作自己的原語。

ZooKeeper 可以保證如下分布式一緻性特性:

順序一緻性:同一個 Client 發起的事務請求,嚴格按照發起順序執行

原子性:事務請求,要麼應用到所有節點,要麼一個節點都沒有應用

單一視圖:Client 無論連接配接到哪個節點,看到的服務端資料都是一緻的(Note:不準确,其實是最終一緻性)

可靠性:事務一旦執行成功,狀态永久保留

實時性:事務一旦執行成功,Client 并不能立即看到最新資料,但 ZooKeeper 保證最終一緻性

ZooKeeper 設計目标

ZooKeeper 緻力于提供高性能、高可用、順序一緻性的分布式協調服務,保證資料最終一緻性。

目标一:高性能(簡單的資料模型)

采用樹形結構組織資料節點;

全量資料節點,都存儲在記憶體中;

Follower 和 Observer 直接處理非事務請求;

目标二:高可用(建構叢集)

半數以上機器存活,服務就能正常運作

自動進行 Leader 選舉

目标三:順序一緻性(事務操作的順序)

每個事務請求,都會轉發給 Leader 處理

每個事務,會配置設定全局唯一的遞增id(zxid,64位:epoch + 自增 id)

目标四:最終一緻性

通過提議投票方式,保證事務送出的可靠性

提議投票方式,隻能保證 Client 收到事務送出成功後,半數以上節點能夠看到最新資料

ZooKeeper 出現之前

ZK 出現之前,分布式系統常用兩種方式,實作多程序協作:

分布式鎖管理器

分布式資料庫

ZK 更專注于程序協作,而不提供任何鎖接口和通用的存儲資料接口。(疑問:ZK 也可以提供啊,我們不使用就行了)

應用伺服器,常見的 2 種需求:

Master-Slave Leader 選舉:要求提供Master節點選舉功能

程序響應跟蹤 崩潰檢測:要求提供程序存活狀态的跟蹤

分布式鎖:互斥排它鎖

ZK 為上述 2 種政策提供了基礎 API。

ZooKeeper 不适用的場景:

海量資料存儲:ZK 本質是特殊的 FS,但 ZK 用于存儲中繼資料,需要單獨存儲應用資料

術語介紹

ZooKeeper 到底解決了什麼問題?

繼續閱讀