一,介绍

自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. Android控件第4类——ProgressBar

    ProgressBar是进度条,是比较常用的控件.它有一个抽象的子类——AbsSeekBar,AbsSeekBar有两个比较常用子类,SeekBar.RatingBar. 1.ProgressBar, ...

  2. linux shell << 注释多行

    #!/bin/bash #script name: a.sh #author: aaron <<EOF echo "line 1" echo "line 2& ...

  3. C# 之抽象类和抽象方法

    概述:abstract 关键字  抽象类不能被实例化,抽象方法不能有方法体,抽象类中的所有抽象方法必须在子类中重写(override ),一个抽象类可以同时包含抽象方法和非抽象方法. abstract ...

  4. 一个本科学生对Linux的认知

    我是一名大三的普通一本大学的软件工程的一名学生,学校开设了一些关于系统开发的课程,纸上得来终觉浅,学校的课程课时较短,想要在56个课时之内学会一些公司需要的技能,无疑是纸上谈兵,一门语言的学习,需要的 ...

  5. AJAX--总结

    AJAX 2018-9-6 14:42:53 AJAX简介 ​ HTTP协议------>HTTP权威指南 ​ 请求:客户端去向服务端请求一个文件 ​ 响应:服务端把对应的文件内容返回给客户端, ...

  6. Play on Words HDU - 1116(欧拉路判断 + 并查集)

    题意: 给出几个单词,求能否用所有的单词成语接龙 解析: 把每个单词的首字母和尾字母分别看作两个点u 和 v,输入每个单词后,u的出度++, v的入度++ 最后判断是否能组成欧拉路径 或 欧拉回路,当 ...

  7. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  8. Selenium之WebDriver元素定位方法

    Selenium WebDriver 只是 Python 的一个第三方框架, 和 Djangoweb 开发框架属于一个性质. webdriver 提供了八种元素定位方法,python语言中也有对应的方 ...

  9. MSSQL 转 ACCESS 在表格结构上应注意的

    今天在把一个MSSQL数据库转为ACCESS发现了一些问题: 在MSSQL表格中的一个(标识)递增字段转到ACCESS后,变成了 “数字”类型,而不是“自动编号”. 而当在Access中,一个字段类型 ...

  10. 上下文管理协议with_open,__enter__和__exit__(三十八)

    在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__ent ...