1. zk主體框架
- leader: 將接收的所有寫請求同步給所有follower,若超過半數(shù)同意則發(fā)送更改;
- follower: 可處理讀請求,將收到的寫請求轉(zhuǎn)發(fā)給leader,若leader掛了則follower可以參與選舉,可處理所有讀請求;
- observer: 可處理讀請求,亦將寫請求轉(zhuǎn)發(fā)給leader;
- myid: 任何類型的node都有myid,是不能重復(fù)的;
- maxid: 每個node都有maxid用于標(biāo)識節(jié)點(diǎn)中最后一個數(shù)據(jù)的編號(大多數(shù)情況下這個值是一致的);
- zxid: 表示數(shù)據(jù)的更新程度,越大越新(類似maxid);
- epoch: 紀(jì)元用于防止腦裂,看誰epoch大誰是最新一輪的選舉結(jié)果;
- sid:類似myid,每臺zk的唯一標(biāo)識符
2. zk選舉機(jī)制
-
首次啟動:假設(shè)共5臺服務(wù)器
- 第1臺啟動后,發(fā)起一次選舉,因?yàn)閱訑?shù)未到一半,故而無法完成選舉,node1保持looking狀態(tài);
- 第2臺啟動,再次發(fā)起選舉,此時node1 & node2分別投給自己,然后各自交換投票信息。node1發(fā)現(xiàn)node2的myid大于自己當(dāng)前投票的node,會將投票改成投給node2,現(xiàn)在node2共計(jì)2票,而node1獲得0票。但由于得票未超半數(shù),兩個node都保持looking狀態(tài);
- 第3臺啟動,重復(fù)上述操作,node3得到3票,成功當(dāng)選leader(leading狀態(tài)),且node1,2,3都不再為looking狀態(tài),變成follower的角色(following狀態(tài)),后續(xù)不再改他們的投票計(jì)劃;
- 第4臺啟動,由于1 2 3都支持node3,所以node4改票為支持node3,所以node4也變?yōu)閒ollower;
- 第5臺和4一樣,最終確認(rèn)3號成為leader。
-
非第一次啟動進(jìn)行新選舉:
- 若cluster中原本的leader存在,有node企圖選舉則會被告知已有l(wèi)eader,讓該node與現(xiàn)leader建立連接同步狀態(tài)即可;
- 若cluster中l(wèi)eader掛掉,則先對比epoch,再對比zxid誰大(類似maxid,看誰的數(shù)據(jù)新),最后對比sid誰大(類似myid)
3. zk在分布式集群中的作用
常見作用:分布式組件間的數(shù)據(jù)通信、集中式的元數(shù)據(jù)管理、服務(wù)發(fā)現(xiàn)/注冊中心、HA自動選主 & 分布式鎖
-
kafka中所用:
- 組件間數(shù)據(jù)通信,保持kafka不同節(jié)點(diǎn)間的通信(例如心跳);
- 元數(shù)據(jù)管理: isr元數(shù)據(jù)更新,確認(rèn)哪些kafka主題分區(qū)及時完成了數(shù)據(jù)同步;
- HA自動選主: kafka集群的controller選舉,通過zk的watcher機(jī)制,其他節(jié)點(diǎn)觀察controller的情況,隨時準(zhǔn)備搶占。