如何保证MQ的高可用?或者如何保证JMS的可靠性 对于诸如此类的回答,大致可以从四个方面进行回答:
- 1.持久性(persistent)
- 2.事务
- 3.签收(Acknowledge)
- 4.可持久化
其中前三点是MQ中间件内部实现方式,一旦MQ发生故障,该如何保持MQ的高可用?我们做一下假设,如果有一种机制可以和MQ实现同步,将MQ中的信息同步到数据库,本地硬盘,u盘之类的外部设备,那么当MQ发生故障,就保证了MQ的可靠性,保证消息不会丢失
1.引出正文
为了避免意外宕机后信息的丢失,需要做到重启后回复消息队列,消息系统一般都会采用持久化机制,ActiveMQ采用持久化的机制有:
- JDBC
- AMQ
- kahaDB
- LevelDB
无论是那种方式,消息的存储逻辑都是一致的,即发送者将消息发出后,消息中心首先将消息存储到本地数据文件,内存数据库,或者远程数据库等,再试图将消息发送给接收者,成功则将消息从存储中删除,失败则继续尝试发送,消息中心启动以后首先要检查指定的存储位置,如果有未发送成功的消息,则需要把消息发送出去
2.AMQ
此种方式已经被淘汰,不需要过多介绍

3.kahaDB-默认消息存储

我们打开控制台,之所以能够看到Queue和topic里的消息记录,就是因为MQ采用了某种存储机制,比如kahaDB,才能从消息存储中拿出数据展示给我们
简介:
kahaDB是基于日志文件,是ActiveMQ5.4开始默认的存储方式,可用于任何场景,消息存储使用一个
事务日志和仅仅用一个索引文件来存储它所有的地址

数据存储在这个文件夹下,我用的是阿里云服务器,我给出我的data路径:
/myactivemq/apache-activemq-5.15.12/data/kahadb
我们列出这个文件下的目录树
-rw-r--r-- 1 root root 33554432 Apr 7 18:13 db-1.log
-rw-r--r-- 1 root root 106496 Apr 7 18:13 db.data
-rw-r--r-- 1 root root 21 Apr 7 18:13 db.free
-rw-r--r-- 1 root root 86176 Apr 7 18:13 db.redo
-rw-r--r-- 1 root root 8 Apr 7 18:12 lock
3.1 db-.log


3.2 db.data

和mysql数据库一样,db.data相当于myISAM中的索引文件,db.log就相当于myISAM中的数据文件,根据索引找数据文件中的数据,这就是上文我们提到的事务日志和索引文件
3.3 db.free

3.4 db.redo
类似于一种容灾技术

3.5 lock

本文探讨了MQ的高可用性保障措施,重点介绍了ActiveMQ的四种持久化机制:JDBC、AMQ、kahaDB和LevelDB。其中,kahaDB作为ActiveMQ默认的消息存储方式,通过事务日志和索引文件确保消息的可靠存储与恢复。
6694

被折叠的 条评论
为什么被折叠?



