activemq 高可用集群部署


目录
  • 环境准备
  • 服务器IP
  • 基于 jdbc 的集群方案
  • 基于 zookeeper + 可复制的 LevelDB 的集群部署
  • 常见问题

环境准备

  • activemq-5.16.2 安装包
  • 3台安装了 jdk1.8 的 centos 7.5 服务器
  • 1台安装了 mysql 的服务器 ( 基于 jdbc 的集群方案)
  • 3台安装了 zookeeper 的服务器集群 (基于 zookeeper + 可复制的 LevelDB 的集群方案)

服务器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. 在 节点后面增加数据源配置,内容如下:

      	
      	  
              
      	    
      	    
      	    
              
      	    
      	  
      
    2. 修改 里面的内容,修改之后内容如下:

      
           
      
      
  5. 修改 jetty.xml 以便其它机器可以访问到 8161 前台管理界面

    vi /usr/local/apache-activemq-5.16.2/conf/jetty.xml
    找到 
  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 需要修改为自己的 ,修改之后内容如下:

        
       
          
        
      
    3. 修改 jetty.xml 以便其它机器可以访问到 8161 前台管理界面

      vi /usr/local/apache-activemq-5.16.2/conf/jetty.xml
      找到 
  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包