【笔记于学习尚硅谷课程所作】
10、ActiveMQ多节点集群
基于ZooKeeper和LevelDB搭建ActiveMQ集群。集群仅提供主备方式的高可用集群功能,避免单点故障。
三种集群方式:基于sharedFileSystem共享文件系统(KahaDB)、基于JDBC、基于可复制的LevelDB
下面采用zookeeper+Replicated LevelDB Store(可复制的LevelDB)
10.1 集群原理图
原理说明:
使用ZooKeeper集群注册所有的ActiveMQ Broker但只有其中的一个Broker可以提供服务它将被视为Master,其他的Broker处于待机状态被视为Slave。
如果Master因故障而不能提供服务ZooKeeper会从Slave中选举出一个Broker充当Master。Slave连接Master并同步他们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到连接至Master的Slaves。
如果Master宕机得到了最新更新的Slave会成为Master。故障节点在恢复后会重新加入到集群中并连接Master进入Slave模式。
所有需要同步的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。
10.2 部署规划和步骤
- 配置环境(JDK,activemq等)
- 关闭防火墙
- 具备zookeeper集群并可以成功启动
- 建立集群部署规划列表
- 创建3台集群目录
- 修改管理控制台端口
- hostname名字映射
- ActiveMQ集群配置
- 修改各节点的消息端口
- 按顺序启动3各ActiveMQ节点
- zookeeper集群的节点状态说明
4.建立集群部署规划表
主机 | Zookeeper集群端口 | AMQ集群bind端口 | AMQ消息tcp端口 | 管理控制台端口 | AMQ节点安装目录 |
---|---|---|---|---|---|
192.168.111.136 | 2191 | bind=“tcp://0.0.0.0:63631” | 61616 | 8161 | /mq_cluster/mq_node01 |
192.168.111.136 | 2192 | bind=“tcp://0.0.0.0:63632” | 61617 | 8162 | /mq_cluster/mq_node02 |
192.168.111.136 | 2193 | bind=“tcp://0.0.0.0:63633” | 61618 | 8163 | /mq_cluster/mq_node03 |
5.创建3台集群目录
mkdir /mq_cluster/
cd /mq_cluster/
cp -r /opt/apache-activemq-5.15.9 mq_node01
cp -r mq_ node01 mq_ node02
cp -r mq_ node01 mq_ node03
6.修改管理控制台端口(修改conf/jetty.xml)
<!--只需要修改node2和node3即可-->
<!--修改jetty.xml中jettyPort中port的value-->
<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>
7.hostname名字映射(映射的名字随意)
vim /etc/hosts
#自己的IP 地址映射 例如
192.168.111.136 lfuser
8.ActiveMQ集群配置(修改activemq.xml)
(1)设置三个节点的BrokerName,要求一致
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="mybroker" dataDirectory="${activemq.data}">
(2)设置持久化配置
<!--将默认的kahaDB覆盖-->
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:63631"
zkAddress="localhost:2191,localhost:2192,localhost:2193"
hostname="lfuser"
sync="local_disk"
zkPath="/activemq/leveldb-stores"/>
</persistenceAdapter>
9.修改各节点的消息端口(修改activemq.xml)
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000& wireFormat.maxFrameSize=104857600"/>
使用集群后,生产者和消费者的代码改动
public static final String ACTIVEMQ_URL="failover:(tcp://192.168.111.136:61616, tcp://192.168.111.136:61617,tcp://192.168.111.136:61618)?randomize=false";