作者: Unmesh Joshi
譯者: java達(dá)人
預(yù)寫(xiě)日志中的索引,顯示最近一次成功的復(fù)制。
問(wèn)題
服務(wù)器崩潰并重新啟動(dòng)后,可使用“Write-Ahead Log”模式恢復(fù)狀態(tài)。但是,如果服務(wù)器發(fā)生故障,Write-Ahead Log不足以提供可用性。如果單個(gè)服務(wù)器發(fā)生故障,則客戶端將無(wú)法運(yùn)行,直到服務(wù)器重新啟動(dòng)。為了獲得更多可用的系統(tǒng),我們可以在多個(gè)服務(wù)器上復(fù)制日志。使用領(lǐng)導(dǎo)者和追隨者模式,領(lǐng)導(dǎo)者會(huì)將其所有日志條目復(fù)制到追隨者法定數(shù)。現(xiàn)在,如果領(lǐng)導(dǎo)者失敗,則可以選舉新的領(lǐng)導(dǎo)者,并且客戶可以像以前一樣繼續(xù)使用集群。但是仍然有幾處可能出問(wèn)題:
? leader在將其日志發(fā)送給任何追隨者之前可能會(huì)失敗。? 領(lǐng)導(dǎo)者可能會(huì)在向一些追隨者發(fā)送日志條目時(shí)失敗,無(wú)法將其發(fā)送給大多數(shù)的追隨者。
在這些錯(cuò)誤場(chǎng)景中,一些追隨者可能在其日志中丟失條目,而一些追隨者可能擁有比其他追隨者更多的條目。因此,對(duì)于每個(gè)follower來(lái)說(shuō),了解日志的哪一部分對(duì)客戶端是安全可用的就變得很重要了。
解決方案
high-water mark是日志文件的一個(gè)索引,它記錄已知已成功復(fù)制到追隨者Quorum的最后一個(gè)日志條目。在復(fù)制過(guò)程中,領(lǐng)導(dǎo)者還會(huì)將high-water mark傳遞給追隨者。集群中的所有服務(wù)器應(yīng)該只向請(qǐng)求低于high-water mark更新的客戶端傳輸數(shù)據(jù)。
這是操作順序:
Figure 1: High-Water Mark
對(duì)于每個(gè)日志條目,leader將其附加到其本地預(yù)寫(xiě)日志中,然后將其發(fā)送給所有追隨者。
leader (class ReplicationModule...)
private Long appendAndReplicate(byte[] data) { Long lastLogEntryIndex = appendToLocalLog(data); logger.info("Replicating log entries from index " + lastLogEntryIndex); replicateOnFollowers(lastLogEntryIndex); return lastLogEntryIndex; }
private void replicateOnFollowers(Long entryAtIndex) { for (final FollowerHandler follower : followers) { replicateOn(follower, entryAtIndex); //send replication requests to followers } }
追隨者處理復(fù)制請(qǐng)求并將日志條目附加到它們的本地日志中。在成功附加日志條目之后,它們將擁有的最新日志條目索引響應(yīng)到leader。該響應(yīng)還包括服務(wù)器的當(dāng)前Generation Clock。
follower (class ReplicationModule...)
private ReplicationResponse handleReplicationRequest(ReplicationRequest replicationRequest) { List
Leader在收到響應(yīng)時(shí)跟蹤在每個(gè)服務(wù)器上復(fù)制的日志索引。
class ReplicationModule…
recordReplicationConfirmedFor(response.getServerId(), response.getReplicatedLogIndex()); long logIndexAtQuorum = computeHighwaterMark(logIndexesAtAllServers(), config.numberOfServers()); if (logIndexAtQuorum > replicationState.getHighWaterMark()) { var previousHighWaterMark = replicationState.getHighWaterMark(); applyLogAt(previousHighWaterMark, logIndexAtQuorum); replicationState.setHighWaterMark(logIndexAtQuorum); }
通過(guò)查看所有追隨者的日志索引和領(lǐng)導(dǎo)者本身的日志,并獲取大多數(shù)服務(wù)器上可用的索引,可以計(jì)算出High-Water Mark。
class ReplicationModule…
Long computeHighwaterMark(List
領(lǐng)導(dǎo)者將high-water mark作為常規(guī)心跳的一部分或作為單獨(dú)的請(qǐng)求向追隨者傳播。追隨者隨后相應(yīng)地設(shè)定了他們的high-water mark。
-
服務(wù)器
+關(guān)注
關(guān)注
14文章
10253瀏覽量
91490 -
分布式系統(tǒng)
+關(guān)注
關(guān)注
0文章
152瀏覽量
19887 -
Mark
+關(guān)注
關(guān)注
0文章
21瀏覽量
8787
發(fā)布評(píng)論請(qǐng)先 登錄
分布式能源管理物聯(lián)網(wǎng)解決方案
零碳園區(qū)自主供能模式的分布式光伏系統(tǒng)
如何解決分布式光伏計(jì)量難題?
分布式智能展廳控制系統(tǒng):打造AI互動(dòng)展示新模式!
【節(jié)能學(xué)院】Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在奉賢平高食品 4.4MW 分布式光伏中應(yīng)用
分布式光伏發(fā)電監(jiān)測(cè)系統(tǒng)技術(shù)方案
分布式光伏總出問(wèn)題?安科瑞分布式光伏監(jiān)控系統(tǒng)來(lái)“救場(chǎng)”
Ceph分布式存儲(chǔ)系統(tǒng)解析
分布式光伏發(fā)電監(jiān)控系統(tǒng)
雙電機(jī)分布式驅(qū)動(dòng)汽車(chē)高速穩(wěn)定性機(jī)電耦合控制
分布式光伏監(jiān)測(cè)難?并網(wǎng)型分布式光伏系統(tǒng)光伏功率預(yù)測(cè)方案
多通道電源管理芯片在分布式能源系統(tǒng)中的優(yōu)化策略
安科瑞Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在嘉興亨泰分布式光伏項(xiàng)目中的應(yīng)用
分布式光伏發(fā)運(yùn)維系統(tǒng)實(shí)際應(yīng)用案例分享
淺談分布式光伏系統(tǒng)在工業(yè)企業(yè)的設(shè)計(jì)及應(yīng)用
分布式系統(tǒng)模式—High-Water Mark
評(píng)論