ActiveMQ 的可持久化(六)

将MQ 收到的消息存储到文件、硬盘、数据库 等、 则叫MQ 的持久化,这样即使服务器宕机,消息在本地还是有,仍就可以访问到。
官网 : http://activemq.apache.org/persistence
ActiveMQ 支持的消息持久化机制: 带赋值功能的 LeavelDB 、 KahaDB 、 AMQ 、 JDBC
持久化就是高可用的机制,即使服务器宕机了,消息也不会丢失

AMQ 是文件存储形式,写入快、易恢复 默认 32M 在 ActiveMQ 5.3 之后不再适用
KahaDB : 5.4 之后基于日志文件的持久化插件,默认持久化插件,提高了性能和恢复能力
KahaDB 的属性配置 : http://activemq.apache.org/kahadb
它使用一个事务日志和 索引文件来存储所有的地址

db-<数字>.log   存储数据,一个存满会再次创建  db-2  db-3 ……  ,当不会有引用到数据文件的内容时,文件会被删除或归档 

db.data    是一个BTree  索引,索引了消息数据记录的消息,是消息索引文件,它作为索引指向了 db-<x>.log 里的消息

  一点题外话:就像mysql 数据库,新建一张表,就有这个表对应的  .MYD  文件,作为它的数据文件,就有一个 .MYI  作为索引文件。

db.free   存储空闲页 ID   有时会被清除

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

lock  顾名思义就是锁       

      四类文件+一把锁   ==》  KahaDB    

LeavelDB : 希望作为以后的存储引擎,5.8 以后引进,也是基于文件的本地数据存储形式,但是比 KahaDB 更快 

它比KahaDB 更快的原因是她不使用BTree 索引,而是使用本身自带的 LeavelDB 索引  

  题外话:为什么LeavelDB  更快,并且5.8 以后就支持,为什么还是默认 KahaDB  引擎,因为 activemq 官网本身没有定论,LeavelDB   之后又出了可复制的LeavelDB   比LeavelDB  更性能更优越,但需要基于 Zookeeper  所以这些官方还没有定论,任就使用 KahaDB  

JDBC  :  有一部分数据会真实的存储到数据库中  

使用JDBC 的持久化,

  ①修改配置文件,默认 kahaDB 

修改之前:

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

修改之后:

<persistenceAdapter>
      <jdbcPersistenceAdapter dataSource="#mysql-ds"/>
 </persistenceAdapter>

 ②在activemq 的lib 目录下添加 jdbc 的jar 包    (connector.jar  我使用5.1.41 版本)

 ③  修改配置文件 : activemq.xml     使其连接自己windows 上的数据库,并在本地创建名为activemq 的数据库

 ④  让linux 上activemq 可以访问到 mysql ,之后产生消息。

    ActiveMQ 启动后会自动在 mysql 的activemq 数据库下创建三张表:activemq_msgs 、activemq_acks、activemq_lock   

      activemq_acks:用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存

activemq_lock:在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker

activemq_msgs:用于存储消息,Queue和Topic都存储在这个表中

  

 点对点会在数据库的数据表 ACTIVEMQ_MSGS 中加入消息的数据,且在点对点时,消息被消费就会从数据库中删除  

   但是对于主题,订阅方式接受到的消息,会在 ACTIVEMQ_MSGS 存储消息,即使MQ 服务器下线,并在 ACTIVEMQ_ACKS 中存储消费者信息 。 并且存储以 activemq 为主,当activemq 中的消息被删除后,数据库中的也会自动被删除。  

坑:

 JDBC 改进: 加入高速缓存机制  Journal 

  高速缓存在 activemq.xml 中的配置:

 持久化消息是指: 

MQ 所在的服务器down 了消息也不会丢失

持久化机制演化过程: 

从最初的AMQ Message Store 方案到 ActiveMQ V4版本推出的High  performance  journal (高性能事务)附件,并且同步推出了关系型数据库的存储方案, ActiveMQ 5.3 版本有推出了KahaDB 的支持,(也是5.4之后的默认持久化方案),后来ActiveMQ 从5.8开始支持LevelDB ,现在5.9 提供了 Zookeeper + LevelDB 的集群化方案。

ActiveMQ 消息持久化机制有: 

AMQ        基于日志文件

KahaDB   基于日志文件,5.4 之后的默认持久化

JDBC      基于第三方数据库

LevelDB :   基于文件的本地数据库存储,从5.8 之后推出了LevelDB   性能高于 KahaDB

ReplicatedLevelDB  Store     从5.8之后提供了基于LevelDB 和Zookeeper 的数据复制方式,用于Master-slave方式的首数据复制选方案

  

 但是无论使用哪种持久化方式,消息的存储逻辑都一样

原文地址:https://www.cnblogs.com/hzanyan/p/12156291.html