raft 協(xié)議傳說

故事設(shè)定
  • N個人組成了一個團隊,承包了一棟大樓,對外出租;會不斷有人來租房子,每租一間房子,需要多數(shù)人同意,才能向租客確認出租。同時每個人都會記錄當前還剩多少房子未出租;
  • 大家都愿意將房子租出去,所以只要有租房的需求,大家都會同意。
  • 每個人都有可能臨時處理自己的事情而暫時離開團隊。
  • 需要一個接待員,去接待租客,并征求大家的意見。每個人都可以成為接待員,成為接待員的前提是在接待員位置空缺時,誰想當接待員都可以向大家爭取意見,獲取大部分人同意的人,將會成為接待員。
  • 為了篩選真正需要租賃的客戶,所有人都有回復顧客的詢問和真正需要進行租賃的時候,將顧客指引到接待員那進行真正的租賃;原則是:租賃業(yè)務的發(fā)起必須由接待員發(fā)起。
  • 只有在接待員崗位空缺的時候,每個人都允許發(fā)起多輪投票,但是每一輪投票,大家只能投一票,多數(shù)者獲勝。選出獲勝者之后,會將投票的輪次加一!在投票的時候,大家都會評估被選人是否對公司業(yè)務足夠了解(輪次越高,可能掌握的數(shù)據(jù)就越全面),也可以理解成酒店管理集團的升級版本,每次選舉之后,都標識酒店進入新的時代!優(yōu)先選擇賬本記錄最全的候選者,如果有候選人發(fā)現(xiàn)自己的投票輪次低于其他候選者,則會自動退出選舉,同時高版本的成員不會給低版本的成員進行投票!
  • 最后選出來的接待員,作為整個團隊的接待員
店鋪開業(yè)(分布式一致性)
  • 所有成員需要推選出一個接待員,來傳達租客的租賃需求。在沉默了一段時間之后,有一個比較積極的小伙A,說自己可以擔任接待員,為大家服務。經(jīng)過投票,小A順利的成為接待員。公司正式開始開業(yè);
  • 按照之前的約定,接待員必須在每個租客,進行租房的時候,先進行登記,然后向大家詢問,是否可以將房子租出去,如果大多數(shù)人不在場,比如中午吃飯的時間,就會對外暫停營業(yè),所有業(yè)務都暫時停止。正常營業(yè)時間為了節(jié)省時間,小A會在咨詢完多數(shù)人之后(之后找時間慢慢的通知其他人,在咨詢的時候,大家其實也是先進行登記,因為不確定這個事情一定能成),就告訴租客可以出租了。同時再向大家確認房屋已經(jīng)出租。大家一接到這種通知之后,會自覺的在自己的小本本上將之前登記的記錄變更成真正的賬本來記錄當前還剩多少房子,已經(jīng)租出去了多少房子;
  • 就這樣,一段時間內(nèi),公司運行的非常平穩(wěn),大家的帳記錄的也都一樣。
接待員的更替(leader 節(jié)點不可用)
  • 由于租賃業(yè)務非常繁忙,大家都會時不時的盯著接待員是否在崗位上,如果發(fā)現(xiàn)接待員不在崗位上,會立即發(fā)起投票,選舉自己為接待員;
  • 有時候,有些人會因為自己看花眼,發(fā)現(xiàn)接待員不在崗位上而發(fā)起投票,但這種意外情況很快就會被制止,因為大部分人還是知道接待員在崗位上的;
  • 在營業(yè)時間內(nèi),選舉時常發(fā)生;有時候一個人發(fā)現(xiàn)了接待員不在崗位上了,有時候多個人發(fā)現(xiàn)接待員不在崗位上了,在接待員離開的這段時間內(nèi),大家可能因為票數(shù)相同發(fā)起了多輪投票。最終票數(shù)多著獲勝。如果在選舉過程中接待員回來了,也不能再次繼任接待員,也得參與投票。
  • 新的接待員上任之后,會繼續(xù)對接租賃業(yè)務,登記和通知大家業(yè)務進展;有時候,上一個接待員由于某些原因離開的時候,未將某些登記記錄告訴大家,所以新的接待員也不知道。那條未登記的記錄大家都不知道,所以老的接待員回來之后就會被新的接待員通知將之前沒有登記的記錄刪除掉(從現(xiàn)在新接待員最新的記錄開始找,找到兩者一樣的數(shù)據(jù),然后把之后的全部同步成最新的),只記錄現(xiàn)在有效的記錄。所以之前進行登記的租戶可能需要重新進行登記;
公司不間斷的進行運營,大家也都相安無事。
  • 故事啟示:為什么不把賬本放到一個地方,大家一起寫,比如mysql呢?原因是,如果一個分布式服務需要嚴重依賴外部服務來保證數(shù)據(jù)的一致性的話,并不是優(yōu)秀的解決方案,所以一般靠節(jié)點之間的日志進行記錄,完成數(shù)據(jù)的一致性!將外部存儲作為一個備份,來進行維護!
解析常見的面試題
  • raft協(xié)議組成部分
    • 接待員(leader), 被選舉人(candidate),其他成員(followers),每個人的小本本(同步日志),酒店的升級版本號(term),賬單上的每條記錄(index)
  • raft選舉觸發(fā)時機
    • 只要有人沒看到接待員在崗,就會容忍一段時間,然后發(fā)起選舉!不管是團隊剛成立還是運營中接待員離崗!(初始化服務或中途leader節(jié)點宕機導致followers接不到心跳消息)
  • raft保證數(shù)據(jù)的一致性
    • 每個人都有自己的小本本,只要接待員要處理業(yè)務,就會征求大家的意見,然后大家登記,等到接待員征求了大部分人之后,會向大家同步結(jié)論,大家統(tǒng)一記賬,接待員向客戶回復租賃成功!(leader節(jié)點同步大多數(shù)followers,followers同意之后,同步日志,向client回復成功)
  • raft選舉成功之后,如果節(jié)點內(nèi)容不一致,有什么同步手段
    • leader會同步index和快照,完成整體數(shù)據(jù)同步!index是一個個同步,檢查!snapshot是整體同步!一般都是在一個可以接受的區(qū)間內(nèi),如果超過的話,就整體同步!比如一個人離開時間太長了,在進來的話,就會整體抄別人的作業(yè)而不是一天天對賬
  • raft中的term概念是什么,有什么用
    • 酒店的版本,用于區(qū)分和定位是在那一個輪次以及去掉過期的投票選擇
  • raft協(xié)議選舉投票的前提是什么
    • 酒店成員自己的版本比被選舉人的版本低,標識沒有過期!以及index比被選舉人的低。這樣的話,不會完成那些高版本,少數(shù)據(jù)的情況發(fā)生,最終導致數(shù)據(jù)的丟失問題
  • 如果集群節(jié)點中被物理阻斷了,會怎么樣,之后再將物理阻斷去掉會怎么樣
    • 會自己在所屬的空間沒小范圍投票,但是由于得不到多數(shù)人的認可,所以選舉不成功,輪次不變!等到物理分區(qū)結(jié)束之后,找其他大分區(qū)的leader
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容