ActiceMQ详解 (13)

基于文件的存储机制,是以前的默认机制,现在不再使用。AMQ是一种文件存储形式,它具有写入速度快和容易恢复的特点。消息存储在一个个文件中,文件的默认大小为32M,当一个文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清除阶段这个文件会被删除。AMQ适用于ActiveMQ5.3之前的版本。

KahaDB

基于日志文件,从ActiveMQ5.4(含)开始默认的持久化,下面我们详细介绍。

LevelDB消息存储

新兴的技术,现在有些不确定。 官方文档:。这种文件系统是从ActiveMQ5.8之后引进的,它和KahaDB非常相似,也是基于文件的本地数据库存储形式,但是它提供比KahaDB更快的持久性。但它不使用自定义B-Tree实现来索引独写日志,而是使用基于LevelDB的索引,默认配置如下:

<persistenceAdapter> <levelDB directory="activemq-data"/> </persistenceAdapter>

JDBC消息存储

下面我们再详细介绍

JDBC Message Store with ActiveMQ Journal

下面我们再详细介绍

8.4 KahaDB消息存储

理解

KahaDB是目前默认的存储方式,可用于任何场景,提高了性能和恢复能力。消息存储使用一个 事务日志 和仅仅用一个 索引文件 来存储它所有的地址。KahaDB是一个专门针对消息持久化的解决方案,它对典型的消息使用模型进行了优化。数据被追加到data logs中。当不再需要log文件中的数据的时候,log文件会被丢弃。

官网文档:,官网上还有一些其他配置参数。

activemq.xml配置文件

<persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>

KahaDB存储原理

KahaDB在消息保存的目录中有4类文件和一个lock,跟ActiveMQ的其他几种文件存储引擎相比,这就非常简洁了。

image-20210118000120620

db-number.log KahaDB存储消息到预定大小的数据纪录文件中,文件名为db-number.log。当数据文件已满时,一个新的文件会随之创建,number数值也会随之递增,它随着消息数量的增多,如每32M一个文件,文件名按照数字进行编号,如db-1.log,db-2.log······。当不再有引用到数据文件中的任何消息时,文件会被删除或者归档。

image-20210118001312244

db.data 该文件包含了持久化的BTree索引,索引了消息数据记录中的消息,它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-number。log里面存储消息。

db.free 记录当前db.data文件里面哪些页面是空闲的,文件具体内容是所有空闲页的ID

db.redo 用来进行消息恢复,如果KahaDB消息存储再强制退出后启动,用于恢复BTree索引。

lock 文件锁,表示当前kahadb独写权限的broker。

8.4 JDBC消息存储

原理图

image-20210118002603363

配置

添加mysql数据库的驱动包到ActiveMQ的lib文件夹下

image-20210118003932035

在activemq.xml配置文件指定JDBC消息存储

<!-- <persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter> --> <persistenceAdapter> <!-- dataSource指定将要引用的持久化数据库的bean名称 createTablesOnStartup指定是否在启动的时候创建数据表,默认为true 注意:一般是第一次启动时设置为true,之后改为false --> <jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true"/> </persistenceAdapter>

在activemq.xml配置文件的标签和标签之间插入数据库连接池配置

注意:

① 我们需要准备一个mysql数据库,并创建一个名为activemq的数据库

② 默认是的dbcp数据库连接池,如果要换成其他数据库连接池,需要将该连接池jar包,也放到lib目录下。

... </broker> <bean destroy-method="close"> <property value="com.mysql.jdbc.Driver"/> <property value="jdbc:mysql://mpolaris.top:3306/activemq?relaxAutoCommit=true"/> <property value="root"/> <property value="123456"/> <property value="200" /> <property value="true"/> </bean> <import resource="jetty.xml"/> ...

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyysx.html