作者: Unmesh Joshi
譯者: java達人
預寫日志中的索引,表示可以丟棄日志的哪一部分。
問題
預寫日志維護對持久性存儲的每一次更新。隨著時間的進展,它會無限制地增長。Segmented Log允許一次處理較小的文件,但是如果不檢查,總磁盤存儲量將無限制增長。
解決方案
有一種機制可以告訴日志記錄機器可以安全地丟棄日志的哪一部分。該機制提供了最低的偏移量或low water mark,在此之前的日志可以丟棄。讓任務在后臺的單獨線程中運行,該任務連續檢查可以丟棄日志的哪一部分并刪除磁盤上的文件。
this.logCleaner = newLogCleaner(config);this.logCleaner.startup();
日志清理器可以實現為定時任務
public void startup() { scheduleLogCleaning();}
private void scheduleLogCleaning() { singleThreadedExecutor.schedule(() -> { cleanLogs(); }, config.getCleanTaskIntervalMs(), TimeUnit.MILLISECONDS);}基于快照的Low-Water Mark
大多數共識實現(例如Zookeeper或etcd(在RAFT中定義))都實現了快照機制。在此實現,存儲引擎需要定期快照。除快照外,它還存儲成功應用的日志索引。參考“Write-Ahead Log”模式中的簡單鍵值存儲實現,可以采取以下快照:
public SnapShot takeSnapshot() { Long snapShotTakenAtLogIndex = wal.getLastLogEntryId(); return new SnapShot(serializeState(kv), snapShotTakenAtLogIndex);}
一旦快照成功保存在磁盤上,日志管理器將獲得Low-Water Mark,以丟棄較舊的日志。
List<WALSegment> getSegmentsBefore(Long snapshotIndex) { List<WALSegment> markedForDeletion = new ArrayList<>(); List<WALSegment> sortedSavedSegments = wal.sortedSavedSegments; for (WALSegment sortedSavedSegment : sortedSavedSegments) { if (sortedSavedSegment.getLastLogEntryId() < snapshotIndex) { markedForDeletion.add(sortedSavedSegment); } } return markedForDeletion;}基于時間的Low-Water Mark
在某些系統中,不一定要使用日志來更新系統狀態,可以在給定的時間窗口后丟棄日志,而不必等待任何其他子系統共享可以刪除的最低日志索引。例如,在像Kafka這樣的系統中,日志將保留7周;消息時間超過7周的所有日志段都將被丟棄。對于此實現,每個日志條目還包括創建時的時間戳。然后,日志清理器可以檢查每個日志段的最后一個條目,并丟棄早于配置的時間窗口的日志段。
private List<WALSegment> getSegmentsPast(Long logMaxDurationMs) { long now = System.currentTimeMillis(); List<WALSegment> markedForDeletion = new ArrayList<>(); List<WALSegment> sortedSavedSegments = wal.sortedSavedSegments; for (WALSegment sortedSavedSegment : sortedSavedSegments) { if (timeElaspedSince(now, sortedSavedSegment.getLastLogEntryTimestamp()) > logMaxDurationMs) { markedForDeletion.add(sortedSavedSegment); } } return markedForDeletion;}
private long timeElaspedSince(long now, long lastLogEntryTimestamp) { return now - lastLogEntryTimestamp;}
例子
?所有共識算法(例如Zookeeper和RAFT)中的日志實現均實現基于快照的日志清理
?Kafka中的存儲實現遵循基于時間的日志清理
-
分布式系統
+關注
關注
0文章
147瀏覽量
19560 -
Mark
+關注
關注
0文章
20瀏覽量
8551
發布評論請先 登錄
多通道電源管理芯片在分布式能源系統中的優化策略
安科瑞Acrel-1000DP分布式光伏監控系統在嘉興亨泰分布式光伏項目中的應用

使用VirtualLab Fusion中分布式計算的AR波導測試圖像模擬
分布式光伏發運維系統實際應用案例分享

淺談分布式光伏系統在工業企業的設計及應用

安科瑞能量管理系統在江西某啤酒廠分布式光伏發電項目中的應用

分布式云化數據庫有哪些類型
基于ptp的分布式系統設計
安科瑞Acrel-1000DP分布式光伏監控系統在8.3MWp分布式光伏發電中的應用
分布式光伏發電系統的應用

安科瑞分布式光伏集中監控系統

淺談屋頂分布式光伏發電技術的設計與應用

解決電網逆流難題,實現分布式光伏發電全部自發自用

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

評論