首先ActiveMQ集群是依赖于ZooKeeper集群而存在的,zookeeper的安装见zookeeper的部署
一、ActiveMQ集群原理
ActiveMQ集群原理,使用ZooKeeper集群注册所有的ActiveMQ Broker。只有其中的一个Broker可以对外提供服务,被视为master。而其他的Broker处于待机状态,被视为slave。而此时slave只是做数据的主从同步。
如果master因故障而不能提供服务,ZooKeeper集群会从slave中选举出一个Broker充当 master。slave连接 master并同步它们的存储状态,slave不接受客户端连接。所有的存储操作都将被复制到连接至master的slave上。
如果master宕机了,得到了最新更新的slave会成为master。而故障节点在恢复后会重新加入到集群中并连接 master进入slave模式。
需要同步的消息操作都将等待存储状态被复制到其他节点的操作完成后才能完成。
所以,如果你配置了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集群的高可用实现方式类似)。
至少需要三台机器,这三台机器都已经安装ActiveMQ服务,ZooKeeper集群也已经配置完毕。
这三台机器的IP分别为10.1.31.11,10.1.31.12,10.1.31.26。如下:
三台机器必须就是前面所提到的zookeeper集群
/usr/local/zookeeper/bin/zkServer.sh status
通过以上截图信息ZooKeeper集群也正常启动。
三、配置ActiveMQ集群
ActiveMQ集群的配置比较简单,我们只需要修改ActiveMQ的配置文件activemq.xml中部分内容即可。
三台服务器都需要同样的配置
ActiveMQ根目录下的conf/activemq.xml文件,原来默认内容如下:
vim conf/activemq.xml +81
需要更改
directory=”${activemq.data}/leveldb”
replicas=”3″
bind=”tcp://0.0.0.0:0″
zkAddress=”10.1.31.11:2181,10.1.31.12:2181,10.1.31.26:2181″
zkSessionTimeout=”4s”
hostname=”10.1.1.11″
sync=”local_disk”
zkPath=”/activemq/leveldb-stores”
上述配置的意义解释如下:
directory:表示ActiveMQ集群消息持久化保存到服务器上的路径,注意该路径一定要先创建好。
replicas:表示ActiveMQ集群的节点个数。
bind:表示当这个节点成为master后,绑定的机器的地址与端口。此处0.0.0.0:0表示绑定到本机所有可用IP,而端口是随机的。
zkAddress:表示ZooKeeper的ip和port。如果是ZooKeeper集群的话,则用逗号隔开。
zkSessionTimeout:表示ActiveMQ与ZooKeeper集群连接的会话超时时间。
hostname:表示本机的IP地址。服务器根据不同的IP地址做出改变,其他配置相同。
sync:在消息被消费完成前,同步信息所存贮的策略。如果有多种策略用逗号隔开,ActiveMQ会选择较强的策略。而如果有local_mem, local_disk这两种策略的话,那么ActiveMQ则优先选择local_disk策略,存储在本地硬盘。
zkPath:表示ActiveMQ在ZooKeeper集群上创建的znode节点的路径,也即是ZooKeeper选举信息交换的存贮路径。
注意:这3个ActiveMQ节点中的brokerName配置必须相同,否则不能加入集群。
ActiveMQ集群启动完毕,根据ZooKeeper的策略,会从这三台ActiveMQ服务器选一台作为master对外提供服务,其他两台作为slave等待运行,而slave只是做数据上的主从同步。
所以,ActiveMQ集群后,访问http://10.1.31.11:8161/admin/、http://10.1.31.12:8161/admin/、http://10.1.31.26:8161/admin/只会有一个成功。
那么现在在ActiveMQ集群中,如何查看哪一台服务器是master节点呢?
我们可以通过查看这三台服务器哪一台服务器监听8161端口,来判断哪台服务器是master节点。
现在在切换到服务器上查看监听的端口,如下:
netstat -tunlp |grep 8161
五、验证ActiveMQ集群高可用
要验证ActiveMQ集群的高可用,我们只需要关闭能访问http://ip:8161/admin/的ActiveMQ服务,然后访问其他两个。
如果其中有一个能访问,那就说明ActiveMQ+ZooKeeper集群高可用已经配置成功。
通过第四章节,我们知道目前master节点是10.1.31.11这台服务器。现在我们来关闭10.1.31.11这台服务器的ActiveMQ服务,看看ActiveMQ集群,是否能正常访问。如下:
现在11这台正常提供web服务
现在关闭11这台的activemq服务并且查看日志
转移到26这台服务器上: