前言
本案例使用的是伪集群方式,即在一台主机上部署3个activemq服务(端口不同)+3个zookeeper服务(端口不同)。
真集群部署请看:ActiveMQ+ZooKeeper集群整合
如果需要了解ActiveMQ集群部署的整体概念,可以参考我这篇文章:ActiveMQ集群整体认识
原理简介:
一般在部署ActiveMQ集群的时候,更倾向于使用基于ZooKeeper的Replicated LevelDB Store方式,该方式是Master Slave部署方案的其中一种策略,也是在多台主机实现ActiveMQ集群的主流部署方式。 此教程只保证了高可用性。要想保证负载均衡得再结合Broker Clusters 部署方案,配置网络连接器。
工作流程:
在ZooKeeper中管理多个Broker节点,根据 Master选举策略让其中一个 Broker选举为Master(只有Master才具备对外提供服务的能力),剩下Broker为slave。
编码时,client端(消费者)通过failover协议来连接ActiveMQ集群。
一、服务端配置
1. ZooKeeper伪集群配置
-- | 服务端口 | 集群通信端口 | 节点目录/opt/下 |
---|---|---|---|
zk1 | 2181 | 2887:3887 | /zookeeper/zk1 |
zk2 | 2182 | 2888:3888 | /zookeeper/zk2 |
zk3 | 2183 | 2889:3889 | /zookeeper/zk3 |
集群通信端口:第一个端口是master和slave之间的通信端口,默认是2888;第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888。
在/opt/zookeeper下复制3个zookeeper服务,并分别配置它们的文件conf/zoo.cfg:
-
zk1:
zk1/conf/zoo.cfg:
# zookeeper的数据存储和日志存储目录(如果目录不存在就新建) dataDir=/opt/zookeeper/zk1/data dataLogDir=/opt/zookeeper/zk1/log #服务端口 clientPort=2181 # zk集群之间的通信地址 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889
创建
zk1/data/myid
文件,填入数字1:# 由于该zk1是server.1,所以在myid中设置数字1 $ vim /opt/zookeeper/zk1/data/myid
-
zk2:
zk2/conf/zoo.cfg:
# zookeeper的数据存储和日志存储目录(如果目录不存在就新建) dataDir=/opt/zookeeper/zk2/data dataLogDir=/opt/zookeeper/zk2/log #服务端口 clientPort=2182 # zk集群之间的通信地址 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889
创建
zk2/data/myid
文件,填入数字1:# 由于该zk2是server.2,所以在myid中设置数字2 $ vim /opt/zookeeper/zk2/data/myid
-
zk3:
zk3/conf/zoo.cfg:
# zookeeper的数据存储和日志存储目录(如果目录不存在就新建) dataDir=/opt/zookeeper/zk3/data dataLogDir=/opt/zookeeper/zk3/log #服务端口 clientPort=2183 # zk集群之间的通信地址 server.1=localhost:2887:3887 server.2=localhost:2888:3888 server.3=localhost:2889:3889
创建
zk3/data/myid
文件,填入数字3:# 由于该zk3是server.3,所以在myid中设置数字3 $ vim /opt/zookeeper/zk3/data/myid
1.2 分别启动zookeeper服务
$ /opt/zookeeper/zk1/bin/zkServer.sh start # 启动zk1服务
$ /opt/zookeeper/zk2/bin/zkServer.sh start # 启动zk2服务
$ /opt/zookeeper/zk3/bin/zkServer.sh start # 启动zk3服务
$ /opt/zookeeper/zk1/bin/zkServer.sh status # 查看zk1服务状态
$ /opt/zookeeper/zk2/bin/zkServer.sh status # 查看zk2服务状态
$ /opt/zookeeper/zk3/bin/zkServer.sh status # 查看zk3服务状态
2. ActiveMQ伪集群配置
2.1 修改ActiveMQ配置文件conf/activemq.xml
和conf/jetty.xml
-- | 服务端口 | jetty控制台端口 | 节点目录/opt/下 |
---|---|---|---|
node1 | 61616 | 8161 | /activemq/node1 |
node2 | 61617 | 8162 | /activemq/node2 |
node3 | 61618 | 8163 | /activemq/node3 |
在/opt/activemq/复制3个activemq服务,并分别配置它们的文件conf/activemq.xml和conf/jetty.xml:
conf/jetty.xml:
-
node1:
/opt/activemq/node1/conf/activemq.xml:
<!-- activemq支持5种协议:openwire、amqp、 stomp、mqtt、ws,这里我们只使用openwire协议,注释其它协议 --> <transportConnectors> <!-- node1服务端口使用默认端口61616 --> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?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> <!-- 持久化的部分为ZooKeeper集群连接地址--> <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="localhost:2181,localhost:2182,localhost:2183" zkPath="/opt/activemq/leveldb-stores" hostname="localhost" /> </persistenceAdapter> <!-- # directory: 存储数据的路径 # replicas:集群中的节点数【(replicas/2)+1公式表示集群中至少要正常运行的服务数量】,3台集群那么允许1台宕机, 另外两台要正常运行 # bind:当该节点成为master后,它将绑定已配置的地址和端口来为复制协议提供服务。还支持使用动态端口。只需使用tcp://0.0.0.0:0进行配置即可,默认端口为61616。 # zkAddress:ZK的ip和port, 如果是集群,则用逗号隔开(这里作为简单示例ZooKeeper配置为单点, 这样已经适用于大多数环境了, 集群也就多几个配置) # zkPassword:当连接到ZooKeeper服务器时用的密码,没有密码则不配置。 # zkPah:ZK选举信息交换的存贮路径,启动服务后actimvemq会到zookeeper上注册生成此路径 # hostname: ActiveMQ所在主机的IP # 更多参考:http://activemq.apache.org/replicated-leveldb-store.html -->
/opt/activemq/conf/jetty.xml:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <property name="host" value="0.0.0.0"/> <property name="port" value="8161"/> <!-- 在这里修改端口为8161,默认就是8161 --> </bean>
-
node2:
/opt/activemq/node2/conf/activemq.xml:
<transportConnectors> <!-- 服务端口改为61617 --> <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors> <!-- 持久化的部分为ZooKeeper集群连接地址--> <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="localhost:2181,localhost:2182,localhost:2183" zkPath="/opt/activemq/leveldb-stores" hostname="localhost" /> </persistenceAdapter>
/opt/activemq/conf/jetty.xml:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <property name="host" value="0.0.0.0"/> <property name="port" value="8162"/> <!-- 在这里修改端口为8162,默认是8161 --> </bean>
-
node3:
/opt/activemq/node3/conf/activemq.xml:
<transportConnectors> <!-- 服务端口改为61618 --> <transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors> <!-- 持久化的部分为ZooKeeper集群连接地址--> <persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="localhost:2181,localhost:2182,localhost:2183" zkPath="/opt/activemq/leveldb-stores" hostname="localhost" /> </persistenceAdapter>
/opt/activemq/node3/conf/jetty.xml:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"> <property name="host" value="0.0.0.0"/> <property name="port" value="8163"/> <!-- 在这里修改端口为8163,默认是8161 --> </bean>
2.2 依次启动activemq服务
$ /opt/activemq/node1/bin/activemq start # 启动节点node1服务
$ /opt/activemq/node2/bin/activemq start # 启动节点node2服务
$ /opt/activemq/node3/bin/activemq start # 启动节点node3服务
$ ps -ef|grep activemq # 检查进程是否运行,即activemq是否启动成功
$ netstat -anp|grep 61616 # 查看服务端口61616,监听情况
$ netstat -anp|grep 61617 # 查看服务端口61617,监听情况
$ netstat -anp|grep 61618 # 查看服务端口61618,监听情况
三、Client使用
该zookeeper+activemq的集群Master Slave部署方案,能够提供(3-1)/2的容错率,即3台服务器允许宕机一台,而不影响整个集群的对外提供服务。
编写代码连接时使用failover策略:
String url = failover:(tcp://192.168.100.142:61616,tcp://192.168.100.142:61617,tcp://192.168.100.142:61618)?initialReconnectDelay=1000
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。