ZooKeeper 集群的數(shù)據(jù)同步
1. 前言
在 Zookeeper 的集群模式一節(jié)中,我們學習過了 Zookeeper 的每個 Follower 節(jié)點都可以對外提供服務(wù),而且為了保證整個 Zookeeper 集群的數(shù)據(jù)一致,Zookeeper 集群的服務(wù)之間還會進行數(shù)據(jù)同步。那么這個數(shù)據(jù)同步的過程是如何實現(xiàn)的呢?接下來我們就對 Zookeeper 集群的數(shù)據(jù)同步機制進行詳細的講解。
2. ZAB 的消息廣播模式
Zookeeper 為了保證 Zookeeper 集群的數(shù)據(jù)一致性,使用了 ZAB 協(xié)議,在正常工作模式下,ZAB 協(xié)議會使用消息廣播模式來讓 Leader 來對事務(wù)性消息進行廣播,而且只能有一個 Leader 進行廣播。接下來我們就來講解這個消息廣播模式是如何工作的。
2.1 消息廣播的數(shù)據(jù)同步
在我們使用 Zookeeper 客戶端向 Zookeeper 集群的某一個 Follower 發(fā)送事務(wù)請求時,也就是對 Znode 節(jié)點的增刪改操作時,這個Follower 節(jié)點并不會自己去處理這個事務(wù)請求,而是會把這個請求轉(zhuǎn)發(fā)給 Leader 節(jié)點,讓 Leader 節(jié)點來處理事務(wù)請求。
Leader 節(jié)點接收到 Follower 轉(zhuǎn)發(fā)過來的請求,會生成與事務(wù)請求相對應(yīng)的 Proposal 事務(wù)提案,并為這個 Proposal 事務(wù)提案分配全局唯一的單調(diào)遞增的事務(wù)ID,也就是 ZXID,然后把 Proposal 事務(wù)提案發(fā)送到集群中所有的 Follower 節(jié)點。
如果 Leader 節(jié)點接收到了多個 Follower 節(jié)點轉(zhuǎn)發(fā)的請求,Leader 節(jié)點會根據(jù) Proposal 事務(wù)提案的 ZXID 的先后順序來對 Follower 節(jié)點進行廣播。
Follower 節(jié)點接收到 Proposal 事務(wù)提案后,會把接收到的 Proposal 事務(wù)提案以事務(wù)日志的方式寫入本地磁盤中,成功后會向 Leader 節(jié)點返回 Ack 確認信息,確定自己能夠執(zhí)行該事務(wù)。在這一步驟中, Follower 向 Leader 發(fā)送反饋,確認 Follower 節(jié)點能夠執(zhí)行該事務(wù),但不會去提交該事務(wù)請求。
Leader 節(jié)點接收到半數(shù)以上的 Follower 節(jié)點返回的 Ack 確認信息后,就會向所有的 Follower 節(jié)點廣播 Commit 消息,通知 Follower 節(jié)點提交事務(wù)請求,同時 Leader 節(jié)點自己也會提交該事務(wù)請求。接收到 Commit 消息的 Follower 節(jié)點就會開始進行事務(wù)提交。
當 Follower 節(jié)點完成事務(wù)的提交后,Leader 節(jié)點就會把該 Follower 節(jié)點加入可用的 Follower 列表中,該Follower 節(jié)點就可以對外提供服務(wù)了。
除了 Follow 節(jié)點需要進行數(shù)據(jù)同步外,Zookeeper 集群還有一種叫做 Observer 的節(jié)點會進行數(shù)據(jù)同步,那么我們接下來簡單介紹一下 Observer 節(jié)點。
3. Observer
Observer 節(jié)點是 Zookeeper 3.3.0 版本新增的 Zookeeper 集群的角色,Observer 作為觀察者在 Zookeeper 集群中觀察 Zookeeper 集群的最新的數(shù)據(jù)變化,然后從 Leader 節(jié)點獲取最新變化的數(shù)據(jù)并同步到自身,然后再向外提供服務(wù)。
Observer 節(jié)點可以獨立的處理 Zookeeper 客戶端的非事務(wù)請求,也就是查詢請求。如果接收到 Zookeeper 客戶端的事務(wù)請求,Observer 節(jié)點會把請求轉(zhuǎn)發(fā)給 Leader 節(jié)點,但不會接收到 Leader 節(jié)點的 Proposal 事務(wù)提案,避免影響 Zookeeper 集群處理事務(wù)請求的效率。這是 Observer 節(jié)點與 Follower 節(jié)點的區(qū)別之一。
Observer 節(jié)點與 Follower 節(jié)點的區(qū)別之二,Observer 節(jié)點不會參與 Zookeeper 集群的 Leader 選舉,避免太多候選者而降低 Zookeeper 集群選舉 Leader 的效率。
簡單的介紹了 Observer 節(jié)點是什么,以及 Observer 節(jié)點和 Follower 節(jié)點的區(qū)別,接下來我們講解 Observer 節(jié)點是如何實現(xiàn)與 Leader 節(jié)點進行數(shù)據(jù)同步的。
3.1 Observer 的數(shù)據(jù)同步
增加 Observer 節(jié)點的主要作用是用來提高 Zookeeper 集群的非事務(wù)請求的效率,我們可以在 zoo.cfg 配置文件中添加如下配置:
# 聲明此服務(wù)為 Observer 節(jié)點
peerType=observer
在 zoo.cfg 中配置 Zookeeper 服務(wù)列表時需要添加 observer 標識:
# 添加 observer 標識,聲明 server.1 為 Observer 節(jié)點
server.1:192.168.0.77:2181:3181:observer
我們啟動 Zookeeper 服務(wù)時,會加載配置文件的 peerType 屬性來識別該服務(wù)是否為 Observer 節(jié)點,如果是 Observer 節(jié)點,就會使用 ObserverZooKeeperServer 類來實例化該 Observer 節(jié)點。
由于 Observer 節(jié)點不接收 Leader 節(jié)點廣播的 Proposal 事務(wù)提案,也就不能在這一步獲取 Proposal 事務(wù)提案中的事務(wù)請求,那么 Observer 節(jié)點如何獲得事務(wù)請求的信息呢?答案是 Observer 節(jié)點會從 INFORM 消息中獲取已提交的事務(wù)信息。
INFORM 消息是 Leader 節(jié)點在自身的事務(wù)提交成功后向 Observer 節(jié)點發(fā)出的消息,通知 Observer 更新數(shù)據(jù)。Observer 接收到 Leader 節(jié)點發(fā)出的 INFORM 消息后,從 INFORM 消息中獲取 Leader 節(jié)點已經(jīng)提交的事務(wù),就可以對自身的數(shù)據(jù)進行更新了,而且不需要向Leader 節(jié)點發(fā)送反饋信息。
4. 總結(jié)
在本節(jié)內(nèi)容中,我們學習了 Zookeeper ZAB 協(xié)議的消息廣播模式,以及在消息廣播模式中 Zookeeper 集群的各個節(jié)點的數(shù)據(jù)同步過程,還有 Observer 節(jié)點的特點以及 Observer 節(jié)點的數(shù)據(jù)同步。以下是本節(jié)內(nèi)容總結(jié):
- Zookeeper ZAB 協(xié)議的消息廣播模式。
- 消息廣播模式下的數(shù)據(jù)同步過程。
- Observer 節(jié)點的特點。
- Observer 節(jié)點與 Leader 節(jié)點的數(shù)據(jù)同步。