一、原理:
官方文档:http://activemq.apache.org/replicated-leveldb-store.html
高可用的原理:使用 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=2。 Master 将会存储并更新然后等待 (2-1)=1 个Slave 存储和更新完成,才汇报 success。 至于为什么是 2-1,熟悉 Zookeeper 的应该知道,有一个 node要作为观擦者存在。当一个新的 Master 被选中,你需要至少保障一个法定 node 在线以能够找到拥有最新状态的 node。这个 node 可以成为新的 Master。因此,推荐运行至少 3 个 replica nodes,以防止一个 node失败了,服务中断。(原理与 ZooKeeper 集群的高可用实现方式类似
二、部署规划
1、ActiveMQ 集群部署规划
所需环境:jdk 1.8 CentOS7
2:建议将防火墙关闭,这样就无需操作添加的端口
3、 创建/usr/local/activemq 目录
分别在三台服务器中创建
上传activemq压缩文件至改目录下;
4、解压按节点命名;分别放在对应的服务器中
$ cd /usr/local/activemq
$ tar -xvf apache-activemq-5.14.4-bin.tar.gz
$ mv apache-activemq-5.14.4 node-0X #(X 代表节点号 1、 2、 3, 下同)
5、修改conf/jetty.xml
修改管理控制台端口(默认为 8161) 可在 conf/jetty.xml 中修改, 如下:
Node-01 管控台端口:
node-02 管控台端口:
node-03 管控台端口:
6:集群配置:
在 3 个 ActiveMQ 节点中配置 conf/activemq.xml 中的持久化适配器。修改其中 bind、 zkAddress、hostname 和 zkPath。 注意: 每个 ActiveMQ 的 BrokerName 必须相同,否则不能加入集群。
Node-01 中的持久化配置:
Node-02 中的持久化配置:
Node-03 中的持久化配置:
注意:添加或编辑.xml文件时,注意不能有空格,注释
要注意是
<!-- -->格式
其中:zkAddress:逗号分隔的ZooKeeper服务器列表 zkPath:主/从选举信息将被交换的ZooKeeper目录的路径。 hostname:本机名称(建议直接写ip)
以为我们这个是不同的ip所以消息端口无需更改,不会出现端口冲突现象;
7、 启动ActiveMQ并监听日志
可通过xshell同时启动这三个服务;
- $ /usr/local/activemq/node-01/bin/activemq start
- $ /usr/local/activemq/node-02/bin/activemq start
- $ /usr/local/activemq/node-03/bin/activemq start
接下来可通过访问控制台查看启动情况,若能够访问到其中一个控制台,则证明启动成功,反之不成功!
8、 集群可用性测试
ActiveMQ 的客户端只能访问 Master 的 Broker,其他处于 Slave 的 Broker 不能访问。所以客户端连接 Broker 应该使用 failover 协议。
通过编写代码时添加:
9、 集群高可用测试
当一个 ActiveMQ 节点挂掉,或者一个 ZooKeeper 节点挂掉, ActiveMQ 服务依然正常运转。如果仅剩一个 ActiveMQ 节点,因为不能选举 Master, ActiveMQ 不能正常运转; 同样的,如果 ZooKeeper 仅剩一个节点活动,不管 ActiveMQ 各节点是否存活, ActiveMQ 也不能正常提供服务。(ActiveMQ 集群的高可用,依赖于 ZooKeeper 集群的高可用。)
10、 设置开机启动
- # 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
四、高可用+负载均衡实现
Broker-Cluster 可以解实现载均衡,但当其中一个 Broker 突然宕掉的话,那么存在于该 Broker 上处于 Pending 状态的 message 将会丢失,无法达到高可用的目的。Master-Slave 与 Broker-Cluster 相结合的部署
[html] view plain copy
- <networkConnectors>
- <networkConnector uri="static:(tcp://192.168.40.132:61616,tcp://192.168.40.132:61617,tcp://192.168.40.132:61618)" duplex="false"/>
</networkConnectors>
[html] view plain copy
- <networkConnectors>
<networkConnector uri="static: (tcp://192.168.40.129:51511,tcp://192.168.40.130:51512,tcp://192.168.40.131:51513)" duplex="false"/>
</networkConnectors>
注:以上配置需配置到activemq.xml文件中 <persistenceAdapter>... </persistenceAdapter>节点上面,与其为同级节点,具体如下图:
其中,上面集群之间的配置中,每个node的activemq.xml都需要配置;
至此,所有配置完毕
参考:
http://blog.csdn.net/l1028386804/article/details/72595552
http://blog.csdn.net/l1028386804/article/details/72615194