Martin Flower Segmented Log
我的使用场景:
在自研分布式流批存储系统时,元数据居于commit log的方式导致日志过大时,采用了分段日志的处理方式,下文内容翻译至马丁的文章,同时结合了自己遇到的问题。
Segmented Log 分段日志的思路是将原本单一的commit log切分成多个固定大小的小文件,我采用的是64M大小块,太大的话影响重启后读取,太小又造成频繁IO。
在什么时候切分文件呢? 基于commit log 思路,我们需要在写日记之前进行文件大小判断进行切分,这个文件大小状态在内存中进行维护,伪码如下
//持久化命令时
public Long writeEntry(WALEntry entry) {
//检测是否需要切分
maybeRoll();
//commit log
return openSegment.writeEntry(entry);
}
private void maybeRoll() {
//判断设置的文件大小
if (openSegment.
size() >= config.getMaxLogSize()) {
//刷盘
openSegment.