zoukankan      html  css  js  c++  java
  • 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方式的首数据复制选方案

      

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

  • 相关阅读:
    [转] linux 信号量之SIGNAL
    [转] 查看CPU使用率 top命令详解
    shell 脚本编程
    ToggleButton
    MultiAutoCompleteTextView
    AutoCompleteTextView
    IO流总结
    JavaWeb 案例——访问权限控制
    IO流之字符流
    File类
  • 原文地址:https://www.cnblogs.com/hzanyan/p/12156291.html
Copyright © 2011-2022 走看看