JMS之——ActiveMQ高可用集群安装、配置(基于ZooKeeper + LevelDB的伪集群)

ActiveMQ的单节点安装请参见博文《JMS之——ActiveMQ的安装与配置(单机版)

1、 ActiveMQ 集群部署规划

环境: CentOS 6.5 x64 、 JDK7
版本: ActiveMQ 5.14.4
ZooKeeper 集群环境: 192.168.50.132:2181,192.168.50.133:2182,192.168.50.134:2183
(ZooKeeper 集群部署请参考《Dubbo之——Dubbo 注册中心集群Zookeeper-3.4.9的安装、 配置》)

主机 集群端口 消息端口 控制台端口 节点安装目录
192.168.1.101 63631 53531 8361 /usr/local/activemq/node-01
192.168.1.101 63632 53532 8362 /usr/local/activemq/node-02
192.168.1.101 63633 53533 8363 /usr/local/activemq/node-03

2、 防火墙打开对应的端口

  1. ## mq cluster  
  2. -A INPUT -m state –state NEW -m tcp -p tcp –dport 8361 -j ACCEPT  
  3. -A INPUT -m state –state NEW -m tcp -p tcp –dport 8362 -j ACCEPT  
  4. -A INPUT -m state –state NEW -m tcp -p tcp –dport 8363 -j ACCEPT  
  5. -A INPUT -m state –state NEW -m tcp -p tcp –dport 53531 -j ACCEPT  
  6. -A INPUT -m state –state NEW -m tcp -p tcp –dport 53532 -j ACCEPT  
  7. -A INPUT -m state –state NEW -m tcp -p tcp –dport 53533 -j ACCEPT  
  8. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63631 -j ACCEPT  
  9. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63632 -j ACCEPT  
  10. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63633 -j ACCEPT  
  11. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63631 -j ACCEPT  
## mq cluster
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8361 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8362 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8363 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53531 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53532 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53533 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63631 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63632 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63633 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63631 -j ACCEPT

3、 分别在三台主机中创建/usr/local/activemq 目录

  1. &nbsp;mkdir&nbsp;/usr/local/activemq&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_2_845570" name="code" class="plain" style="display: none;"> mkdir /usr/local/activemq上传 apache-activemq-5.14.4-bin.tar.gz 到/usr/local/activemq 目录

    4、 解压并按节点命名

    1. &nbsp;cd&nbsp;/usr/local/activemq&nbsp;&nbsp;</span></span></li><li class=""><span> tar -xvf apache-activemq-5.14.4-bin.tar.gz  
    2. &nbsp;mv&nbsp;apache-activemq-5.14.4&nbsp;node-0X&nbsp;#(X&nbsp;代表节点号&nbsp;1、&nbsp;2、&nbsp;3,&nbsp;下同)&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_3_4084173" name="code" class="plain" style="display: none;"> cd /usr/local/activemq tarxvfapacheactivemq5.14.4bin.tar.gz mv apache-activemq-5.14.4 node-0X #(X 代表节点号 1、 2、 3, 下同)

      5、 修改jetty.xml

      修改管理控制台端口(默认为 8161) 可在 conf/jetty.xml 中修改, 如下:
      Node-01 管控台端口:

      1. <bean id=“jettyPort” class=“org.apache.activemq.web.WebConsolePort” init-method=“start”>  
      2.     <!– the default port number for the web console –>  
      3.     <property name=“host” value=“0.0.0.0”/>  
      4.     <property name=“port” value=“8361”/>  
      5. </bean>  
      <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="8361"/>
      </bean>
      Node-02 管控台端口:
      1. <bean id=“jettyPort” class=“org.apache.activemq.web.WebConsolePort” init-method=“start”>  
      2.     <!– the default port number for the web console –>  
      3.     <property name=“host” value=“0.0.0.0”/>  
      4.     <property name=“port” value=“8362”/>  
      5. </bean>  
      <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="8362"/>
      </bean>
      Node-03 管控台端口:
      1. <bean id=“jettyPort” class=“org.apache.activemq.web.WebConsolePort” init-method=“start”>  
      2.     <!– the default port number for the web console –>  
      3.     <property name=“host” value=“0.0.0.0”/>  
      4.     <property name=“port” value=“8363”/>  
      5. </bean>  
      <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="8363"/>
      </bean>

      6、 集群配置

      在 3 个 ActiveMQ 节点中配置 conf/activemq.xml 中的持久化适配器。修改其中 bind、 zkAddress、hostname 和 zkPath。 注意: 每个 ActiveMQ 的 BrokerName 必须相同,否则不能加入集群。
      Node-01 中的持久化配置:

      1. <broker xmlns=“http://activemq.apache.org/schema/core” brokerName=“DubboEdu2” dataDirectory={activemq.data}"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;kahaDB&nbsp;directory="{activemq.data}/kahadb”/ –>  
      2.         <replicatedLevelDB  
      3.         directory={activemq.data}/leveldb"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicas</span><span>=</span><span class="attribute-value">"3"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bind</span><span>=</span><span class="attribute-value">"tcp://0.0.0.0:63631"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkAddress</span><span>=</span><span class="attribute-value">"192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">hostname</span><span>=</span><span class="attribute-value">"edu-mq-01"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkPath</span><span>=</span><span class="attribute-value">"/activemq2/leveldb-stores"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">broker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_7_6166534" name="code" class="html" style="display: none;">&lt;broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2" dataDirectory="{activemq.data}”> <persistenceAdapter> <!– kahaDB directory=” activemq.data/kahadb/><replicatedLevelDBdirectory= {activemq.data}/leveldb” replicas=”3” bind=”tcp://0.0.0.0:63631” zkAddress=”192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183” hostname=”edu-mq-01” zkPath=”/activemq2/leveldb-stores” /> </persistenceAdapter> </broker>Node-02 中的持久化配置:
        1. <broker xmlns=“http://activemq.apache.org/schema/core” brokerName=“DubboEdu2” dataDirectory={activemq.data}"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;kahaDB&nbsp;directory="{activemq.data}/kahadb”/ –>  
        2.         <replicatedLevelDB  
        3.         directory={activemq.data}/leveldb"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicas</span><span>=</span><span class="attribute-value">"3"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bind</span><span>=</span><span class="attribute-value">"tcp://0.0.0.0:63632"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkAddress</span><span>=</span><span class="attribute-value">"192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">hostname</span><span>=</span><span class="attribute-value">"edu-mq-01"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkPath</span><span>=</span><span class="attribute-value">"/activemq2/leveldb-stores"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">broker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_8_7976677" name="code" class="html" style="display: none;">&lt;broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2" dataDirectory="{activemq.data}”> <persistenceAdapter> <!– kahaDB directory=” activemq.data/kahadb/><replicatedLevelDBdirectory= {activemq.data}/leveldb” replicas=”3” bind=”tcp://0.0.0.0:63632” zkAddress=”192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183” hostname=”edu-mq-01” zkPath=”/activemq2/leveldb-stores” /> </persistenceAdapter> </broker>Node-03 中的持久化配置:
          1. <broker xmlns=“http://activemq.apache.org/schema/core” brokerName=“DubboEdu2” dataDirectory={activemq.data}"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;kahaDB&nbsp;directory="{activemq.data}/kahadb”/ –>  
          2.         <replicatedLevelDB  
          3.         directory={activemq.data}/leveldb"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicas</span><span>=</span><span class="attribute-value">"3"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bind</span><span>=</span><span class="attribute-value">"tcp://0.0.0.0:63633"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkAddress</span><span>=</span><span class="attribute-value">"192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">hostname</span><span>=</span><span class="attribute-value">"edu-mq-01"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkPath</span><span>=</span><span class="attribute-value">"/activemq2/leveldb-stores"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">broker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_9_3167128" name="code" class="html" style="display: none;">&lt;broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2" dataDirectory="{activemq.data}”> <persistenceAdapter> <!– kahaDB directory=” activemq.data/kahadb/><replicatedLevelDBdirectory= {activemq.data}/leveldb” replicas=”3” bind=”tcp://0.0.0.0:63633” zkAddress=”192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183” hostname=”edu-mq-01” zkPath=”/activemq2/leveldb-stores” /> </persistenceAdapter> </broker>修改各节点的消息端口(注意,避免端口冲突):
            Node-01 中的消息端口配置:
            1. <transportConnectors>  
            2.     <!– DOS protection, limit concurrent connections to 1000 and frame size to 100MB –>  
            3.     <transportConnector name=“openwire” uri=“tcp://0.0.0.0:53531?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            4.     <transportConnector name=“amqp” uri=“amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            5.     <transportConnector name=“stomp” uri=“stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            6.     <transportConnector name=“mqtt” uri=“mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            7.     <transportConnector name=“ws” uri=“ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            8. </transportConnectors>  
            <transportConnectors>
                <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
                <transportConnector name="openwire" uri="tcp://0.0.0.0:53531?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            </transportConnectors>
            Node-02 中的消息端口配置:
            1. <transportConnectors>  
            2.     <!– DOS protection, limit concurrent connections to 1000 and frame size to 100MB –>  
            3.     <transportConnector name=“openwire” uri=“tcp://0.0.0.0:53532?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            4.     <transportConnector name=“amqp” uri=“amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            5.     <transportConnector name=“stomp” uri=“stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            6.     <transportConnector name=“mqtt” uri=“mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            7.     <transportConnector name=“ws” uri=“ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            8. </transportConnectors>  
            <transportConnectors>
                <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
                <transportConnector name="openwire" uri="tcp://0.0.0.0:53532?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            </transportConnectors>
            Node-03 中的消息端口配置:
            1. <transportConnectors>  
            2.     <!– DOS protection, limit concurrent connections to 1000 and frame size to 100MB –>  
            3.     <transportConnector name=“openwire” uri=“tcp://0.0.0.0:53533?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            4.     <transportConnector name=“amqp” uri=“amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            5.     <transportConnector name=“stomp” uri=“stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            6.     <transportConnector name=“mqtt” uri=“mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            7.     <transportConnector name=“ws” uri=“ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            8. </transportConnectors>  
            <transportConnectors>
                <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
                <transportConnector name="openwire" uri="tcp://0.0.0.0:53533?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            </transportConnectors>

            7、 按顺序启动 3 个 ActiveMQ 节点

            1. &nbsp;/usr/local/activemq/node-01/bin/activemq&nbsp;start&nbsp;&nbsp;</span></span></li><li class=""><span> /usr/local/activemq/node-02/bin/activemq start  
            2. &nbsp;/usr/local/activemq/node-03/bin/activemq&nbsp;start&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_13_9742610" name="code" class="plain" style="display: none;"> /usr/local/activemq/node-01/bin/activemq start /usr/local/activemq/node02/bin/activemqstart /usr/local/activemq/node-03/bin/activemq start

              8、集群的节点状态分析

              集群启动后对 ZooKeeper 数据的抓图,可以看到 ActiveMQ 的有 3 个节点,分别是 00000000000,00000000001, 00000000002。
              以下第一张图展现了 00000000000 的值,可以看到 elected 的值是不为空,说明这个节点是 Master,其他两个节点是 Slave。

              9、 集群可用性测试

              ActiveMQ 的客户端只能访问 Master 的 Broker,其他处于 Slave 的 Broker 不能访问。所以客户端连接 Broker 应该使用 failover 协议。

              1. failover:(tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:53533)?randomize=false  
              failover:(tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:53533)?randomize=false

              10、 集群高可用测试

              当一个 ActiveMQ 节点挂掉,或者一个 ZooKeeper 节点挂掉, ActiveMQ 服务依然正常运转。如果仅剩一个 ActiveMQ 节点,因为不能选举 Master, ActiveMQ 不能正常运转; 同样的,如果 ZooKeeper 仅剩一个节点活动,不管 ActiveMQ 各节点是否存活, ActiveMQ 也不能正常提供服务。

              11、 设置开机启动

              1. # vi /etc/rc.local  
              2. /usr/local/activemq/node-01/bin/activemq start  
              3. /usr/local/activemq/node-02/bin/activemq start  
              4. /usr/local/activemq/node-03/bin/activemq start  
              # vi /etc/rc.local
              /usr/local/activemq/node-01/bin/activemq start
              /usr/local/activemq/node-02/bin/activemq start
              /usr/local/activemq/node-03/bin/activemq start

ActiveMQ的单节点安装请参见博文《JMS之——ActiveMQ的安装与配置(单机版)

1、 ActiveMQ 集群部署规划

环境: CentOS 6.5 x64 、 JDK7
版本: ActiveMQ 5.14.4
ZooKeeper 集群环境: 192.168.50.132:2181,192.168.50.133:2182,192.168.50.134:2183
(ZooKeeper 集群部署请参考《Dubbo之——Dubbo 注册中心集群Zookeeper-3.4.9的安装、 配置》)

主机 集群端口 消息端口 控制台端口 节点安装目录
192.168.1.101 63631 53531 8361 /usr/local/activemq/node-01
192.168.1.101 63632 53532 8362 /usr/local/activemq/node-02
192.168.1.101 63633 53533 8363 /usr/local/activemq/node-03

2、 防火墙打开对应的端口

  1. ## mq cluster  
  2. -A INPUT -m state –state NEW -m tcp -p tcp –dport 8361 -j ACCEPT  
  3. -A INPUT -m state –state NEW -m tcp -p tcp –dport 8362 -j ACCEPT  
  4. -A INPUT -m state –state NEW -m tcp -p tcp –dport 8363 -j ACCEPT  
  5. -A INPUT -m state –state NEW -m tcp -p tcp –dport 53531 -j ACCEPT  
  6. -A INPUT -m state –state NEW -m tcp -p tcp –dport 53532 -j ACCEPT  
  7. -A INPUT -m state –state NEW -m tcp -p tcp –dport 53533 -j ACCEPT  
  8. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63631 -j ACCEPT  
  9. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63632 -j ACCEPT  
  10. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63633 -j ACCEPT  
  11. -A INPUT -m state –state NEW -m tcp -p tcp –dport 63631 -j ACCEPT  
## mq cluster
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8361 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8362 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8363 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53531 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53532 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53533 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63631 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63632 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63633 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63631 -j ACCEPT

3、 分别在三台主机中创建/usr/local/activemq 目录

  1. &nbsp;mkdir&nbsp;/usr/local/activemq&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_2_845570" name="code" class="plain" style="display: none;"> mkdir /usr/local/activemq上传 apache-activemq-5.14.4-bin.tar.gz 到/usr/local/activemq 目录

    4、 解压并按节点命名

    1. &nbsp;cd&nbsp;/usr/local/activemq&nbsp;&nbsp;</span></span></li><li class=""><span> tar -xvf apache-activemq-5.14.4-bin.tar.gz  
    2. &nbsp;mv&nbsp;apache-activemq-5.14.4&nbsp;node-0X&nbsp;#(X&nbsp;代表节点号&nbsp;1、&nbsp;2、&nbsp;3,&nbsp;下同)&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_3_4084173" name="code" class="plain" style="display: none;"> cd /usr/local/activemq tarxvfapacheactivemq5.14.4bin.tar.gz mv apache-activemq-5.14.4 node-0X #(X 代表节点号 1、 2、 3, 下同)

      5、 修改jetty.xml

      修改管理控制台端口(默认为 8161) 可在 conf/jetty.xml 中修改, 如下:
      Node-01 管控台端口:

      1. <bean id=“jettyPort” class=“org.apache.activemq.web.WebConsolePort” init-method=“start”>  
      2.     <!– the default port number for the web console –>  
      3.     <property name=“host” value=“0.0.0.0”/>  
      4.     <property name=“port” value=“8361”/>  
      5. </bean>  
      <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="8361"/>
      </bean>
      Node-02 管控台端口:
      1. <bean id=“jettyPort” class=“org.apache.activemq.web.WebConsolePort” init-method=“start”>  
      2.     <!– the default port number for the web console –>  
      3.     <property name=“host” value=“0.0.0.0”/>  
      4.     <property name=“port” value=“8362”/>  
      5. </bean>  
      <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="8362"/>
      </bean>
      Node-03 管控台端口:
      1. <bean id=“jettyPort” class=“org.apache.activemq.web.WebConsolePort” init-method=“start”>  
      2.     <!– the default port number for the web console –>  
      3.     <property name=“host” value=“0.0.0.0”/>  
      4.     <property name=“port” value=“8363”/>  
      5. </bean>  
      <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="8363"/>
      </bean>

      6、 集群配置

      在 3 个 ActiveMQ 节点中配置 conf/activemq.xml 中的持久化适配器。修改其中 bind、 zkAddress、hostname 和 zkPath。 注意: 每个 ActiveMQ 的 BrokerName 必须相同,否则不能加入集群。
      Node-01 中的持久化配置:

      1. <broker xmlns=“http://activemq.apache.org/schema/core” brokerName=“DubboEdu2” dataDirectory={activemq.data}"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;kahaDB&nbsp;directory="{activemq.data}/kahadb”/ –>  
      2.         <replicatedLevelDB  
      3.         directory={activemq.data}/leveldb"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicas</span><span>=</span><span class="attribute-value">"3"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bind</span><span>=</span><span class="attribute-value">"tcp://0.0.0.0:63631"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkAddress</span><span>=</span><span class="attribute-value">"192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">hostname</span><span>=</span><span class="attribute-value">"edu-mq-01"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkPath</span><span>=</span><span class="attribute-value">"/activemq2/leveldb-stores"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">broker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_7_6166534" name="code" class="html" style="display: none;">&lt;broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2" dataDirectory="{activemq.data}”> <persistenceAdapter> <!– kahaDB directory=” activemq.data/kahadb/><replicatedLevelDBdirectory= {activemq.data}/leveldb” replicas=”3” bind=”tcp://0.0.0.0:63631” zkAddress=”192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183” hostname=”edu-mq-01” zkPath=”/activemq2/leveldb-stores” /> </persistenceAdapter> </broker>Node-02 中的持久化配置:
        1. <broker xmlns=“http://activemq.apache.org/schema/core” brokerName=“DubboEdu2” dataDirectory={activemq.data}"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;kahaDB&nbsp;directory="{activemq.data}/kahadb”/ –>  
        2.         <replicatedLevelDB  
        3.         directory={activemq.data}/leveldb"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicas</span><span>=</span><span class="attribute-value">"3"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bind</span><span>=</span><span class="attribute-value">"tcp://0.0.0.0:63632"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkAddress</span><span>=</span><span class="attribute-value">"192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">hostname</span><span>=</span><span class="attribute-value">"edu-mq-01"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkPath</span><span>=</span><span class="attribute-value">"/activemq2/leveldb-stores"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">broker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_8_7976677" name="code" class="html" style="display: none;">&lt;broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2" dataDirectory="{activemq.data}”> <persistenceAdapter> <!– kahaDB directory=” activemq.data/kahadb/><replicatedLevelDBdirectory= {activemq.data}/leveldb” replicas=”3” bind=”tcp://0.0.0.0:63632” zkAddress=”192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183” hostname=”edu-mq-01” zkPath=”/activemq2/leveldb-stores” /> </persistenceAdapter> </broker>Node-03 中的持久化配置:
          1. <broker xmlns=“http://activemq.apache.org/schema/core” brokerName=“DubboEdu2” dataDirectory={activemq.data}"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comments">&lt;!--&nbsp;kahaDB&nbsp;directory="{activemq.data}/kahadb”/ –>  
          2.         <replicatedLevelDB  
          3.         directory={activemq.data}/leveldb"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">replicas</span><span>=</span><span class="attribute-value">"3"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">bind</span><span>=</span><span class="attribute-value">"tcp://0.0.0.0:63633"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkAddress</span><span>=</span><span class="attribute-value">"192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">hostname</span><span>=</span><span class="attribute-value">"edu-mq-01"</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="attribute">zkPath</span><span>=</span><span class="attribute-value">"/activemq2/leveldb-stores"</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="tag">&lt;/</span><span class="tag-name">persistenceAdapter</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">broker</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_9_3167128" name="code" class="html" style="display: none;">&lt;broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu2" dataDirectory="{activemq.data}”> <persistenceAdapter> <!– kahaDB directory=” activemq.data/kahadb/><replicatedLevelDBdirectory= {activemq.data}/leveldb” replicas=”3” bind=”tcp://0.0.0.0:63633” zkAddress=”192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183” hostname=”edu-mq-01” zkPath=”/activemq2/leveldb-stores” /> </persistenceAdapter> </broker>修改各节点的消息端口(注意,避免端口冲突):
            Node-01 中的消息端口配置:
            1. <transportConnectors>  
            2.     <!– DOS protection, limit concurrent connections to 1000 and frame size to 100MB –>  
            3.     <transportConnector name=“openwire” uri=“tcp://0.0.0.0:53531?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            4.     <transportConnector name=“amqp” uri=“amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            5.     <transportConnector name=“stomp” uri=“stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            6.     <transportConnector name=“mqtt” uri=“mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            7.     <transportConnector name=“ws” uri=“ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            8. </transportConnectors>  
            <transportConnectors>
                <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
                <transportConnector name="openwire" uri="tcp://0.0.0.0:53531?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            </transportConnectors>
            Node-02 中的消息端口配置:
            1. <transportConnectors>  
            2.     <!– DOS protection, limit concurrent connections to 1000 and frame size to 100MB –>  
            3.     <transportConnector name=“openwire” uri=“tcp://0.0.0.0:53532?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            4.     <transportConnector name=“amqp” uri=“amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            5.     <transportConnector name=“stomp” uri=“stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            6.     <transportConnector name=“mqtt” uri=“mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            7.     <transportConnector name=“ws” uri=“ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            8. </transportConnectors>  
            <transportConnectors>
                <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
                <transportConnector name="openwire" uri="tcp://0.0.0.0:53532?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            </transportConnectors>
            Node-03 中的消息端口配置:
            1. <transportConnectors>  
            2.     <!– DOS protection, limit concurrent connections to 1000 and frame size to 100MB –>  
            3.     <transportConnector name=“openwire” uri=“tcp://0.0.0.0:53533?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            4.     <transportConnector name=“amqp” uri=“amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            5.     <transportConnector name=“stomp” uri=“stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            6.     <transportConnector name=“mqtt” uri=“mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            7.     <transportConnector name=“ws” uri=“ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600”/>  
            8. </transportConnectors>  
            <transportConnectors>
                <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
                <transportConnector name="openwire" uri="tcp://0.0.0.0:53533?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
                <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
            </transportConnectors>

            7、 按顺序启动 3 个 ActiveMQ 节点

            1. &nbsp;/usr/local/activemq/node-01/bin/activemq&nbsp;start&nbsp;&nbsp;</span></span></li><li class=""><span> /usr/local/activemq/node-02/bin/activemq start  
            2. &nbsp;/usr/local/activemq/node-03/bin/activemq&nbsp;start&nbsp;&nbsp;</span></li></ol></div><pre code_snippet_id="2409224" snippet_file_name="blog_20170521_13_9742610" name="code" class="plain" style="display: none;"> /usr/local/activemq/node-01/bin/activemq start /usr/local/activemq/node02/bin/activemqstart /usr/local/activemq/node-03/bin/activemq start

              8、集群的节点状态分析

              集群启动后对 ZooKeeper 数据的抓图,可以看到 ActiveMQ 的有 3 个节点,分别是 00000000000,00000000001, 00000000002。
              以下第一张图展现了 00000000000 的值,可以看到 elected 的值是不为空,说明这个节点是 Master,其他两个节点是 Slave。

              9、 集群可用性测试

              ActiveMQ 的客户端只能访问 Master 的 Broker,其他处于 Slave 的 Broker 不能访问。所以客户端连接 Broker 应该使用 failover 协议。

              1. failover:(tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:53533)?randomize=false  
              failover:(tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:53533)?randomize=false

              10、 集群高可用测试

              当一个 ActiveMQ 节点挂掉,或者一个 ZooKeeper 节点挂掉, ActiveMQ 服务依然正常运转。如果仅剩一个 ActiveMQ 节点,因为不能选举 Master, ActiveMQ 不能正常运转; 同样的,如果 ZooKeeper 仅剩一个节点活动,不管 ActiveMQ 各节点是否存活, ActiveMQ 也不能正常提供服务。

              11、 设置开机启动

              1. # vi /etc/rc.local  
              2. /usr/local/activemq/node-01/bin/activemq start  
              3. /usr/local/activemq/node-02/bin/activemq start  
              4. /usr/local/activemq/node-03/bin/activemq start  
              # vi /etc/rc.local
              /usr/local/activemq/node-01/bin/activemq start
              /usr/local/activemq/node-02/bin/activemq start
              /usr/local/activemq/node-03/bin/activemq start

猜你喜欢

转载自blog.csdn.net/qq_33384065/article/details/79174827