ActiveMq Kahadb

The KahaDB Message Store Internals

在解决storage useage较高的问题时,详细研究了一下KahaDB Message Store的内部构造。ActiveMq 默认存储消息使用的是AMQ Message Store,KahaDB Message Store是一种新的消息存储库,主要是为了解决ActiveMq Message Store的一些限制,关于AMQ Message Store请参考AMQ Message Store ,AMQ Message Store对每个索引使用两个单独的文件(每个destination有一个索引),并且如果未正确关闭ActiveMQ Broker,恢复速度可能会很慢。原因是需要重建所有索引,从而需要broker遍历所有的消息日志。为了克服这些限制,KahaDB消息存储库为其索引使用了事务日志,而且所有的Destination仅使用一个索引文件。

Kahadb Message Store

这是一个Kahadb Message Store的构造图:

  • The Data Logs: 是一个消息和命令的日志(例如事务边界和消息删除),存储在一个固定大小的文件中。当达到设置的最大文件大小时候,会创建一个新的数据文件。文件中的所有消息都是引用计数的,所以一旦文件中的所有消息不在被需要,也就是引用计数变为0,那么文件就会被删除或者归档

  • The Cache: 在消息被写入日志文件之后,Cache也会保留消息在内存中以便于快速查找,Cache会定期的将消息ID和消息在Data Logs中的位置更新到引用存储索引(Btree Indexes)中,这个过程称为执行检查点(checkpoint)。一旦Btree Indexes更新完成之后,消息就能够安全的从Cache中删除。cache更新Btree Indexes的时间间隔是可以配置的,通过设置checkpoinInterval属性。如果ActiveMQ消息代理达到其内存限制,也会发生检查点(checkpoint)。

  • The BTree Indexes:保存了日志文件中消息的引用,并且根据消息的ID建立了索引。The BTree Indexes维护了队列的FIFO的数据结构和持久订阅者指向其主题消息的指针。redo log仅会使用在ActiveMq broker尚未彻底关闭时,为了确保Btree Indexes的完整性。

The KahaDB Message Store Directory Structure

The KahaDB Message Store目录结构如下图:

Kahadb Message Store Directory Structure
  • db log files Kahadb 会把消息存储到一个预定义大小的名称为db-<Number>.log的数据文件中。当一个数据文件满了,一个新的文件就会被创建, 文件名称中的<Number>会增加,当文件中所有的消息没有任何引用时,文件会被删除或者归档。

  • The archive directory : 只有当archiveDataLogs属性被设置为true的时候,才会有这个文件夹,该文件夹下存储的是不再需要的db log文件,可以用于以后回放消息。

  • db.data: 该文件包含指向数据日志(db log file)中消息的BTree索引。

  • db.redo:当ActiveMq在一次硬件停机之后启动时,用于恢复Btree索引。

从上面可以看出,消息是存储在db-<Number>.log文件中,而db.data文件中保存了消息的引用以及给队列维护了一个FIFO的数据结构,当消息被消费后,db.data 中消息的引用就会出队,此时指向该消息的引用计数就会变化,当db-<Number>.log中所有消息的引用计数都为0时,也就是所有消息都被消费了之后,db-<Number>.log文件才会被删除或者归档。这里有个比较需要注意的点是db-<Number>.log文件默认大小是32M(可以通过journalMaxFileLength属性进行修改),如果这个文件中有一条消息存在对其的引用那么整个文件是不会被清理的,所以如果不定期存在一些消息不能被消费,而这些消息又分别存储到了不同的db-<Number>.log文件中,那么这些db-<Number>.log都不会被清除,这就会导致从ActiveMq web console中看到pending message数量不多,但是storage useage却显示存储占用很多的情况。处理方法一种就是降低db-<Number>.log的大小,并增加kahadb配置的存储空间,还有一种就是定时清理这些pending message,这样db-<Number>.log就能够被及时清理,从而降低存储空间的占用。

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