Apache Bookkeeper —— Journal 源码分析

简单梳理一下这个类的作用和逻辑。

主要功能

  1. 充当WAL
  • 写请求处理:
    首先在Bookkeeper服务端收到了写Entry的请求之后会交给Bookie来处理
    Bookie.addEntryInternal 这个方法会将请求携带的Entry信息写入LedgerStorage(实际数据存储的位置 + 索引)
    写入成功之后还会同时将这个请求写入Journal
  • 其他重要信息:比如说Ledger被fence的信息、LAC等。
  1. 启动的时候将WAL进行replay,将记录在journal里面的内容重新apply到LedgerStorage里面,
    避免之前写入LedgerStorage的内容因为没有刷盘导致丢失。

  2. checkpoint 逻辑
    和其他WAL一样,需要记录一个位置,这个位置标识着LedgerStorage里面的数据已经全都落盘了
    这一个位置之前的WAL日志都可以被删除。

  3. 维护JournalChannel逻辑,写入WAL日志,日志轮转等。

大致逻辑

1. 写入:

整个写入是异步的,写入结果通过callback进行后续处理。
写入的参数会封装成为一个QueueEntry放到写请求队列

 class QueueEntry {
        // 内容
        ByteBuf entry;
        long ledgerId;
        long entryId;
        
       // 写结果的callback
        WriteCallback cb;
       // 进入队列的时间,用来确定是否等待时间过长
        long enqueueTime;
       // 是否需要等内容落盘
        boolean ackBeforeSync;
}

这个队列会被一个线程定期处理,这里先叫做BookieJournalWriteThread 好了(实际没有这个类)
取出之后会将携带的ByteBuffer 写入到JournalChannel里面。这个线程专门处理这个逻辑,
其他的活不干。

这里先说下JournalChannel 这个类,这个类可以认为是底层journal磁盘文件的映射,
内部实现是一个带读写缓存的FileChannel, 写入的时候先到写缓存,
有相应的逻辑主动触发写缓存写到包装的FileChannel里面。

QueueEntry 的字节写入之后,可能内容在写缓存里面。

flush 逻辑

我们需要触发flush逻辑,将写缓存的内容写到FileChannel里面。

这里flush和 sync 到磁盘不是一个说法。
flush 是调用FileChannel.write 为了减少调用次数
sync 是调用FileChannel.force 为了fsync 到磁盘

这里触发flush的条件有3种:

  1. 时间bound:这个请求入队之后,一段时间之后必须被处理(写入到channel或者落盘)
  2. 写请求的个数 || 累积的写请求的字节数
  3. 写请求队列为空(一般测试的时候出现这个,写请求很少的情况下大部分都会被1这个条件兜底)

满足flush 条件则会主动将写缓存的内容刷到FileChannel里面。
如果不需要等待内容落盘(ackBeforeSync=false),则直接将callback提交到线程池执行回调。
之后写请求被放到一个等待flush的batch里面。

flush逻辑做完之后,会去判断是否需要落盘。

落盘(ForceWrite)逻辑

按照配置有下面几种条件需要落盘。

  1. 每次flush都需要落盘。
  2. journal 文件轮转,需要把之前的文件落盘。
  3. 按照配置的interval 落盘。

如果需要落盘则这个时候会将之前的batch 封装成为一个ForceWriteRequest 放到落盘队列里面。

这个队列会被ForceWriteThread 清空。

这里可以配置一个groupCommit的逻辑。避免多次fsync
如果配置了这个则会将队列里面的请求合并到一起,触发单次的FileChannel.force
同样,落盘之后会将之前的callback 放到线程池去处理回调。

2. replay 逻辑

这个逻辑比较简单,就是启动的时候把这个文件的内容从上次成功checkpoint的位置开始读取。
把读到的内容再次写入到LedgerStorage 里面就ok。

3. checkpoint 逻辑

这个实际上和LedgerStorage 这个是联动的,如果这一段WAL上面的内容,已经被LedgerStorage成功写到磁盘上了,那么这段WAL就可以被删除了。

这里会有一个LastLogMark文件,标记了(journal文件,offset)表示这个文件在这个offset之前的内容可以被干掉了。

Journal 这个类实现了CheckpointSource 这个接口。
实际动作由SyncThread (实现了Checkpointer接口)执行。

每种LedgerStorage的checkpoint触发条件不同。

entryLogPerLedgerEnabled || isDbLedgerStorage 会按照时间interval 定期触发checkpoint
InterleavedLedgerStorage 会在日志轮转的时候触发
SortedLedgerStorage 会在memtable 需要flush的时候触发

实际逻辑比较简单

public void checkpoint(Checkpoint checkpoint) {
       // ...
            ledgerStorage.checkpoint(checkpoint);
            checkpointSource.checkpointComplete(checkpoint, true);
       // ...
    }

checkpointComplete 这个方法会刷新磁盘上的LastLogMarker 这个文件,同时落盘。
(主要逻辑在LedgerStorage.checkpoint这里)

这里的磁盘是LedgerStorage的磁盘

总结

写入请求处理是异步的,提交之后就会被Journal线程处理。
Journal线程负责将内容写入Journal channel,同时按照一定条件执行flush逻辑。
如果判断需要进行刷盘则将刷盘batch包装成ForceWriteRequest
ForceWriteThread清理队列进行group commit 处理。负责journal落盘。
对于写请求的callback不会在这两个执行,会被额外提交到callback线程池处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容