天天看點

Zookeeper實戰記錄(3)-原了解析

目錄

Zookeeper實戰記錄-目錄:https://blog.csdn.net/weixin_39565597/article/details/104401912

1、角色

LEADER:所有節點隻有一個LEADER節點,由LEADER節點協調各FOLLOWER節點,發起投票和決議

FOLLOWER:接受請求,響應結果,參與投票

OBSERVER:接受請求轉發Leader,不參與投票,同步Leader狀态

CLIENT:用戶端

2、選舉機制

Leader和Follower節點是如何來的?

以node1、node2、node3三台伺服器zk叢集為例,myid分别為1,2,3。
當node1啟動時,由配置檔案得出有3台做叢集,但隻有node1線上,故給自己投票,選舉狀态一直是LOOKING。
當node2也啟動時,發現node1線上,此時node2啟動成功,且myid為2,比node1的myid要大,故node2投自己1票,而node1檢測到node2啟動,且myid比自己大,故把自己的票投給node2。此時已經叢集裡存活的節點大于半數,叢集啟動成功。node2為Leader、node1為Follower
當node3也啟動時,雖然myid比node1和node2的大,但是此時已經有Leader節點,故node3為Follower節點

3、節點類型

持久化類型:

1、PERSISTENT-持久化目錄節點

用戶端與zookeeper斷開連接配接後,該節點依舊存在

2、PERSISTENT_SEQUENTIAL-持久化順序編号目錄節點

用戶端與zookeeper斷開連接配接後,該節點依舊存在,隻是Zookeeper給該節點名稱進行順序編号

臨時類型:

3、EPHEMERAL-臨時目錄節點

用戶端與zookeeper斷開連接配接後,該節點被删除

4、EPHEMERAL_SEQUENTIAL-臨時順序編号目錄節點

用戶端與zookeeper斷開連接配接後,該節點被删除,隻是Zookeeper給該節點名稱進行順序編号

4、Stat結構

# zookeeper節點stat資訊
[zk: localhost(CONNECTED) 0] stat /zookeeper
cZxid = 0x0         # 建立節點的事務zxid
ctime = Thu Jan 01 05:30:00 IST 1970 # 被建立的毫秒數(從1970年開始) 
mZxid = 0x0         # 最後更新的事務zxid
mtime = Thu Jan 01 05:30:00 IST 1970  # 最後修改的毫秒數(從1970年開始)
pZxid = 0x0          # 最後更新的子節點zxid
cversion = -1        # 子節點變化号,znode子節點修改次數
dataVersion = 0         # 資料變化号
aclVersion = 0          # 通路控制清單的變化号
ephemeralOwner = 0x0    # 如果是臨時節點,這個是znode擁有者的session id。如果不是臨時節點則是0。
dataLength = 0      # znode的資料長度
numChildren = 1     # znode子節點數量
           

5、監聽器

此處以get方法監聽為例,其它監聽同理。

用戶端1

# 建立節點hello,值為hello1
[zk: localhost(CONNECTED) 0] create /hello 'hello1'
# 擷取節點hello資訊,且監聽該節點
[zk: localhost(CONNECTED) 1] get /hello watch
hello1
cZxid = 0x4
ctime = Tue Feb 18 20:55:36 CST 2020
mZxid = 0x4
mtime = Tue Feb 18 20:55:36 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
           

用戶端2

# 檢視節點hello資訊,與用戶端1顯示一緻
[zk: localhost(CONNECTED) 0] get /hello
hello1
cZxid = 0x4
ctime = Tue Feb 18 20:55:36 CST 2020
mZxid = 0x4
mtime = Tue Feb 18 20:55:36 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
# 設定節點hello新值為hello2後
[zk: localhost(CONNECTED) 1] set /hello 'hello2'
cZxid = 0x4
ctime = Tue Feb 18 20:55:36 CST 2020
mZxid = 0x6
mtime = Tue Feb 18 20:59:52 CST 2020
pZxid = 0x4
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
           

用戶端1

# 用戶端1自動列印監聽資訊(注意該監聽器是一次性的,觸發一次後不再觸發)
[zk: localhost(CONNECTED) 2]
WATCHER::

WatchedEvent state:SyncConnected type:NodeDataChanged path:/hello
           

6、工作流程

叢集節點:node1、node2、node3依次為:從、主、從叢集模式。

1、用戶端 連接配接 node1節點,發送請求至node1.

2、由于node2才是主節點,故node1将請求轉發給node2.

3、node2節點會廣播給各個節點node1、node3.

4、當大于半數的從節點收到leader的廣播,并且寫入資料後,則通知leader。

5、leader判斷确實大于半數的節點資料寫入成功,則給用戶端響應.

繼續閱讀