ActiveMQ消息数据持久化
为了避免机器意外宕机,消息丢失。可进行对消息持久化操作,机器重启后恢复消息队列。ActiveMQ消息持久化机制有JDBC、AMQ、KahaDB和LevelDB。消息发送者将消息发送出去后,消息中心将消息数据存储到本地文件、本地内存或者数据库等。消息持久化操作后,消息中心启动后会先检查指定存储位置,如有未发送成功的消息,则继续将消息发送出去。
1).JDBC持久化方式
此持久化方式会在数据库创建3个表:activemq_msgs、activemq_acks、activemq_lock。activemq_msgs用于存储消息,Queue和Topic都存储于这个表中。
配置方式:
修改安装目录下的conf/activemq.xml文件。persistenceAdapter节点中配置。
</persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false" />
</persistenceAdapter>
2).AMQ方式
性能高于JDBC,消息会按顺序追加方式写入日志文件中,性能较高。为了提升性能,会创建消息主键索引。缺点是索引文件很大,需占用大量磁盘空间。如果broker崩溃,重建索引速度非常慢。每个日志文件大小有限定(默认32M)。超过此大小,会重新建立一文件。当所有消息消费完成,系统删除这个文件或进行规定(取决于配置)。
配置:
</persistenceAdapter>
<amqPersistenceAdapter directory="${activemq.data}/activemq-data" maxFileLength="32mb"/>
</persistenceAdapter>
索引重建时间长,占用磁盘空间大,此方式不推荐。
3).KafaDB方式
KafaDB持久化是ActiveMQ默认的持久化方式。KafaDB持久化和AMQ一样都是基于日志文件,但KafaDB方式恢复时间远少于AMQ方式,且使用更少的数据文件。优于AMQ方式持久化。
配置:
</persistenceAdapter>
<kahaDB directory="${activemq.data}/activemq-data" journalMaxFileLength="16mb"/>
</persistenceAdapter>
directory:指定消息持久化的存储目录。
journalMaxFileLength:指定保存消息日志文件大小。
4).LevelDB方式
ActiveMQ5.6版本后推出的LevelDB方式持久化。不过LevelDB方式性能要高于KafaDB,后面很可能是这个趋势。
配置:
</persistenceAdapter>
<replicatedLevelDB directory="${activemq.data}/activemq-data" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="127.0.0.1:2181" zkSessionTimeout="2s" hostname="127.0.0.1" zkPath="/activemq/leveldb-stores"/>
</persistenceAdapter>