大資料生態之zookeeper(原理)
1. 叢集的角色描述:
角色 |
描述 |
領導者(leader) |
領導者負責進行公佈決議,主要處理寫請求 |
跟隨者(follower) |
Follower用於接收客戶端請求並向客戶端返回結果(只能處理讀請求,如果接收到寫請求, 將寫請求轉發給leader),當leader宕機時,發起選主,有投票和被投票權 |
觀察者(observer) |
Observer可以接收客戶端連線,將寫請求轉發給leader節點,幫助follower減輕讀的壓力。 但Observer不參加選舉和被選舉。Observer的目錄是為了擴充套件系統,提高讀取速度 |
客戶端 |
請求發起方 |
2. zookeeper的選主過程
(1)全新叢集的選主:
根據啟動的順序和id進行選主(過半機制:叢集中超過半數的叢集可使用時,才開始選主)
以hadoop01(id=1)—hadoop02(id=2)---hadoop03(id=3)----hadoop04(id=r)----hadoop05(id=5)為例:
當hadoop01啟動時,此時只有它一臺伺服器,,他發出取的報告沒有任何相應,所有它的選舉一直是looking狀態。
Hadoop02啟動:它與最開始啟動的hadoop01進行通訊,相互交換自己的選舉結果,由於兩者都沒有歷史資料,所以id值較大的伺服器勝出,但是由於沒有達到超過半數以上的伺服器同意選舉它(這個例子中的半數以上是 3),所有hadoop01、hadoop02還是繼續保持looking狀態。
Hadoop03啟動,根據前面的分析,伺服器 3 成為伺服器 1,2,3 中的老大,而與上面不 同的是,此時有三臺伺服器(超過半數)選舉了它,所Hadoop03它成為了這次選舉的 leader
服hadoop04啟動,根據上面的分析,理論上,hadoop04應該是伺服器中id最大的,但是由前面已近有超過半數的伺服器選舉了hadoop03,所以hadoop04只能是follower
Hadoop05啟動,與hadoop04一樣,也是follower
zookeeper server的三種工作狀態:
LOOKING:當前 Server 不知道 leader 是誰,正在搜尋,正在選舉
LEADING:當前 Server 即為選舉出來的 leader,負責協調事務
FOLLOWING:leader 已經選舉出來,當前 Server 與之同步,服從 leader 的命令
(2)非全新叢集的選主
leader 已經選舉出來,當前 Server 與之同步,服從 leader 的命令,但是由於某種原因主節點宕機:
此時我們根據三個維度來選主:資料version、serverid、邏輯時鐘。
資料version:資料新的version就大,資料每次更新,同時會更新它的version
Serverid:就是我們配置的 myid 中的值,每個機器一個
邏輯時鐘:這個值從0開始,每一次選舉對應一個值,也就是說,如果在同一次選舉中,這個值應該一致,邏輯時鐘越大,說明這一次選舉leader人的程序更新,也就是每次選舉擁有一個 zxid,投票結果只取 zxid 最新的
選舉的標準:
邏輯時鐘小的選舉結果被忽略,重新投票
統一邏輯時鐘後資料version大的勝出
邏輯時鐘統一,version也相同,,server id 大的勝出。
根據以上的規則,快速選出叢集的主節點。
3. zookeeper寫資料的流程:
客戶端傳送寫入資料的請求,這個請求最終會被leader處理
leader會先寫入資料,寫入完成之後通知follower進行資料的同步
follower就會開始進行資料的同步(並行,多臺follower並行同步)
每一個follower只要資料同步完成就會向leader傳送資料同步成功資訊
leader接收到超過半數以上的成功資訊後,則認為這次寫資料成功
其他節點慢慢進行同步,在資料同步的過程中,不對外提供讀寫服務
4. zookeeper的資料的同步過程
follower連線leader併發送自己最大的zixd
leader進行對比,將自己最大的zxid和follower傳送過來的zxid進行對比,如果leader的zxid大於follower的,則通知follower進行資料同步
follower傳送資料同步請求
leader確定當前的follower的資料同步點(從follower最大的zxid到leader最大的zxid之間資料需要同步)
follower開始同步資料,這個過程不對外提供讀寫服務。
follower同步完成,傳送訊息給leader
leader就會修改當前的follower的狀態為update,這個時候follower就可以接受客戶端的讀寫請求,但是隻能讀,如果是寫入請求,需要轉發給leader
5. ZooKeeper 中各個角色的工作職責
(1)Leader
恢復資料
維持與follower的心跳,接收follower請求並判斷follower的請求訊息型別
根據不同的訊息型別,進行不同的處理
(2)follower
向leader傳送請求(同步資料,寫入請求)
接收leader的訊息並進行相應的處理
接收client的讀寫請求,如果是寫入的請求轉發給leader處理
返回client的讀請求,查詢的結果