一,介绍

自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. Angular service定义服务

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...

  2. 使用Hexo搭建Github静态博客

    1. 环境环境 1.1 安装Git 默认配置就好 1.2 安装node.js 下载:http://nodejs.org/download/ 安装时直接保持默认配置即可. 2. 配置Github 1.1 ...

  3. [转] python 模块学习 hashlib

    转自: http://www.cnblogs.com/BeginMan/p/3328172.html 一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 ...

  4. k8s 1.9 安装

    测试环境 主机 系统 master CentOS 7.3 node CentOS 7.3 2.关闭selinux(所有节点都执行) [root@matser ~]# getenforce Disabl ...

  5. NCO

    NCO 摘自百度百科 (数字振荡器) 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . 数字控制振荡器(NCO,numerically controlled oscillator)是 ...

  6. Luogu3804 【模板】后缀自动机(后缀自动机)

    建出parent树统计即可.开始memcpy处写的是sizeof(son[y]),然后就T掉了……还是少用这种东西吧. 同时也有SA做法.答案子串一定是名次数组中相邻两个串的lcp.单调栈统计其是几个 ...

  7. JavaScript无法运行问题

    [出现问题] JavaScript代码在html页面可以正常运行,在js文件夹下无法正常运行 [解决方案] 根据网上查的和自己错误的原因总结下. 1.引用Js的路径不对 ../ 表示上一级目录开始 . ...

  8. Lights inside a 3d Grid UVA - 11605(概率)

    题意: 给出一个n * m * h的空间 每次任意选择两个点  使得在以这两个点连线为对角线的空间的点的值 取反  (初始为0) 求经过k次操作后最后有多少点的值为1 解析: 遇到坐标分维去看  把三 ...

  9. 【转】ls 命令的 20 个实用范例

    Linux中一个基本命令是ls.没有这个命令,我们会在浏览目录条目时会遇到困难.这个命令必须被每个学习Linux的人知道. ls是什么 ls命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上 ...

  10. 软Raid50制作

    =====创建Raid50的步骤====== 1.创建分区[root@localhost ~]# fdisk /dev/sdb[root@localhost ~]# fdisk /dev/sdc[ro ...