JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储
一,介绍
自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 Tuning】KahaDB Optimization
JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储的更多相关文章
- C++动态存储方式与静态存储方式
如果从变量值存在的时间(即生存期)来分,可将程序中的变量分为:动态存储方式和静态存储方式.它们所占用的存储空间区域不同. C++存储空间区域 代码区:存放可执行程序的程序代码.静态存储区:存放静态变量 ...
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系
一,消息的持久化和非持久化 ①DeliveryMode 这是传输模式.ActiveMQ支持两种传输模式:持久传输和非持久传输(persistent and non-persistent deliver ...
- JMS学习七(ActiveMQ之Topic的持久订阅)
非持久化订阅持续到它们订阅对象的生命周期.这意味着,客户端只能在订阅者活动时看到相关主题发布的消息.如果订阅者不活动,它会错过相关主题的消息.如果花费较大的开销,订阅者可以被定义为durable(持久 ...
- JMS学习(八)-ActiveMQ Consumer 使用 push 还是 pull 获取消息
ActiveMQ是一个消息中间件,对于消费者而言有两种方式从消息中间件获取消息: ①Push方式:由消息中间件主动地将消息推送给消费者:②Pull方式:由消费者主动向消息中间件拉取消息.看一段官网对P ...
- [ Android 五种数据存储方式之四 ] —— ContentProvider存储数据
Android这个系统和其他的操作系统还不太一样,我们需要记住的是,数据在Android当中是私有的,当然这些数据包括文件数据和数据库数据以及一些其他类型的数据.那这个时候有读者就会提出问题,难道两个 ...
- Python3编写网络爬虫08-数据存储方式一-文件存储
数据存储 用解析器解析出数据之后,就是存储数据了.保存的形式可以多种多样,最简单的形式是直接保存为文本文件,如TXT JSON CSV等.另外还可以保存到数据库中,如关系型数据库MySQL 非关系型数 ...
- iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2
目 录 1. 概述... 1 2. 平台演示... 2 3. 存储方式... 2 4. 设备状态和用电状态监控驱动... 3 1. 概述 本次升 ...
- JMS学习(六)-ActiveMQ的高可用性实现
原文地址:http://www.cnblogs.com/hapjin/p/5663024.html 一,ActiveMQ高可用性的架构 ActiveMQ的高可用性架构是基于Master/Slave 模 ...
- JMS学习十一(ActiveMQ Consumer高级特性之独有消费者(Exclusive Consumer))
一.简介 Queue中的消息是按照顺序被分发到consumers的.然而,当你有多个consumers同时从相同的queue中提取消息时, 你将失去这个保证.因为这些消息是被多个线程并发的处理.有的时 ...
随机推荐
- [日常工作] Linux与Windows的连接访问以及数据共享等方法 vncserver smb xshell xftp winscp mount等
日常办公机器是用 windows, 但是越来越多的测试和工作需求需要使用linux. 这里以最常用的系统centos为例进行说明 1. 远程连接 ssh的方式 建议使用xmange 系列的 xshel ...
- shell of leetcode
1.Tenth Line How would you print just the 10th line of a file? For example, assume that file.txt has ...
- “一战通offer”互联网实习季编程挑战
1.字符串变形 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形.首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把 ...
- JavaScript中的Date对象在IOS中的“大坑”
在IOS5以上版本(不包含IOS5)中的Safari浏览器能正确解释出Javascript中的 new Date('2013-10-21') 的日期对象. 但是在IOS5版本里面的Safari解释ne ...
- Java关于struts2框架
今天研究了一下struts2框架,我不太喜欢理论的东西,我研究框架更喜欢打断点一步步跟着去看实现的过程.
- delphi7调用数据库连接属性
背景:连接数据库用ADOQuery控件,但是程序一旦编译完成,如果想更改数据库连接设置还得重新修改ADOQuery的属性重新编译 如果可以在程序中可以随时设置ADOQuery的属性则会方便很多. 实现 ...
- mysql 8.0,运行springboot项目配置:
1.修改pom.xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connecto ...
- MyBatis学习(七)MyBatis关联映射之多对多映射
对于数据库中的多对多关系建议使用一个中间表来维护关系. 1.创建四张表,分别为用户表,商品表,订单表,中间表. DROP TABLE IF EXISTS `t_user`; CREATE TABLE ...
- Django-website 程序案例系列-13 中间件
自定义中间件1: from django.utils.deprecation import MiddlewareMixin # 中间件需要引用的包 class Row1(MiddlewareMixin ...
- BZOJ2795&2890&3647[Poi2012]A Horrible Poem——hash
题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<= ...