分佈式一致性協議通俗講就是多機狀態的一致性保障協議,即若是同一份狀態存儲在多臺機器上,如何保證在多臺機器上的狀態彼此是一致的。一致是指讀到的結果和寫入的預期是一致的。git
raft的作法是:github
- 節點分爲三種角色leader、fellower、cancidator。leader接受client的讀寫請求,fellower接受leader的狀態同步消息。cancidator是當fellower在timeout超時後也沒有的收到leader的消息時,就自動成爲cancidator。
- leader按期會向fellower發送heartbeat消息。leader收到client的狀態修改消息後,生成log entry信息,同步給fellower。fellower回覆ack給leader。當leader收到超過半數的fellower的ack後,就將狀態進行實際修改,並返回client成功,同時通知fellower能夠落盤。
- 若是出現網絡分割,leader沒法和多數fellower通訊。不能和舊leader通訊的fellower在timeout超時沒有收到新的heartbeat消息後,就會廣播選舉本身爲leader。其它fellower收到選舉消息後,會確認。這樣新的leader就出來了。
- 若是同時有兩個cancidator選舉本身爲leader。這時可能都不能獲得多數票。就各自sleep 100-150ms後從新嘗試選舉本身。
幾點疑問:網絡
- leader回覆給client ack成功,回覆給fellower ack失敗,這時狀態的狀態不一致是如何處理的? 等待下一個heartbeat ack到達時,將上一個message ack掉?
- 從流程上看性能會比較低,如何承擔相似消息隊列系統的高吞吐?