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