目錄
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判斷确實大于半數的節點資料寫入成功,則給用戶端響應.