一,介绍

自ActiveMQ5.4以来,KahaDB成为了ActiveMQ默认的持久化存储方式。相比于原来的AMQ存储方式,官方宣称KahaDB使用了更少的文件描述符,并且提供了更快的存储恢复机制。

二,KahaDB存储配置

在 conf/activemq.xml 中配置如下:

<broker brokerName="broker" ... >
<persistenceAdapter>
<kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
</persistenceAdapter>
...
</broker>

<persistenceAdapter>中指定了kahaDB,并表明数据存储在 "activemq-data"目录下,日志文件最大长度是32MB。

比如一个实际的ActiveMQ的KahaDB存储方式下的数据目录如下:

aaarticlea/png;base64,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" alt="" />

可以看出,上面directory一共有四个文件:

①db.data

它是消息的索引文件。本质上是B-Tree的实现,使用B-Tree作为索引指向db-*.log里面存储的消息。

②db.redo

主要用来进行消息恢复。

③db-*.log  存储消息的内容。对于一个消息而言,不仅仅有消息本身的数据(message data),而且还有(Destinations、订阅关系、事务...)

the data logs contain all of the message data and all of the information about destinations, subscriptions, transactions, etc.. 

data log以日志形式存储消息,而且新的数据总是以APPEND的方式追加到日志文件末尾。因此,消息的存储是很快的。比如,对于持久化消息,Producer把消息发送给Broker,Broker先把消息存储到磁盘中(enableJournalDiskSyncs配置选项),然后再向Producer返回Acknowledge。Append方式在一定程度上减少了Broker向Producer返回Acknowledge的时间。

④lock文件

另外,一些关于KahaDB的配置选项如下:

1)indexWriteBatchSize  默认值1000,当Metadata Cache中更新的索引到达了1000时,才同步到磁盘上的Metadata Store中。不是每次更新都写磁盘,而是批量更新写磁盘,比较写磁盘的代价是很大的。

2)indexCacheSize      默认值10000,(number of index pages cached in memory),在内存中最多分配多个页面来缓存index。缓存的index越多,命中的概率就越大,检索的效率就越高。

3)journalMaxFileLength  默认值32MB,当存储的消息达到32MB时,新建一个新文件来保存消息。这个配置对生产者或消息者的速率有影响。比如,生产者速率很快而消费者速率很慢时,将它配置得大一点比较好。

4)enableJournalDiskSyncs  默认值true,默认采用同步写磁盘,即消息先存储到磁盘中再向Producer返回ACK

normally,the broker performs a disk sync(ensuring that a message has been physically written to disk)
before sending the ACK back to a producer

5)cleanupInterval  默认值30000ms,当消息被消息者成功消费之后,Broker就可以将消息删除了。

6)checkpointInterval  默认值5s,每隔5s将内存中的Index(Metadata Cache)更新到磁盘的Index文件中(Metadata Store)

三, KahaDB存储底层实现简单分析

下图是KahaDB的Architecture:

从上图中可以看出:图中各个部分与KahaDB配置的存储目录下的文件是一 一对应的。

①在内存(cache)中的那部分B-Tree是Metadata Cache

通过将索引缓存到内存中,可以加快查询的速度(quick retrival of message data)。但是需要定时将 Metadata Cache 与 Metadata Store同步。

这个同步过程就称为:check point。checkpointInterval选项 决定每隔多久时间进行一次checkpoint操作。

②BTree Indexes则是保存在磁盘上的,称为Metadata Store,它对应于文件db.data,它就是对Data Logs以B树的形式 索引。

有了它,Broker(消息服务器)可以快速地重启恢复,因为它是消息的索引,根据它就能恢复出每条消息的location。

如果Metadata Store被损坏,则只能扫描整个Data Logs来重建B树了,这个过程是很复杂且缓慢的。

The presence of the metadata store, however, enables the broker instance to restart rapidly.
If the metadata store got damaged or was accidentally deleted, the broker could recover by reading the data logs,
but the restart would then take a considerable length of time.

③Data Logs则对应于文件 db-*.log,默认是32MB

Data Logs以日志形式存储消息,它是生产者生产的数据的真正载体。

The data logs are used to store data in the form of journals,
where events of all kinds—messages, acknowledgments, subscriptions, subscription cancellations, transaction boundaries, etc.
---are stored in a rolling log

④Redo Log则对应于文件 db.redo

redo log的原理用到了“Double Write”。关于“Double Write”可参考

简要记录下自己的理解:因为磁盘的页大小与操作系统的页大小不一样,磁盘的页大小一般是16KB,而OS的页大小是4KB。而数据写入磁盘是以磁盘页大小为单位进行的,即一次写一个磁盘页大小,这就需要4个OS的页大小(4*4=16)。如果在写入过程中出现故障(突然断电)就会导致只写入了一部分数据(partial page write)

而采用了“Double Write”之后,将数据写入磁盘时,先写到一个Recovery Buffer中,然后再写到真正的目的文件中。在ActiveMQ的源码PageFile.java中有相应的实现。

扩展知识:Linux中的日志文件系统:因为Linux的 ext文件系统采用索引节点来存储文件的元数据,每次数据写入磁盘之后,需要更新索引节点表。而写入磁盘与更新索引节点表并不是“原子操作”,比如,在数据写入磁盘后,系统发生故障,之前写入的数据就再也找不到了。

因此,日志文件系统给Linux系统增加了一层安全性:数据写入存储设备之前,先将数据(或者只将索引节点信息写日志)写入到临时文件中,该临时文件称日志。如果在数据写入时发生故障,还可以通过日志来进行一定的恢复。

四,参考文档

activeMQ 的kahadb存储引擎分析

【ActiveMQ Tuning】KahaDB Optimization

KahaDB Overview

JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储的更多相关文章

  1. C++动态存储方式与静态存储方式

    如果从变量值存在的时间(即生存期)来分,可将程序中的变量分为:动态存储方式和静态存储方式.它们所占用的存储空间区域不同. C++存储空间区域 代码区:存放可执行程序的程序代码.静态存储区:存放静态变量 ...

  2. JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系

    一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...

  3. JMS学习七(ActiveMQ之Topic的持久订阅)

    非持久化订阅持续到它们订阅对象的生命周期.这意味着,客户端只能在订阅者活动时看到相关主题发布的消息.如果订阅者不活动,它会错过相关主题的消息.如果花费较大的开销,订阅者可以被定义为durable(持久 ...

  4. JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息

    ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...

  5. [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据

    Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...

  6. Python3编写网络爬虫08-数据存储方式一-文件存储

    数据存储 用解析器解析出数据之后,就是存储数据了.保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如TXT JSON CSV等.另外还可以保存到数据库中,如关系型数据库MySQL 非关系型数 ...

  7. iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2

    目       录 1.      概述... 1 2.      平台演示... 2 3.      存储方式... 2 4.      设备状态和用电状态监控驱动... 3 1.   概述 本次升 ...

  8. JMS学习(六)-ActiveMQ的高可用性实现

    原文地址:http://www.cnblogs.com/hapjin/p/5663024.html 一,ActiveMQ高可用性的架构 ActiveMQ的高可用性架构是基于Master/Slave 模 ...

  9. JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))

    一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...

随机推荐

  1. Fuck me 忘记改REDO 造成复制用户超级慢

    . 一个用户的测试环境, 想着复制用户进行功能和单点性能测试. 但是用户数据量较大,见图 2. 发现在测试环境里面复制一个用户 大概耗时2小时20min的时间, 测试虚拟机的配置: 最开始注意到awr ...

  2. Linux预处理、编译、汇编、链接和运行的过程(包括一些基本的命令)

    转自Quinn0918的博客 一.预编译 1.将所有的#define删除,并展开所有的宏定义: 2.处理所有的预编译指令,例如:#if,#elif,#else,#endif; 3.处理#include ...

  3. python学习笔记五——数据结构

    4 . python的数据结构 数据结构是用来存储数据的逻辑结构,合理使用数据结构才能编写出优秀的代码.python提供的几种内置数据结构——元组.列表.字典和序列.内置数据结构是Python语言的精 ...

  4. Delphi中根据分类数据生成树形结构的最优方法

    一. 引言:    TreeView控件适合于表示具有多层次关系的数据.它以简洁的界面,表现形式清晰.形象,操作简单而深受用户喜爱.而且用它可以实现ListView.ListBox所无法实现的很多功能 ...

  5. C# region指令和控制台清零

    region指令 有的时候,为了完成一个需求,可能会写几十行.几百行.甚至几千行代码. 当代码数量非常多的时候,尽管你可以使用很详细的注释来帮助阅读,但也不太容易分清楚哪些代码在干什么事情. 因此,C ...

  6. Markdown 文件转化为work文档

    1. 电脑安装pandoc 链接:https://pan.baidu.com/s/12H5wLO0JWph5TjrbeJI6mg 密码:ssgs 下载安装包解压即可用.记得配置系统环境变量 2.命令行 ...

  7. 构建squid代理服务器

    基本概念 本文使用squid代理服务 软件介绍:百度百科 作为应用层的代理服务软件,Squid主要提供缓存加速.应用层过滤控制的功能: 工作机制:缓存网页对象,减少重复请求(HTTP代理的缓存加速对象 ...

  8. BZOJ2803[Poi2012]Prefixuffix——hash

    题目描述 对于两个串S1.S2,如果能够将S1的一个后缀移动到开头后变成S2,就称S1和S2循环相同.例如串ababba和串abbaab是循环相同的.给出一个长度为n的串S,求满足下面条件的最大的L: ...

  9. BZOJ1304 CQOI2009叶子的染色(树形dp)

    令f[i]表示i子树内最少染色次数,加上012状态分别表示该子树内叶节点已均被满足.存在黑色叶节点未被满足.存在白色叶节点未被满足,考虑i节点涂色情况即可转移.事实上贪心也可以. #include&l ...

  10. 07 zabbix之map拓扑标签中macro应用

    zabbix之map拓扑标签中macro应用 请先预习网地图map : 请点击 macro官方文档介绍 : 请点击 1.  Map labels(拓扑图标签)主要注意以下Macros(宏):  MAC ...