ActiveMQ
ActiveMQ多节点集群
引入消息队列之后该如何保证其高可用性?
基于Zookeeper
和LevelDB
搭建ActiveMQ
集群,提供主备方式的高可用集群功能,避免单点故障。
三种集群方式:官网介绍
在ActiveMQ V5.6
版本之后推出LevelDB
的持久化引擎,它使用了自定义的索引代替常用的BTree
索引,其持久化性能高于KahaDB
,虽然默认的持久化方式还是KahaDB
,但是LevelDB
可能会是趋势。
在ActiveMQ V5.9
版本还提供了基于LevelDB
和Zookeeper
的数据复制方式,作为Master-Slave
方式的首选数据复制方案。
ZK+R LevelDB Store
从ActiveMQ V5.9
开始,ActiveMQ
的集群实现方式取消了传统的Master-Slave
方式,增加了基于Zookeeper
+LevelDB
的Master-Slave
实现方式,从V5.9
版本后也是官网推荐的。
原理说明:
使用Zookeeper
集群注册所有的ActiveMQ Broker
但只有其中一个Broker
可以提供服务,它将被视为Master
,其他Broker
处于待机状态被视为Slave
。
如果Master
因故障而不能提供服务ZooKeeper
会从Slave
中选举出一个Broker
充当Master
。
Slave
连接Master
并同步他们的存储状态,Slave
不接受客户端连接。所有存储操作都将被复制到连接至Master
的Slaves
。
如果Master
宕机,得到了最新更新的Slave
会成为Master
。故障节点在恢复会重新加入到集群中并连接Master
进入Slave
模式。
所有需要同步的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能算完成。
所以,如果你配置了replicas=3
,那么法定大小是(3/2+1)=2
。Master
将会存储并更新然后等待(2-1)=1
个Slave
存储和更新完成,才汇报success
。至于为什么是2-1
个,可以结合Zookeeper
的watch
机制、选举算法、原子广播ZAB
协议。
有一个节点要作为观察者存在,当一个新的Master
被选中,需要至少保障一个法定节点在线,以能够找到拥有最新状态的节点,这个节点才可以成为新的Master
。
部署规划和步骤
要求关闭防火墙并保证可以ping
通ActiveMQ
服务器,要求具备Zookeeper
集群并可以成功启动。
集群部署规划列表
主机 | Zookeeper集群端口 | AMQ集群Bind端口 | AMQ消息TCP端口 | 管理控制台端口 | AMQ安装目录 |
---|---|---|---|---|---|
192.168.1.132 | 2191 | bind=”tcp://0.0.0.0:63631” | 61616 | 8161 | /mq_node01 |
192.168.1.132 | 2192 | bind=”tcp://0.0.0.0:63632” | 61617 | 8162 | /mq_node02 |
192.168.1.132 | 2193 | bind=”tcp://0.0.0.0:63633” | 61618 | 8163 | /mq_node03 |
修改控制台端口
1 | <!--AMQ目录/conf/jetty.xml--> |
HostName映射
1 | hostname名字映射 |
brokerName一致
1 | <!--三个节点的brokerName要求全部一致--> |
持久化配置
三个节点的持久化配置要求一致,Bind根据不同MQ实例调整
1 | <persistenceAdapter> |
修改消息端口
修改activemq.xml
的消息协议的端口,调整为上述规划的端口。
然后按照顺序启动3个ActiveMQ
节点,前提是Zookeeper
集群已经成功启动运行。
zk集群的节点状态
1 | 进入任意一台zookeeper目录下的bin |
集群启动后对Zookeeper
数据抓图,可以看到ActiveMQ
的三个节点,分别是00000000000,00000000001,00000000002。
第二张图00000000000的值可以看到elected的值不为空,说明这个节点是Master
,其他两个是Slave
。
集群可用性测试
ActiveMQ
的客户端只能访问Master
的Broker
,其他处于Slave
的Broker
不能访问,所以客户端连接的Broker
应该使用failover
协议(失败转移)。
当一个ActiveMQ
节点挂掉或者一个Zookeeper
节点挂掉,ActiveMQ
服务依然正常运行,如果仅剩一个ActiveMQ
节点,由于不能选举Master
,所以ActiveMQ
不能正常运行。
同样的,如果Zookeeper
仅剩一个节点活动,不管ActiveMQ
各个节点存活与否,ActiveMQ
也不能正常提供服务,ActiveMQ
集群的高可用依赖于Zookeeper
集群的高可用。
1 | //BrokerURL调整 |
测试:3台机器中的ActiveMQ
只会有一个MQ可以被客户端连接使用,在测试时可以把Master
关掉,然后再重试客户端消息发送和消息还可以正常使用,则说明集群搭建正常。
最后更新: 2020年11月12日 12:20