zookeeper 學習,詳細瞭解

ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。

順序一致性:客戶端的更新將按順序應用(主節點負責寫)

原子性:更新要麼成功要麼失敗

單個系統映像:無論客戶端連接到哪個服務器,客戶端都將看到相同的服務視圖。也就是說,即使客戶端故障轉移到具有相同會話的其他服務器,客戶端也永遠不會看到系統的較舊視圖

可靠性:應用更新後,此更新將一直持續到客戶端覆蓋更新爲止。

及時性:確保系統的客戶視圖在特定時間範圍內是最新的。

 

zookeeper 使用的是最終一致性。作爲協議協議的一部分,來自客戶端的所有寫請求都轉發到稱爲領導者的單個服務器。

zk的數據存在內存,用磁盤來保存日誌。

角色:

leader:主節點,負責數據的寫入

follower:從節點,負責數據的讀取

observer:功能一就如同他的名字,只是一個觀察者,對leader和follower的工作進行觀察監聽。
  功能二就是動態擴展zookeeper集羣,而又不影響集羣的性能,接收客戶端連接,執行leader更新系統狀態的命令,不影響集羣的性能是因爲觀察者節點不參與投票,即使是觀察者節點宕機了,對集羣的運行狀態沒有影響。
 

只有follower 才能選舉。follower越少選舉速度越快。其餘的爲observer即可,放大查詢能力。

 

zookeeper 需要啓動前在配置文件中配置好有那些節點,以及端口。例如 server.1=zoo1:2888:3888  3888 是用來節點間傳遞消息的。過半選舉推薦機制。 server.後面的值越大越容易選舉爲主節點。

zookeeper目錄節點分類:

臨時節點 和 永久節點

臨時節點:zookeeper有一個session的概念,當session斷開,創建的臨時節點對應消失。

永久節點:一直存在,相當於持久化。

        Persistent是臨時節點、

   Persistent_sequential是臨時有序節點。如00000、000001.....

   Ephemeral是永久節點、

   Ephemeral_sequential是永久有序節點

CreateMode.PERSISTENT_SEQUENTIAL   對應命令  create -s -e /path
CreateMode.PERSISTENT 對應命令 create -e /path
CreateMode.Ephemeral 對應命令 create /path
CreateMode.Ephemeral_sequential 對應命令 create -s /path

-s 即代表序列的意思。臨時節點不能有子節點

 

簡單的API

ZooKeeper的設計目標之一是提供一個非常簡單的編程界面。因此,它僅支持以下操作:

  • create:在樹中的某個位置創建一個節點

  • delete:刪除節點

  • 存在:測試某個位置是否存在節點

  • 獲取數據:從節點讀取數據

  • 設置數據:將數據寫入節點

  • 獲取子節點:獲取節點子節點的列表

  • sync:等待數據傳播

使用命令:get /目錄信息

cZxid=0x200000002   創建事務ID

mZxid=0x200000004  修改事務ID

pZxid=0x200000002   當前節點最後創建事務的ID(屬於自己的事務ID)

ephemeralOwner=64325234  當前節點歸屬的session ID

cZxid  是一個64位的數字,高32位代表leader節點id,當新的leader產生則會發生變化,低32位用來遞增。

 

當A連上1,產生一個sessionId,當1掛掉了,A去連接 2 。此時,2也會認A的這個sessionId。因爲zookeeper每個節點間的數據長得都是一樣的,會進行同步。包括A在1上面產生的數據。

當第一個客戶端創建一個目錄數據得到  cZxid = 0x800000a22

第二個客戶端連接並創建目錄數據得到 cZxid = 0x800000a24

新客戶端進行連接的時候會消耗掉一個 cZxid ,即 0x800000a23 被消耗掉了。

無論客戶端連入還是刪除節點等都會消耗一個事務ID

 

zookeeper選舉

每個節點有自己的mid,不同的zxid。

當leader掛掉後,zxid(事務ID)最新的可以獲得投票,當投票數過半可以獲得選舉。如果很多個zxid都相同,則mid最大的被選爲leader。

當選出leader後, czxid 、mxid、pzxid 的 高32位都會在上一個leader 事務ID 的基礎上+1,後續節點的操作ID會從當前leader 對應的 czxid 高32位 重新開始遞增。在這個leader之前的節點信息的事務ID保持不變,除非發生更改。

ZAB協議

一、消息廣播:過半通過

leader將客戶端的請求記錄爲一個 Proposal 提議,併爲每個follower 準備了一個fifo隊列,隊列裏面放的就是  Proposal ,所以多個 Proposal 都是順序性的。然後每個fifo 隊列裏的消息會廣播到對應的 follower去,並對  Proposal 做出 ack 反饋。當leader 收到半數(包括自己)的 ack 後,這個  Proposal 則通過了,及時其餘的follwer沒有反饋。leader 開始對所有的follower 進行通知 commit 寫入。

二、崩潰恢復:數據最全的做主

當leader進行通知的時候,如果leader掛了怎麼辦呢?

當leader掛了,follower 開始進行選舉。A 、B、C 開始拿出自己的 ZXID 選舉,ZID最大的那一個選舉成功。如果最後發現都一樣,就拿出各自的 id 選舉,最大的那一臺當選。

爲什麼ZXID最大的選舉可以成功?

ZXID 和 Proposal 掛鉤,最大的說明數據最全。ZXID是過半通過之後才代表成功寫入的,即大家都贊同的,就是說最大的ZXID是半數以上的 follower 都有的。

 

https://baijiahao.baidu.com/s?id=1666465070459184658&wfr=spider&for=pc

 

zookeeper多節點配置

修改zoo.cnf

server.1=127.0.0.1:2888:3888

server.2=127.0.0.2:2888:3888

server.3=127.0.0.3:2888:3888

server.4=127.0.0.4:2888:3888

  1. 2888  -- leader與follower 之間的通信
  2. 3888 -- leader掛掉時節點間的通信。
  3. 2181: 對外提供服務的端口

本機多臺的話配置:

server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

 

 

mq 對比

https://blog.csdn.net/liuzhixiong_521/article/details/84849184

rabbitmq 支持exchange(交換器)功能

https://www.cnblogs.com/sgh1023/p/11217017.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章