故事設(shè)定
- N個人組成了一個團隊月帝,承包了一棟大樓,對外出租幽污;會不斷有人來租房子嚷辅,每租一間房子,需要多數(shù)人同意距误,才能向租客確認出租潦蝇。同時每個人都會記錄當前還剩多少房子未出租款熬;
- 大家都愿意將房子租出去,所以只要有租房的需求攘乒,大家都會同意贤牛。
- 每個人都有可能臨時處理自己的事情而暫時離開團隊。
- 需要一個接待員则酝,去接待租客殉簸,并征求大家的意見。每個人都可以成為接待員沽讹,成為接待員的前提是在接待員位置空缺時般卑,誰想當接待員都可以向大家爭取意見,獲取大部分人同意的人爽雄,將會成為接待員蝠检。
- 為了篩選真正需要租賃的客戶,所有人都有回復(fù)顧客的詢問和真正需要進行租賃的時候挚瘟,將顧客指引到接待員那進行真正的租賃叹谁;原則是:租賃業(yè)務(wù)的發(fā)起必須由接待員發(fā)起。
- 只有在接待員崗位空缺的時候乘盖,每個人都允許發(fā)起多輪投票焰檩,但是每一輪投票,大家只能投一票订框,多數(shù)者獲勝析苫。選出獲勝者之后,會將投票的輪次加一穿扳!在投票的時候衩侥,大家都會評估被選人是否對公司業(yè)務(wù)足夠了解(輪次越高,可能掌握的數(shù)據(jù)就越全面)矛物,也可以理解成酒店管理集團的升級版本顿乒,每次選舉之后,都標識酒店進入新的時代泽谨!優(yōu)先選擇賬本記錄最全的候選者璧榄,如果有候選人發(fā)現(xiàn)自己的投票輪次低于其他候選者,則會自動退出選舉吧雹,同時高版本的成員不會給低版本的成員進行投票骨杂!
- 最后選出來的接待員,作為整個團隊的接待員
店鋪開業(yè)(分布式一致性)
- 所有成員需要推選出一個接待員雄卷,來傳達租客的租賃需求搓蚪。在沉默了一段時間之后,有一個比較積極的小伙A丁鹉,說自己可以擔任接待員妒潭,為大家服務(wù)悴能。經(jīng)過投票,小A順利的成為接待員雳灾。公司正式開始開業(yè)漠酿;
- 按照之前的約定,接待員必須在每個租客谎亩,進行租房的時候炒嘲,先進行登記,然后向大家詢問匈庭,是否可以將房子租出去夫凸,如果大多數(shù)人不在場,比如中午吃飯的時間阱持,就會對外暫停營業(yè)夭拌,所有業(yè)務(wù)都暫時停止。正常營業(yè)時間為了節(jié)省時間衷咽,小A會在咨詢完多數(shù)人之后(之后找時間慢慢的通知其他人鸽扁,在咨詢的時候,大家其實也是先進行登記兵罢,因為不確定這個事情一定能成)献烦,就告訴租客可以出租了滓窍。同時再向大家確認房屋已經(jīng)出租卖词。大家一接到這種通知之后,會自覺的在自己的小本本上將之前登記的記錄變更成真正的賬本來記錄當前還剩多少房子吏夯,已經(jīng)租出去了多少房子此蜈;
- 就這樣,一段時間內(nèi)噪生,公司運行的非常平穩(wěn)裆赵,大家的帳記錄的也都一樣。
接待員的更替(leader 節(jié)點不可用)
- 由于租賃業(yè)務(wù)非常繁忙跺嗽,大家都會時不時的盯著接待員是否在崗位上战授,如果發(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è)務(wù),登記和通知大家業(yè)務(wù)進展离熏;有時候佳谦,上一個接待員由于某些原因離開的時候,未將某些登記記錄告訴大家滋戳,所以新的接待員也不知道钻蔑。那條未登記的記錄大家都不知道,所以老的接待員回來之后就會被新的接待員通知將之前沒有登記的記錄刪除掉(從現(xiàn)在新接待員最新的記錄開始找奸鸯,找到兩者一樣的數(shù)據(jù)咪笑,然后把之后的全部同步成最新的),只記錄現(xiàn)在有效的記錄娄涩。所以之前進行登記的租戶可能需要重新進行登記窗怒;
公司不間斷的進行運營,大家也都相安無事蓄拣。
- 故事啟示:為什么不把賬本放到一個地方扬虚,大家一起寫,比如mysql呢球恤?原因是辜昵,如果一個分布式服務(wù)需要嚴重依賴外部服務(wù)來保證數(shù)據(jù)的一致性的話,并不是優(yōu)秀的解決方案咽斧,所以一般靠節(jié)點之間的日志進行記錄堪置,完成數(shù)據(jù)的一致性!將外部存儲作為一個備份张惹,來進行維護舀锨!
解析常見的面試題
- raft協(xié)議組成部分
- 接待員(leader), 被選舉人(candidate),其他成員(followers),每個人的小本本(同步日志)诵叁,酒店的升級版本號(term),賬單上的每條記錄(index)
- raft選舉觸發(fā)時機
- 只要有人沒看到接待員在崗雁竞,就會容忍一段時間,然后發(fā)起選舉!不管是團隊剛成立還是運營中接待員離崗碑诉!(初始化服務(wù)或中途leader節(jié)點宕機導(dǎo)致followers接不到心跳消息)
- raft保證數(shù)據(jù)的一致性
- 每個人都有自己的小本本彪腔,只要接待員要處理業(yè)務(wù),就會征求大家的意見进栽,然后大家登記德挣,等到接待員征求了大部分人之后,會向大家同步結(jié)論快毛,大家統(tǒng)一記賬格嗅,接待員向客戶回復(fù)租賃成功!(leader節(jié)點同步大多數(shù)followers唠帝,followers同意之后屯掖,同步日志,向client回復(fù)成功)
- raft選舉成功之后襟衰,如果節(jié)點內(nèi)容不一致贴铜,有什么同步手段
- leader會同步index和快照,完成整體數(shù)據(jù)同步瀑晒!index是一個個同步绍坝,檢查!snapshot是整體同步苔悦!一般都是在一個可以接受的區(qū)間內(nèi)轩褐,如果超過的話,就整體同步玖详!比如一個人離開時間太長了把介,在進來的話,就會整體抄別人的作業(yè)而不是一天天對賬
- raft中的term概念是什么竹宋,有什么用
- 酒店的版本劳澄,用于區(qū)分和定位是在那一個輪次以及去掉過期的投票選擇
- raft協(xié)議選舉投票的前提是什么
- 酒店成員自己的版本比被選舉人的版本低地技,標識沒有過期蜈七!以及index比被選舉人的低。這樣的話莫矗,不會完成那些高版本飒硅,少數(shù)據(jù)的情況發(fā)生,最終導(dǎo)致數(shù)據(jù)的丟失問題
- 如果集群節(jié)點中被物理阻斷了作谚,會怎么樣三娩,之后再將物理阻斷去掉會怎么樣
- 會自己在所屬的空間沒小范圍投票,但是由于得不到多數(shù)人的認可妹懒,所以選舉不成功雀监,輪次不變!等到物理分區(qū)結(jié)束之后,找其他大分區(qū)的leader