作者: 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文章
152瀏覽量
19886 -
Mark
+關注
關注
0文章
21瀏覽量
8787
發布評論請先 登錄
零碳園區自主供能模式的分布式光伏系統
Acrel-1000DP分布式光伏監控系統成功落地奉賢平高食品 4.4MW 分布式光伏項目
如何解決分布式光伏計量難題?
分布式智能展廳控制系統:打造AI互動展示新模式!
【節能學院】Acrel-1000DP分布式光伏監控系統在奉賢平高食品 4.4MW 分布式光伏中應用
分布式光伏總出問題?安科瑞分布式光伏監控系統來“救場”
Ceph分布式存儲系統解析
分布式光伏發電監控系統
雙電機分布式驅動汽車高速穩定性機電耦合控制
多通道電源管理芯片在分布式能源系統中的優化策略
安科瑞Acrel-1000DP分布式光伏監控系統在嘉興亨泰分布式光伏項目中的應用
使用VirtualLab Fusion中分布式計算的AR波導測試圖像模擬
分布式光伏發運維系統實際應用案例分享
淺談分布式光伏系統在工業企業的設計及應用
分布式系統模式概述——Low-Water Mark
評論