算法:Raft
對(duì)象:
復(fù)制狀態(tài)機(jī)集群
主要問題:
保證一個(gè)狀態(tài)機(jī)集群里面的機(jī)子一致性良好
兩個(gè)關(guān)鍵問題:
1. 沒有 Master 時(shí)需要選舉出下一個(gè) Master蜻韭,且要保證同時(shí)只有一個(gè) Master
2. 機(jī)器重連后的 log(狀態(tài)機(jī)命令序列) 同步
解決方案:
問題 1 的解決方案:
集群的數(shù)量(sum) 必須是大于 1 的奇數(shù)柿扣。
每個(gè)機(jī)器都啟動(dòng)一個(gè)定時(shí)器闺魏,當(dāng)一定時(shí)間內(nèi)沒有收到來自 Leader 的消息,則視為 Leader 已不可用司草,從 Follower 轉(zhuǎn)換成 Candidate埋虹,準(zhǔn)備選舉 Leader搔课。
選舉過程中截亦,每個(gè)機(jī)器只可選一個(gè) Candidate,而且必須得到大于 sum/2 個(gè)投票才可當(dāng)選為 Leader袍啡。
當(dāng)同時(shí)有兩個(gè) Candidate 競(jìng)選 Leader 時(shí)境输,有可能每個(gè) Candidate 都拿不到多數(shù)選票颖系,因?yàn)檫x舉也有 timeout,而且是一定范圍的隨機(jī)窗悯,所以只要出現(xiàn)多個(gè) Candidate偷拔,就簡(jiǎn)單的重置定時(shí)器而已莲绰。性能不一定最高蛤签,但簡(jiǎn)單且健壯震肮。
問題 2 的解決方案
對(duì)于一個(gè)集群來說,每次從無 Leader 到進(jìn)行選舉是一個(gè)階段(Term)鲫尊,所以在舊階段失聯(lián)的機(jī)器重連后沦偎,判斷當(dāng)前集群所在的階段豪嚎,若已落后,則無條件用 Leader 的 log 覆蓋自己的舌涨,成為一個(gè) Follower囊嘉。
所以在 Raft 中哗伯,只有 Leader 向 Follower 發(fā)送 log,這簡(jiǎn)化了復(fù)制過程焊刹,但在某些條件下虐块,系統(tǒng)的復(fù)制性能會(huì)下降贺奠。
對(duì)于每個(gè)客戶端請(qǐng)求错忱,只有在超過半數(shù)機(jī)器復(fù)制成功(log 寫入成功)時(shí)儡率,才能向客戶端響應(yīng)成功。
同樣在選舉時(shí)以清,log 數(shù)量多的 Candidate 擁有更高的權(quán)重儿普。
解決一致性的開源解決方案Zookeeper
基于Raft算法的基礎(chǔ)服務(wù),相當(dāng)于TCP/IP下面的下層協(xié)議掷倔,為上層的應(yīng)用提供服務(wù)眉孩。
基礎(chǔ)服務(wù)目標(biāo):提供基礎(chǔ)的文件服務(wù)
基礎(chǔ)服務(wù)Zookeeper 可以看做提供了一個(gè)分布式且保證了操作一致性的文件系統(tǒng),其設(shè)計(jì)目標(biāo)不是像 GFS 一樣管理大量大文件,而是以文件系統(tǒng)的目錄和文件作為基本數(shù)據(jù)結(jié)構(gòu)浪汪,提供一系列 API巴柿,方便用戶構(gòu)建自己的分布式服務(wù)。
兩階段提交:多個(gè)集群的分布式實(shí)務(wù)算法
用處
保證一個(gè)集群實(shí)務(wù)的原子性死遭。
兩步提交
- 預(yù)提交广恢,讓協(xié)調(diào)者給參與者,讓參與者預(yù)執(zhí)行殃姓。
- 通過預(yù)執(zhí)行的結(jié)果反饋,協(xié)調(diào)者來判斷參與者們是否需要全部commit:如果結(jié)果反饋全部為OK枷颊,那么就commit上去。如果參與者結(jié)果反饋有一個(gè)不行题造,那就讓協(xié)調(diào)者
多個(gè)集群在 并發(fā) 和 一致性 之間的平衡
算法:OOC 樂觀并發(fā)控制
背景:有很多集群的操作不是互斥的牵触。比如A集群進(jìn)行操作A1袜腥,B集群進(jìn)行操作B1损痰,然而A和B操作不影響整個(gè)系統(tǒng)的一致性役首。
上面的兩階段提交過程:
參與者預(yù)執(zhí)行->把結(jié)果發(fā)給協(xié)調(diào)者->協(xié)調(diào)者協(xié)調(diào)(需要等待所有節(jié)點(diǎn))->發(fā)送協(xié)調(diào)結(jié)果給所有節(jié)點(diǎn)->所有節(jié)點(diǎn)統(tǒng)一進(jìn)行提交/回滾远荠。
現(xiàn)在的提交過程:
參與者預(yù)執(zhí)行->結(jié)果發(fā)給協(xié)調(diào)者->協(xié)調(diào)者判定是否和其他集群操作沖突->協(xié)調(diào)者發(fā)結(jié)果參與者->