分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)装配、配置、高可用测试

分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试

ActiveMQ 5.9 开始ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式增加了基于ZooKeeper + LevelDB Master-Slave实现方式其他两种方式目录共享数据库共享依然存在。 

三种集群方式的对比 

(1)基于共享文件系统KahaDB默认): 

<persistenceAdapter> 

<kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter> 

(2)基于 JDBC

 <bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/>

 <property name="url" value="jdbc:mysql://localhost:3306/amq?relaxAutoCommit=true"/> <property name="username" value="root"/>

 <property name="password" value="root"/> <property name="maxActive" value="20"/>

 <property name="poolPreparedStatements" value="true"/> </bean>

 <persistenceAdapter> 

<jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false"/>

 </persistenceAdapter>

 

 

(3)基于可复制的 LevelDB本文采用这种集群方式): 

LevelDB  Google开发的一套用于持久化数据的高性能类库。LevelDB并不是一种服务,用户需要自 行实现Server。是单进程的服务能够处理十亿级别规模Key-Value 型数据占用内存小。 

<persistenceAdapter> 

<replicatedLevelDB 

directory="${activemq.data}/leveldb" 

replicas="3" 

bind="tcp://0.0.0.0:62621" 

zkAddress="localhost:2181,localhost:2182,localhost:2183" 

hostname="localhost" 

zkPath="/activemq/leveldb-stores"/> 

</persistenceAdapter>

本文主要讲解基于 ZooKeeper 和LevelDB 搭建ActiveMQ 集群。集群仅提供主备方式的高可用集 群功能避免单点故障没有负载均衡功能。 

官方文档http://activemq.apache.org/replicated-leveldb-store.html 

集群原理图

分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)装配、配置、高可用测试

高可用的原理使用ZooKeeper集群注册所有的ActiveMQ Broker。只有其中的一个Broker 可以提供 服务被视为Master其他的Broker 处于待机状态被视为Slave。如果Master 因故障而不能提供服务

 ZooKeeper 会从 Slave中选举出一个 Broker充当 Master 

Slave 连接 Master并同步他们的存储状态Slave不接受客户端连接。所有的存储操作都将被复制到 

连接至 Master 的Slaves如果 Master 宕了得到了最新更新的 Slave 会成为 Master。故障节点在恢复后 

会重新加入到集群中并连接 Master 进入Slave 模式。 

所有需要同步的 disk 的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所如果你配置了replicas=3那么法定大小是(3/2)+1=2Master 将会存储并更新然后等待 (2-1)=1 Slave存储和更新完成才汇报 success至于为什么是 2-1熟悉 Zookeeper 的应该知道有一个 node要作为观擦者存在。当一个新的Master 被选中你需要至少保障一个法定node 在线以能够找到拥有最新 状态的node。这个node 可以成为新的Master。因此推荐运行至少3 个replica nodes以防止一个node失败了服务中断。原理与 ZooKeeper 集群的高可用实现方式类似

 

1ActiveMQ集群部署规划

 环境CentOS 6.6 x64 、JDK7 

版本ActiveMQ 5.11.1 

ZooKeeper 集群环境192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183

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

edu-zk-01:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8161 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 51511 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 62621 -j ACCEPT

edu-zk-02:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8162 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 51512 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 62622 -j ACCEPT

edu-zk-03:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8163 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 51513 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 62623 -j ACCEPT

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

# mkdir /home/yxq/activemq

上传 apache-activemq-5.11.1-bin.tar.gz 到/home/yxq/activemq 目录\

4、解压并按节点命名

# tar -xvf apache-activemq-5.11.1-bin.tar.gz

# cd /home/yxq/activemq 

# tar -xvf apache-activemq-5.11.1-bin.tar.gz

# mv apache-activemq-5.11.1 node-0X#(X代表节点号 123下同)

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

 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 中的持久化适配器。修改其中bindzkAddresshostname  zkPath注意每个 ActiveMQ  BrokerName 必须相同否则不能加入集群。

所有节点中activemq.xml配置

   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="DubboEdu" dataDirectory="${activemq.data}">

node-01 中的持久化配置:

 <persistenceAdapter>
                <!-- kahaDB directory="${activemq.data}/kahadb"/ -->
                <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62621" zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"
                         hostname="edu-zk-01" zkPath="/activemq/leveldb-stores"/>
 </persistenceAdapter>

node-02 中的持久化配置:

 <persistenceAdapter>
                <!-- kahaDB directory="${activemq.data}/kahadb"/ -->
                <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62622" zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"
                         hostname="edu-zk-02" zkPath="/activemq/leveldb-stores"/>
 </persistenceAdapter>

node-03 中的持久化配置:
 <persistenceAdapter>
                <!-- kahaDB directory="${activemq.data}/kahadb"/ -->
                <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:62623" zkAddress="192.168.1.81:2181,192.168.1.82:2182,192.168.1.83:2183"
                         hostname="edu-zk-03" zkPath="/activemq/leveldb-stores"/>
 </persistenceAdapter>

修改各节点的消息端口注意避免端口冲突):

 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>

7、按顺序启动 3 ActiveMQ节点:(zookeeper集群已经启动)

# /home/yxq/activemq/node-01/bin/activemq start

# /home/yxq/activemq/node-02/bin/activemq start

# /home/yxq/activemq/node-03/bin/activemq start

监听日志

 tail -f /home/yxq/activemq/node-01/data/activemq.log 

 tail -f /home/yxq/activemq/node-02/data/activemq.log 

 tail -f /home/yxq/activemq/node-03/data/activemq.log 

8、集群的节点状态分析

 集群启动后对 ZooKeeper 数据的抓图

分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)装配、配置、高可用测试

可以看到ActiveMQ 的有3 个节点分别是000000000000000000000100000000002

 我这里是 000000000050000000000600000000007

以下第一张图展现了 000000000005的值可以看到elected 的值是不为空说明这个节点是Master

 分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)装配、配置、高可用测试

其他两个节点是 Slave

分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)装配、配置、高可用测试



分布式架构高可用架构篇_02_activemq高可用集群(zookeeper+leveldb)装配、配置、高可用测试