ActiveMQ_持久化策略_C_2021-03-05

编号说明
C_2021-03-05第一次创建

这篇博客讲解ActiveMQ的持久化策略。

持久化策略

KahaDB

KahaDB是ActiveMQ默认的持久化策略,他是一个文件型数据库。所有消息顺序添加到一个日志文件中,同时另外有一个索引文件记录指向这些日志的存储地址,还有一个事务日志用于消息回复操作。是一个专门针对消息持久化的解决方案,它对典型的消息使用模式进行了优化。
在activemq.xml中,persistenceAdapter是用来配置出久华策略的。
kahadb持久化配置信息

使用这个持久化策略时,在data/kahadb/这个文件夹下,生成如下文件:

  1. db.data
    这个文件是消息的索引文件,本质上是B-Tree,使用B-Tree作为索引指向db-*.log里面存储的消息。
  2. db.redo
    用来恢复数据的log
  3. db-*.log
    消息数据。db.log默认32M大小,当达到阀值后,会创建新的文件,编号就是db-1.log,db-2.log
  4. lock
    文件锁,用来记录当前获得kahadb读写权限的broker ,用于在集群环境下的竞争处理。

上述常见的配置内容:

<persistenceAdapter> 
	<!--directory:保存数据的目录;journalMaxFileLength:保存消息的文件大小 --> 
	<kahaDB directory="${activemq.data}/kahadb" journalMaxFileLength="16mb"/> 
</persistenceAdapter>

对于KahaDB这种持久化策略而言,他具有一下特点:

  1. 通过日志形式存储信息;
  2. 信息索引通过B-Tree结构存储,可以快速更新;
  3. 完全支持JMS事务;
  4. 支持多种恢复机制

详细配置信息KahaDB配置

AMQ

只适用于 5.3 版本之前。 AMQ 也是一个文件型数据库,消息信息最终是存储在文件中。内存中也会有缓存数据。

<persistenceAdapter> 
	<!--directory:保存数据的目录;maxFileLength:保存消息的文件大小 --> 
	<amqPersistenceAdapter directory="${activemq.data}/amq" maxFileLength="32mb"/> 
</persistenceAdapter>

AMQ这种持久化策略性能高于 JDBC,写入消息时,会将消息写入日志文件,由于是顺序追加写,性能很高。创建消息主键索引,并且提供缓存机制,进一步提升性能。每个日志文件的大小都是有限制的(默认 32m,可自行配置),当超过这个大小,系统会重新建立一个文件。
当所有的消息都消费完成,系统会删除这 个文件或者归档。
主要的缺点是 AMQ Message 会为每一个 Destination 创建一个索引,如果使用了大量的 Queue,索引文件的大小会占用很多磁盘空间。而且由于索引巨大,一旦 Broker崩溃,重建索引的速度会非常慢。 虽然 AMQ 性能略高于 Kaha DB 方式,但是由于其重建索引时间过长,而且索引文件占用磁盘空间过大,所以已经不推荐使用。

JDBC

在使用JDBC这种持久化策略的时候,需要配置两个地方。第一个,是在persistenceAdapter里配置对应的持久化策略,另外还需要配置目标数据库连接。
在使用JDBC持久化策略的时候,不需要手动新建表。ActiveMQ会在传递消息(开启持久化)的时候,自动在目标库中建表,并插入数据(message)。ActiveMQ会自动创建如下三个表。

  1. activemq_msgs:TOPIC和QUEUE中的信息都存在这个表中。
  2. activemq_acks:存储持久订阅的信息和最后一个持久订阅接收的消息ID。
  3. activemq_lock:跟kahadb的lock文件类似,确保数据库在某一时刻只有一个broker在访问(同样是用于解决集群环境下的竞争)。

在使用JDBC的时候,需要做如下配置。
先在persistenceAdapter中指明只用JDBC这种策略。

<persistenceAdapter>
    <!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
	<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="true" /> 
</persistenceAdapter>

上面配置中,mysql-ds是需要自己定义的,createTablesOnStartup属性,则是告诉ActiveMQ帮着进行建表。
下面是MySQL数据库对应的配置,也在activemq.xml中进行配置。

<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
    <property name="username" value="activemq"/>
    <property name="password" value="activemq"/>
    <property name="maxTotal" value="200"/>
    <property name="poolPreparedStatements" value="true"/>
  </bean>

上面这段配置是粘贴自ActiveMQ解压后的examples文件夹中的activemq-jdbc.xml文件。这个文件内还有其他数据库的链接方式。
总的来说,使用JDBC持久化策略的时候,需要在persistenceAdaptor里面先配置jdbcPersistenceAdaptor,然后在定义好数据库连接的Bean。

LevelDB

LevelDB持久化性能高于KahaDB,虽然目前默认的持久化方式仍然是KahaDB。并且,在ActiveMQ 5.9版本提供 了基于LevelDB和Zookeeper的数据复制方式,用于Master-slave方式的首选数据复制方案。 但是在ActiveMQ官网对LevelDB的表述:LevelDB官方建议使用以及不再支持,推荐使用的是KahaDB。

Memory

这个就是说,不进行持久化,只在内存中存储消息。在使用这个的时候,可以在broker节点中,添加上persistent=”false”,表示不设置持 久化存储。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值