Zookeeper崩潰恢復過程(Leader選舉)


1. 崩潰恢復

	a). leader選擇過程可以保證新leader是ZXID最大的節點
	b). ZAB協議確保丟棄那些只在leader上被提出的事務,場景 leader發出PROPOSAL收到ACK,但是發出COMMIT前產生崩潰,則新的群組會丟棄這條消息

2. Leader選舉過程

2.1 服務器狀態

LOOKING 系統剛啟動或Leader崩潰后選舉狀態,認為當前集群中沒有leader,因此要進入選舉流程
FOLLOWING 跟隨者狀態,角色是Follower
LEADING 領導者狀態,leader
OBSERVING 觀察者狀態(只支持查詢,不參與選舉),Observer

2.2 投票數據結構-Vote

id		被推舉的Leader的SID值
zxid	被推舉的Leader的事務ID
electionEpoch	邏輯時鍾,用來判斷多個投票是否在同一輪選舉周期中。該值在服務端是一個自增序列。
				每次進入新一輪的投票后,都會對該值進行加1操作。
peerEpoch		被推舉的Leader的epoch值
state			當前服務器的狀態

2.3 QuorumCnxManager-Server Socket負責選舉

a). 每台服務器啟動時都會啟動一個QuorumCnxManager--Server Socket,負責服務器之間的Leader選舉過程。
b). 內部維護幾個隊列,每個隊列又是按SID分組的隊列集合
	recvQueue	選票接收隊列
	queueSendMap	待發送的消息,內部按SID為每台機器分配了一個單獨隊列,保證互補影響
	sendWorkerMap	負責消息發送,也按SID進行了分組
	lastMesageSent	最近發送的消息,按SID進行分組
c). 建立連接, 集群中機器需要進行兩兩連接,規則"只允許SID大的機器主動和其它機器進行連接,否則斷開連接"來防止重復連接

d). 當服務器檢測到當前服務器狀態變成LOOKING時,就會觸發leader選舉
	0).如果已存在leader,則發送選票后會被告知leader的信息,直接連接即可,不需要進行后續步驟

	1). 自增選舉輪次,在FastLeaderElection實現中有一個logicalclock屬性,用來標識當前Leader選舉輪次,ZK規定所有投票必須
		在同一個輪次,server開始新一輪投票前會進行自增操作。

	2). 初始化選票(第一次先投票給自己),參照前面的Vote結構
	3). 發送初始化選票

	4). zk從reeviveQueue接收外部投票
		如果zk發現自己無法獲得任何投票,則馬上檢查是否與其他zk保持了有效連接,無則建立,並再次發送自己當前的內部投票

	5). 判斷選舉輪次(接收到的外部投票)
		I). 外部投票輪次大於內部投票	立即更新自己的選舉輪次(logicalclock),並清空已收到的所有投票,然后使用初始化的投票來PK(第6步)
				是否變更內部投票,最終再將內部投票發送出去。
		II). 外部投票的輪次小於內部投票	zk直接忽略該投票,不做任何處理,返回步驟4
		III). 內外部輪次一致	開始選票PK
	
	6). 選票PK	比較順序從先到后依次是  輪次 > ZXID > SID ,3種比較都是 "外部大於內部,則進行投票變更”
	
	7). 投票變更	用外部投票的信息覆蓋內部投票,變更完成后,再次將這個投票信息發送出去
	
	8). 選票歸檔	無論是否進行了選票變更,都會將剛剛收到的那份外部投票放入選票集合"recvset"中,recvset內部按SID存在本輪次收到的所有外部投票
	9). 統計投票	完成選票歸檔以后,就開始統計投票。如果確定已經有超過半數的服務器認可了該內部投票,則終止投票。
			否則返回步驟4.
	
	10). 如果可以終止投票(再等待200ms來確定是否有更優的投票),則更新服務器狀態		
			首先判斷投票選出的Leader是否是自己,然后更具情況更新自己狀態為LEADING/FOLLOWING/OBSERVING
	
	11). 選出Leader后,所有learner向leader發送LEARNERINFO消息,等待超過半數的learner連接完成后(取他們最大的epoch當做leader的epoch值)

	12). leader向learner發送LEADERINFO消息,learner從中解析出epoch和ZXID,然后向Leader反饋一個ACKEPOCH
	
	13). Leader接收到該Learner的ACK后就開始與其進入”數據同步“環節


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM