leader選舉
zookeeper在集群啟動或原leader宕機后會進行l(wèi)eader選舉墙歪,選舉過程大致如下:
- 每個實例通過發(fā)送“實例id+最大事務id”的消息來協調選舉,例如實例1初始事務id為0临燃,那么將首先選舉自己,即向其他所有實例發(fā)送消息:(1,0)
- 一個實例收到選舉消息后和自己的選舉消息進行對比牲阁,首先判斷事物id立叛,以大的為準负敏;其次判斷實例id,也是以大的為準秘蛇。如果收到了比自己大的其做,則更新自己的投票,并將更新后的選舉消息發(fā)送出去赁还。
- 每個實例收到投票后進行統(tǒng)計妖泄,如果發(fā)現投票某個實例的數量大于集群總數的1/2,則認為它是leader艘策。
- 產生leader后蹈胡,若實例自己是leader則進入leader模式;否則進入follower或observer模式。
為什么選取事務id大的實例為leader罚渐?
為了保證集群事務處于最新狀態(tài)却汉。zookeeper要求非leader必須和leader狀態(tài)一致,因此荷并,選取事務id大的作為leader可以保證集群事務處于最新狀態(tài)合砂。
事務流程
leader作為zookeeper的事務唯一處理者,follower或observer接收到事務請求都將轉發(fā)給leader進行處理璧坟。zookeeper事務處理以責任鏈的形式進行既穆,過程大致分為sync、vote雀鹃、commit三個階段幻工。為了保證事務處理的順序性,每個階段都有對應的事務緩存隊列黎茎,事務首先放入緩存隊列囊颅,由專門的處理器從隊列中獲取事務對象處理。
- sync:leader接收到事務請求后首先進入sync流程傅瞻。類似于數據庫事務踢代,該流程中首先寫事務日志,成功后進入vote階段嗅骄。
- vote:對于事務請求胳挎,zookeeper要進行投票,超過集群半數實例通過后才能執(zhí)行溺森。投票就是將事務消息發(fā)送給所有folloer慕爬,follower收到投票請求后同樣先寫事務日志,然后返回leader確認消息ack屏积。
- commit:leader收到超過半數ack后就進行事務執(zhí)行医窿,也就是寫具體的內存數據庫。數據更新完成后給所有follower發(fā)送commit消息炊林,follower收到消息后同樣更新數據并返回ack姥卢。這里對于observer進行了特殊處理,由于observer沒有投票權渣聚,所有不能簡單發(fā)送commit消息独榴,需要發(fā)送包含數據的inform消息。