1、zab協(xié)議
分布式一致性協(xié)議包括proxy,但是 ZooKeeper并沒有完全采用Paxos算法,而是使用了一種稱為ZooKeeper Atomic Broadcast(ZAB,zookeeper原子消息廣播協(xié)議)的協(xié)議作為其數(shù)據(jù)一致性的核心算法。
ZAB協(xié)議是為分布式協(xié)調(diào)服務ZooKeeper專門設(shè)計的一種支持漰潰恢復的原子廣播協(xié)議。
所有事務請求必須由一個全局唯一的服務器來協(xié)調(diào)處理,這樣的服務器稱為Leader服務器,而余下的其他服務器則成為Follower服務器。Leader服務器負責將一個客戶端事務請求轉(zhuǎn)換成一個事務Proposal(提議),并將該Proposal分發(fā)給集群中所有的Follower服務器。之后Leader服務器需要等待所有Follower服務器的反饋,一旦超過半數(shù)的Follower服務器進行了正確反饋后,那么Leader就會再次向所有的Follower服務器分發(fā)Commit消息,要求其將前一個Proposal進行提交。
1、簡述ZAB協(xié)議
zab協(xié)議是一種支持崩潰恢復的原子廣播協(xié)議,他能夠保證集群中各個副本數(shù)據(jù)的一致,支持全局唯一的變更序列,支持崩潰恢復。
2、zab如何做個各個副本數(shù)據(jù)的一致?
在zab中只有l(wèi)eader可以處理事務請求,把數(shù)據(jù)變更的操作以事務proposal的形式廣播給集群中所有的節(jié)點,然后等待反饋,如果超過半數(shù)節(jié)點都通過,再次發(fā)送commit請求完成數(shù)據(jù)變更。
3、zab如何保證數(shù)據(jù)變更的全局順序?
通過zxid來保證,zxid是一個64位的數(shù)字,前32位是一個epoch編號,每次領(lǐng)導選舉之后就會加1,后32位是一個自增的序列,每個事務請求自動加1,并且leader會為所有的follwer維護一個發(fā)送隊列,將發(fā)送的proposal按照先后順序存入隊列中依次發(fā)送。
4、zab如何支持崩潰恢復?
集群中所有的服務器都以長連接的形式保持通信,如果集群中超過一半以上的follwer無法連接到leader,就會自動進入領(lǐng)導選舉,進而選舉出新的leader
5、zab的工作模式簡介
zab有兩種工作模式,一種是恢復模式,一種是廣播模式?;謴湍J较逻M行領(lǐng)導選舉,廣播模式處理事務請求。
6、簡述領(lǐng)導選舉過程
首先服務器將自身狀態(tài)轉(zhuǎn)換為looking,并向集群中所有的服務器發(fā)起投票(myid,zxid)
接收其他服務器發(fā)送的投票,并進行處理,按照zxid最大的作為leader,如果相同按照myid最大的作為leader,更新投票信息,再次向集群發(fā)送投票
統(tǒng)計投票結(jié)果,超過半數(shù)以上的投票即為leader
如果leader是自己,就把自己的狀態(tài)變更為leading,否則變?yōu)閒ollwing
7、簡述事務請求的過程
只有l(wèi)eader可以處理事務請求,follwer接收到事務請求后要轉(zhuǎn)發(fā)給leader
leader以proposal的形式發(fā)送給所有的follwer,等待響應
follwer接收到請求后首先記錄事務日志,然后返回響應
如果超過半數(shù)以上的follwer都返回正確的響應,再次向所有follwer發(fā)送commit請求
follwer開始變更內(nèi)存數(shù)據(jù)庫
最后響應客戶端
8、watcher機制簡介
客戶端使用watchmanager來存儲注冊節(jié)點和watcher對象的映射
客戶端向服務端發(fā)送注冊路徑和狀態(tài)信息,服務端會把路徑和當前的連接servercnxn存儲在內(nèi)部的watchmanager中
一旦節(jié)點數(shù)據(jù)有變化就從watchmanager中查出servercnxn,并回調(diào)process
回調(diào)客戶端,客戶端從watchmanager中取出watcher,執(zhí)行回調(diào)邏輯
9、zookeeper是如何保證原子更新的?
采用樂觀鎖,類似JDK中的cas操作,讀取數(shù)據(jù),校驗,提交,使用version來校驗數(shù)據(jù)從讀取后有沒有發(fā)送變化
10、sessionId是如何生成的,如何保證其全局唯一?
sessionId是64位的數(shù)字,前8位是myid,后56位是當前的時間戳
11、簡述zookeeper會話管理
zk使用會話管理器sessiontracker來管理session。sessiontracker使用分桶策略來管理session,客戶端創(chuàng)建或刷新session的時候會按超時時間來把session放到不同的桶里。后臺有一個專門線程負責來在固定的時間點定時檢查session,如果session在超時時間范圍內(nèi)已經(jīng)刷新,就會被重新放到新的桶里,如果沒有刷新就會被清理掉。
12、簡述zk的數(shù)據(jù)存儲
zk事務日志
zk dump,定期dump,可以配置日志記錄數(shù)量超過多少次之后就可以把內(nèi)存中的數(shù)據(jù)dump到快照文件中去。