zoukankan      html  css  js  c++  java
  • 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包

    -- 整理于网络,加上自己的理解,大家一起学习,进步就好
  • 相关阅读:
    HDU4628+状态压缩DP
    Javascript 去掉字符串前后空格的五种方法
    Javascript 数组之判断取值和数组取值
    ASP.NET MVC 出现错误 “The view 'XXX' or its master was not found or no view engine support”
    ASP.NET MVC 页面调整并传递参数
    ASP.NET MV3 部署网站 报"Could not load file or assembly ' System.Web.Helpers “ 错的解决方法
    ASP.NET MVC 控制器向View传值的三种方法
    CSharp 如何通过拼接XML调用存储过程来查询数据
    SQLServer : EXEC和sp_executesql的区别
    关于SQLServer2005的学习笔记—异常捕获及处理
  • 原文地址:https://www.cnblogs.com/shulipeng/p/14840324.html
Copyright © 2011-2022 走看看