作者: 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中的存储实现遵循基于时间的日志清理
超5类非屏蔽双绞线的应用解析
受到客户宁德时代订单暴涨的影响 天宜锂业扩产提速
科技抗疫华为云桌面引领移动办公新风潮
色彩大作战!华为一点都不虚华为荣耀9知更鸟蓝、华为nova2魔镜版,华为P10也要出亮黑色
2010中国国际医疗电子技术大会(CMET2010)
分布式系统模式概述——Low-Water Mark
从三方面分析LED透明屏的工作稳定性解决方案
从工业物联网网关讲起:工业数据采集有何特点
浅谈LoRa自组网的三大安全问题
色彩传感器,色彩传感器原理是什么?
浅析PCMCIA卡常识的方方面面
什么是雾计算?与物联网有何关系?
灵犀微光阵列光波导模组AW82、AWO72首发亮相,赋能AR产业新发展
令令开门智能门禁、访客、梯控系统落地金迪大厦
RFID技术解决服装行业防伪防窜货问题
基于自动驾驶涉及的软硬件的简单介绍
5G时代下的边缘计算的特点及发展趋势
江苏常州市智能电网产业9个重点项目正式开工取得了新的发展里程碑
人工智能对传感器发展的影响有哪些
谷歌微软全新的Cookie模型力保网络数据安全