一. 准备条件:
(1) 最好是有3台服务器【2台也行, 只是根据(replicas/2)+1 公式至少得2个ActiveMQ服务存在才能保证运行, 自己测试的时候麻烦点, 关掉其中一个, 再开启, 看会不会选举到另一个ActiveMQ服务, 多试几次可以看到效果】
(2) ActiveMQ安装参考: ActiveMQ
(3) ZooKeeper安装参考: ZooKeeper
二. 配置 :
ActiveMQ根目录下的conf/activemq.xml, 原来默认如下:
<persistenceAdapter> <kahaDB directory="${activemq.data}/kahadb"/> </persistenceAdapter>
修改为(hostname根据服务器不同做出改变, 其他配置相同):
<persistenceAdapter> <replicatedLevelDB directory="${activemq.data}/leveldb" replicas="3" bind="tcp://0.0.0.0:0" zkAddress="172.17.110.1:2181" zkPassword="password" hostname="172.17.110.1" sync="local_disk" zkPath="/activemq/leveldb-stores" /> </persistenceAdapter>
directory : 存储数据的路径
replicas : 集群中的节点数【(replicas/2)+1公式表示集群中至少要正常运行的服务数量】, 3台集群那么允许1台宕机, 另外两台要正常运行
bind : 当这个节点成为Master, 它会绑定配置好的地址和端口来履行主从复制协议
zkAddress : ZooKeeper的ip和port, 如果是集群, 则用逗号隔开(这里作为简单示例ZooKeeper配置为单点, 这样已经适用于大多数环境了, 集群也就多几个配置)
zkPassword : 当连接到ZooKeeper服务器时用的密码
hostname : 本机ip
sync : 在认为消息被消费完成前, 同步信息所存贮的策略, 如果有多种策略用逗号隔开, ActiveMQ会选择较强的策略(local_mem, local_disk则肯定选择存贮在本地硬盘)
zkPath : ZooKeeper选举信息交换的存贮路径
三. 测试
Step1 :
根据ZooKeeper的策略, 从三台ActiveMQ服务器选一台运行, 其他两台等待运行, 只是做数据上的主从同步。
所以, 启动ZooKeeper服务器和ActiveMQ服务器后, 访问http://172.17.110.1:8161/admin/ 、 http://172.17.110.2:8161/admin/、 http://172.17.110.3:8161/admin/ 只会有一个成功。
Step2 :
关闭能访问http://ip:8161/admin/的ActiveMQ服务, 访问其他两个, 其中有一个能访问, 说明ActiveMQ + ZooKeeper 集群高可用配置已经成功。
四. 参考文档
- ActiveMQ官网
- ZooKeeper官网