作者: Unmesh Joshi
譯者: java達(dá)人
預(yù)寫日志中的索引,顯示最近一次成功的復(fù)制。
問題
服務(wù)器崩潰并重新啟動后,可使用“Write-Ahead Log”模式恢復(fù)狀態(tài)。但是,如果服務(wù)器發(fā)生故障,Write-Ahead Log不足以提供可用性。如果單個服務(wù)器發(fā)生故障,則客戶端將無法運行,直到服務(wù)器重新啟動。為了獲得更多可用的系統(tǒng),我們可以在多個服務(wù)器上復(fù)制日志。使用領(lǐng)導(dǎo)者和追隨者模式,領(lǐng)導(dǎo)者會將其所有日志條目復(fù)制到追隨者法定數(shù)。現(xiàn)在,如果領(lǐng)導(dǎo)者失敗,則可以選舉新的領(lǐng)導(dǎo)者,并且客戶可以像以前一樣繼續(xù)使用集群。但是仍然有幾處可能出問題:
? leader在將其日志發(fā)送給任何追隨者之前可能會失敗。? 領(lǐng)導(dǎo)者可能會在向一些追隨者發(fā)送日志條目時失敗,無法將其發(fā)送給大多數(shù)的追隨者。
在這些錯誤場景中,一些追隨者可能在其日志中丟失條目,而一些追隨者可能擁有比其他追隨者更多的條目。因此,對于每個follower來說,了解日志的哪一部分對客戶端是安全可用的就變得很重要了。
解決方案
high-water mark是日志文件的一個索引,它記錄已知已成功復(fù)制到追隨者Quorum的最后一個日志條目。在復(fù)制過程中,領(lǐng)導(dǎo)者還會將high-water mark傳遞給追隨者。集群中的所有服務(wù)器應(yīng)該只向請求低于high-water mark更新的客戶端傳輸數(shù)據(jù)。
這是操作順序:
Figure 1: High-Water Mark
對于每個日志條目,leader將其附加到其本地預(yù)寫日志中,然后將其發(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ù)制請求并將日志條目附加到它們的本地日志中。在成功附加日志條目之后,它們將擁有的最新日志條目索引響應(yīng)到leader。該響應(yīng)還包括服務(wù)器的當(dāng)前Generation Clock。
follower (class ReplicationModule...)
private ReplicationResponse handleReplicationRequest(ReplicationRequest replicationRequest) { List
Leader在收到響應(yīng)時跟蹤在每個服務(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); }
通過查看所有追隨者的日志索引和領(lǐng)導(dǎo)者本身的日志,并獲取大多數(shù)服務(wù)器上可用的索引,可以計算出High-Water Mark。
class ReplicationModule…
Long computeHighwaterMark(List
領(lǐng)導(dǎo)者將high-water mark作為常規(guī)心跳的一部分或作為單獨的請求向追隨者傳播。追隨者隨后相應(yīng)地設(shè)定了他們的high-water mark。
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
9696瀏覽量
87293 -
分布式系統(tǒng)
+關(guān)注
關(guān)注
0文章
147瀏覽量
19545 -
Mark
+關(guān)注
關(guān)注
0文章
20瀏覽量
8537
發(fā)布評論請先 登錄
多通道電源管理芯片在分布式能源系統(tǒng)中的優(yōu)化策略
安科瑞Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在嘉興亨泰分布式光伏項目中的應(yīng)用

分布式光伏發(fā)運維系統(tǒng)實際應(yīng)用案例分享

淺談分布式光伏系統(tǒng)在工業(yè)企業(yè)的設(shè)計及應(yīng)用

安科瑞能量管理系統(tǒng)在江西某啤酒廠分布式光伏發(fā)電項目中的應(yīng)用

分布式云化數(shù)據(jù)庫有哪些類型
基于ptp的分布式系統(tǒng)設(shè)計
HarmonyOS Next 應(yīng)用元服務(wù)開發(fā)-分布式數(shù)據(jù)對象遷移數(shù)據(jù)權(quán)限與基礎(chǔ)數(shù)據(jù)
安科瑞Acrel-1000DP分布式光伏監(jiān)控系統(tǒng)在8.3MWp分布式光伏發(fā)電中的應(yīng)用
分布式光伏發(fā)電系統(tǒng)的應(yīng)用

解決電網(wǎng)逆流難題,實現(xiàn)分布式光伏發(fā)電全部自發(fā)自用

分布式輸電線路故障定位中的分布式是指什么

評論