• 基于zookeeper(集群)+LevelDB的ActiveMq高可用集群安装、配置、测试


    一. zookeeper安装(集群):http://www.cnblogs.com/wangfajun/p/8692117.html 

    二. ActiveMq配置:

    1. ActiveMq集群部署规划:

      环境:Centos6.6、JDK1.7

      版本:ActiveMq 5.11.1

      zookeeper集群环境:10.0.70.12:2181、10.0.70.13:218210.0.70.14:2183

    主机 集群端口 消息端口 管控台端口 ActiveMq节点安装目录
    10.0.70.12 62621 51511 8161 /home/fajun/activemq/node-01
    10.0.70.13 62622 51512 8162 /home/fajun/activemq/node-02
    10.0.70.14 62623 51513 8163 /home/fajun/activemq/node-03

    2. 防火墙开放对应上表格管控台端口

    3. 分别在三台主机上创建/home/fajun/activemq目录

    $ mkdir /home/fajun/activemq

    4. 上传apache-activemq-5.11.1-bin.tar.gz到三台主机的/home/fajun/activemq目录下

    $ cd /home/fajun/activemq
    
    $ tar -zxvf apache-activemq-5.11.1-bin.tar.gz
    
    $ mv apache-activemq-5.11.1 node-0X(X代表节点0、1、2,下同)

    5. 修改三台主机管控台端口(/home/fajun/activemq/node-0X/conf/jetty.xml),默认端口8161:

    node-01管控台端口:

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
          <!-- the default port number for the web console -->
          <property name="host" value="0.0.0.0"/>
          <property name="port" value="8161"/>
    </bean>

    node-02管控台端口:

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
          <!-- the default port number for the web console -->
          <property name="host" value="0.0.0.0"/>
          <property name="port" value="8162"/>
    </bean>

     node-03管控台端口:

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
          <!-- the default port number for the web console -->
          <property name="host" value="0.0.0.0"/>
          <property name="port" value="8163"/>
    </bean>

     6. 集群配置:

    在3个ActiveMQ节点中配置conf/activemq.xml中的持久化适配器。

    修改其中bind、zkAddress、hostname和zkPath。

    注意:每个ActiveMQ的brokerName必须相同,否则不能加入集群。

    node-01中的持久化配置:

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}">
        <!--kahaDB directory="${activemq.data}/kahadb"/ -->
      <persistenceAdapter>   <replicatedLevelDB directory="${activemq.data}/leveldb"   replicas="3"    bind="tcp://0.0.0.0:62621"    zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183"    hostname="10.0.70.12"   zkPath="/activemq/leveldb-stores"   />
      </persistenceAdapter> </broker>

    node-02中的持久化配置:

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}">
        <!--kahaDB directory="${activemq.data}/kahadb"/ -->
      <persistenceAdapter>    <replicatedLevelDB directory="${activemq.data}/leveldb"    replicas="3"    bind="tcp://0.0.0.0:62622"    zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183"    hostname="10.0.70.13"    zkPath="/activemq/leveldb-stores"    />
      
    </persistenceAdapter>
    </broker>

     node-03中的持久化配置:

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="MandaoDubbo" dataDirectory="${activemq.data}">
        <!--kahaDB directory="${activemq.data}/kahadb"/ -->
      <persistenceAdapter>    <replicatedLevelDB directory="${activemq.data}/leveldb"    replicas="3"    bind="tcp://0.0.0.0:62623"    zkAddress="10.0.70.12:2181,10.0.70.13:2182,10.0.70.14:2183"    hostname="10.0.70.14"    zkPath="/activemq/leveldb-stores"    />
      </persistenceAdapter>
    </broker>
    7. 修改各节点的消息端口(注意,避免端口冲突),默认消息端口61616
    node-01中的消息端口配置:
    <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:51511?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    node-02中的消息端口配置:
    <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:51512?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>

     node-03中的消息端口配置:

    <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:51513?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>

    8.设置开机启动:

    # vi /etc/rc.local
    su - fajun -c '/home/fajun/activemq/node-01/bin/activemq start'
    su - fajun -c '/home/fajun/activemq/node-02/bin/activemq start'
    su - fajun -c '/home/fajun/activemq/node-03/bin/activemq start'

    9. 按顺序启动3个ActiveMq节点:

    $ /home/fajun/activemq/node-01/bin/activemq start
    $ /home/fajun/activemq/node-02/bin/activemq start
    $ /home/fajun/activemq/node-03/bin/activemq start
    监听日志:
    $ tail -f /home/fajun/activemq/node-01/data/activemq.log
    $ tail -f /home/fajun/activemq/node-02/data/activemq.log
    $ tail -f /home/fajun/activemq/node-03/data/activemq.log
    10.集群的节点状态分析:
    集群启动后对ZooKeeper数据的抓图,可以看到ActiveMQ的有3个节点,分别是000000000004,00000000003,00000000002。
    以下第一张图展现了00000000002的值,可以看到elected的值是不为空,说明这个节点是Master,其他两个节点是Slave。

    11. 集群可用性测试:

    ActiveMQ的客户端只能访问Master的Broker,其他处于Slave的Broker不能访问。

    所以客户端连接Broker应该使用failover协议:

    failover:(tcp://10.0.70.12:51511,tcp://10.0.70.13:51512,tcp://10.0.70.14:51513)?randomize=false
    Ps : ActiveMq(下面简称Mq节点)分为Master[主]、Slave[从]
    模拟场景1
    当前环境:10.0.70.12、10.0.70.13、10.0.70.14 上的Mq节点都是正常运行的(下面简称12、13、14),12是Master  
    模拟线上环境异常:停掉12上的Mq节点

    日志分析:12的Mq尝试重连,发现连不上,接着重连上了13上的Mq节点(说明13推举成了Master)继续消费,消息并没有中断,309是12还没宕掉时消费的的日志,310是新的Master(13)消费的日志。

    结论:集群环境中的某一个Mq节点宕掉,不影响消息消费

    模拟场景2

    当前环境:12的Mq节点已停、13上的Mq节点(Master正常运行,14上的Mq节点(Slave)正常运行

    模拟线上环境操作:停掉13上的Mq节点

    日志分析:控制台日志卡着不动了,没有任何消息能被消费

    结论:只有一台Mq节点正常运行,集群Mq推算不出新的Master,将会一直等集群中的其他Mq节点恢复

    模拟场景3

    当前环境:12、13上的Mq节点已停、14上的Mq节点(Slave)正常运行(场景2中,14上的Mq并没有被选为Master)

    模拟线上环境操作:启动13上的Mq节点

    现在14(Slave)是运行的,但此刻并没有选举出Master,我现在,

    日志分析:过了十几秒,重连上了14,然后继续消费

    结论:集群环境超过半数Mq节点运行正常,那么整个集群环境就是正常的

    上面是我们模拟了Mq节点出现问题,消息消费的一些情况,由于ActiveMQ集群的高可用,依赖于ZooKeeper集群的高可用,那么我们现在来模拟,zookeeper节点出现异常,将会对ActiveMq有什么影响

    Ps : zookeeper(下面简称zk节点) 分为Leader[主]、follower[从]
    模拟场景1
    当前环境:12、13、14上的zk节点、Mq节点都正常运行,13上的zk节点是Leader 、13上的Mq节点是Master
    模拟线上环境操作:停掉13上的zk节点:

    日志分析:14上的Mq节点变成了Master,继续消费消息,消息依然被连续消费

    结论:一台zk节点宕掉,虽然Mq会重新选举新的Master节点,单Mq节点不会出现异常,不影响Mq节点消费消息
    模拟场景2
    当前环境:12、14上的zk节点都正常运行,13上的zk节点已停 |  14上的Mq节点是Master,12、13上的Mq节点(Slave)运行正常
    模拟线上环境操作:停掉12上的zk节点:

    日志分析:控制台日志卡着不动了,linux上我看了下3台Mq节点的状态,发现14上的Mq节点也挂掉了

    结论:zk节点超过半数异常,则整个Mq集群环境将处于异常状态

    模拟场景2
    当前环境:12、13上的zk节点都停了,14上的zk节点运行正常 | 14上的Mq节点挂了,12、13上的Mq节点(Slave)运行正常
    模拟线上环境操作:启动12上的zk节点:

    日志分析:消费正常

    结论:超过半数zk节点运行正常,Mq集群环境也会运行正常

    模拟场景3
    当前环境:所有上的zk节点都是停掉了| 所有Mq节点运行异常
    模拟线上环境操作:依次启动所有zk节点:
    日志分析:没有任何消息被消费
    结论:当zk节点都处于异常状态,重启过后,Mq节点将运行异常,需要重启Mq节点,才能恢复。
     

    警告: 请使用者注意。replicatedLevelDB不支持延迟或者计划任务消息。

    这些消息存储在另外的LevelDB文件中,如果使用延迟或者计划任务消息,将不会复制到slave Broker上,不能实现消息的高可用。

  • 相关阅读:
    c++ 函数中的部分代码执行一次
    如何限制对象只能建立在堆上或者栈上
    FFMPEG Qt视频播放器
    C/C++中带可变参数的函数
    柔性数组
    压缩图片网站
    vscode存盘时格式化
    两个i标签之间有缝隙
    node 中process进程argv,argv0,execArgv,execPath
    chalk插件 使终端输出的字带颜色
  • 原文地址:https://www.cnblogs.com/wangfajun/p/8706498.html
Copyright © 2020-2023  润新知