Active MQ的持久化

MQ的高可用:
1、事务
2、持久
3、签收

前3个都是MQ本身的特性,如果MQ出现了故障,上面的3个就无法保证了
4、可持久化

只有第4个可持久化才能保证高可用,通常来说,执行持久化的机器要和安装MQ的机器分开,才能保证不会产生事故

V5.3用的是Kaha DB
V5.9用的是Apache ZooKeeper

ActiveMQ的消息持久化机制有JDBC,AMQ,KahaDB和LevelDB

就是发送者将消息发送出去以后,消息中心首先将消息存储到本地数据文件,内存数据库或者远程数据库,再试图将消息发送给接收者,成功则将消息从存储中删除,失败则继续尝试发送

消息中心启动以后首先要检查指定的存储位置,如果有未发送成功的消息,则需要把消息发送出去

KahaDB:以日志文件存储消息,默认存储路径是active-mq的data目录下
在这里插入图片描述

消息存储使用一个事务日志和仅仅用一个索引文件来存储它的所有地址,数据会被追加到data/log中,当不再需要log文件中的数据的时候,log文件会被丢弃

db-1.log 会将消息存储到这个文件中,当一个数据文件已满的时候,新的文件会随之创建,number数值也会随之递增,当不再有引用到数据文件中的任何消息时,文件会被删除或归档

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

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

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

lock 文件锁,表示当前获得KahaDB读写权限的broker

MQ+MYSQL

1、将mysql-connector-java.jar放到apache-activemq-5.16.1/lib目录下面
2、修改apache-activemq-5.16.1/conf/activemq.xml文件
dataSource指定要引用的持久化数据库的bean名称
createTableOnStartup是否在启动MQ的时候创建数据表,默认都是true,我们可以在第一次启动的时候设置为true,后面的时候设置为false

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

3、配置自己的数据库的用户名和地址:

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

如下图所示:
在这里插入图片描述
4、进入mysql数据库,创建db_activemq数据库
5、重启ActiveMQ,查看是否会在db_activemq库里面新建3张表,期间我在启动的时候报错了,百度以后发现是配置文件的问题,具体可以参考这个链接:https://www.cnblogs.com/shihaiming/p/6015808.html
原因是因为配置文件里面这个:class="org.apache.commons.dbcp.BasicDataSource"改成class="org.apache.commons.dbcp2.BasicDataSource"就好了
在这里插入图片描述

6、如果我们设置DeliveryMode为NON_PERSISTENCE时,消息被保存在内存中,如果设置为PERSISTENCE时,消息保存在broker的相应的文件或者数据库中
7、数据库只是一种持久化方式,它会将消息存储到数据库,一旦被消费掉,就没有了
8、如果是queue,在消费者没有消费的情况下,会将消息保存到activemq_msgs表中,只要有任意一个消费者消费过了,这些消息就会被删除,如果是topic,消息会保存到activemq_acks中

ActiveMQ Journal

使用高速缓存技术,大大提高了性能,如果消费者的消费速度能够跟上生产者消息的生产速度时,journal文件能够大大减少需要写入到DB中的消息

比如:如果生产者生产了1000条消息,这1000条消息会保存在journal中,如果消费者消费的速度足够快的情况下,在journal文件还没有同步到DB之前,消费者已经消费了90%的消息,那么这个时候只需要同步剩余的10%的消息到DB

如果消费者的消费速度很慢,这个时候journal文件可以是使消息以批量的方式写到DB

修改activemq.xml(在我们配置mysql的连接下面配置):

<persistenceFactory>
    <journalPersistenceAdapterFactory 
        journalLogFiles="4"
        journalLogFileSize="32768"
        useJournal="true"
        useQuickJournal="true"
        dataSource="#mysql-ds"
        dataDirectory="activemq-data"/>         
</persistenceFactory>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值