activemq 高可用集群部署

环境准备

服务器IP

服务器 IP 域名
mysql-130 192.168.86.130
zk-100 192.168.86.100 zk-100.com
zk-101 192.168.86.101 zk-101.com
zk-102 192.168.86.102 zk-102.com
activemq-155 192.168.86.155 activemq-155.com
activemq-156 192.168.86.156 activemq-156.com
activemq-157 192.168.86.157 activemq-157.com

基于 jdbc 的集群方案

img

  1. 不特殊说明情况下,以下所有操作均在三台 activemq 服务器上操作

  2. 上传安装包到服务器的 /opt 目录

  3. 解压安装包,并且移动到 /usr/local 目录

    cd /opt
    tar -zxvf apache-activemq-5.16.2-bin.tar.gz
    mv apache-activemq-5.16.2 /usr/local/apache-activemq-5.16.2
    
  4. 修改 activemq.xml 配置

    cd /usr/local/apache-activemq-5.16.2/conf
    vi activemq.xml
    
    1. 在 节点后面增加数据源配置,内容如下:

      	<!-- 这里使用了activemq 自带的连接池,可以根据需要配置为其它连接池,但注意要在 /usr/local/apache-activemq-5.16.2/lib 引入相关连接池的包 -->
      	  <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
              <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      	    <property name="url" value="jdbc:mysql://192.168.86.130/activemq?relaxAutoCommit=true"/>
      	    <property name="username" value="root"/>
      	    <property name="password" value="root"/>
              <property name="maxTotal" value="200"/>
      	    <property name="poolPreparedStatements" value="true"/>
      	  </bean>
      
    2. 修改 里面的内容,修改之后内容如下:

      <persistenceAdapter>
          <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" /> 
      </persistenceAdapter>
      
  5. 修改 jetty.xml 以便其它机器可以访问到 8161 前台管理界面

    vi /usr/local/apache-activemq-5.16.2/conf/jetty.xml
    找到 <bean id="jettyPort" ... 的节点,修改 host 参数从 127.0.0.1到 0.0.0.0 
    
  6. 上传 mysql-connector-java-8.0.20.jar 到 /usr/local/apache-activemq-5.16.2/lib 目录下 (如果使用了其它连接池,则一并上传)

  7. 在数据库中创建一个 activemq 的数据库

    create database activemq
    
  8. 启动

    cd /usr/local/apache-activemq-5.16.2/bin
    ./activemq start
    
  9. 查看数据库是否自动生成了3张表

    ​ activemq_acks:订阅表

    ​ activemq_lock:用于记录当前哪台机器获取到了锁

    ​ activemq_msgs:持久化消息的存放表

  10. 查看日志

    cd /usr/local/apache-activemq-5.16.2/data
    tail -1000 activemq.log
    

    会发现除了master 之外,其它的两台 slave 都在尝试获取数据库锁

    image-20210601171200124

  11. 访问前台管理界面,会发现只有 master可以正常访问,其余两台 slave均无法访问

  12. 此时关闭 master,两台 slave 中一台会获取到锁,进而成为 master

基于 zookeeper + 可复制的 LevelDB 的集群部署

replicated-leveldb-store

  1. 不特殊说明情况下,以下所有操作均在三台 activemq 服务器上操作

  2. 上传安装包到服务器的 /opt 目录

  3. 解压安装包,并且移动到 /usr/local 目录

    cd /opt
    tar -zxvf apache-activemq-5.16.2-bin.tar.gz
    mv apache-activemq-5.16.2 /usr/local/apache-activemq-5.16.2
    
  4. 修改 activemq.xml 配置

    cd /usr/local/apache-activemq-5.16.2/conf
    vi activemq.xml
    
    1. 修改 节点的 brokerName属性,三台机器需要完全一样

    2. 修改 里面的内容,每台机器的 hostname 需要修改为自己的 ,修改之后内容如下:

       <!-- directory: 数据文件存放目录; replicas: 集群中节点数量,不能少于3; bind: 当此节点成为主节点时,它将绑定配置的地址和端口来为复制协议提供服务,支持动态端口;hostname:当此节点成为主节点时用于通告复制服务的主机名,支持自动获取 --> 
       <persistenceAdapter>
          <replicatedLevelDB
            directory="${activemq.data}"
            replicas="3"
            bind="tcp://0.0.0.0:0"
            zkAddress="zk-100.com:2181,zk-101.com:2181,zk-102.com:2181"
            zkPath="/activemq/leveldb-stores"
            hostname="activemq-155.com"
            />
        </persistenceAdapter>
      
    3. 修改 jetty.xml 以便其它机器可以访问到 8161 前台管理界面

      vi /usr/local/apache-activemq-5.16.2/conf/jetty.xml
      找到 <bean id="jettyPort" ... 的节点,修改 host 参数从 127.0.0.1到 0.0.0.0 
      
  5. 为了解决后续集群启动之后关闭之后出现的报错,可以先上传 failureaccess-1.0.1 jar包 到 /usr/local/apache-activemq-5.16.2/lib 目录下,可以等到后面真正报错的时候再执行

  6. 启动

    cd /usr/local/apache-activemq-5.16.2/bin
    ./activemq start
    
  7. 查看日志

    cd /usr/local/apache-activemq-5.16.2/data
    tail -1000 activemq.log
    

    ​ 如果只启动了一台的话,日志如下:

    image-20210601173457086

    ​ 如果启动两台到三台,会发现 slave 会从 master 中同步数据:

    image-20210601180131176

  8. 查看 zookeeper

    image-20210601183018263前台管理界面也只有 master 机器能够访问,关闭 master 之后,其中一个 slave 变为 master

    image-20210601183130487

常见问题

  1. 基于 jdbc 的集群启动时,抛出了 Cannot create PoolableConnectionFactory 以下异常:

    image-20210601164846415

    解决:在mysql 数据库中执行以下操作

    set time_zone=SYSTEM;
    set global time_zone='+8:00';
    flush privileges;
    
  2. 基于 zookeeper 的集群,master 宕机之后,集群启动报错:java.io.IOException:com/google/common/util/concurrent/internal/InternalFutureFailureAccess

    解决:上传 failureaccess-1.0.1 jar包

posted @ 2021-06-02 10:37  君子如珩~  阅读(605)  评论(0编辑  收藏  举报