https://www.ilanni.com/?=13569
https://www.ilanni.com/?p=13569 activemq集群原理以及搭建
ActiveMQ5.10.x 以上版本必须使用 JDK1.8 才能正常使用。
ActiveMQ5.9.x 及以下版本使用 JDK1.7 即可正常使用
端口8161: 后台管理系统端口 web页面访问: http://ip:8161/admin
端口16161: 给java使用的通信端口
一、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.1.127,10.1.1.128,10.1.1.129。如下:
查看ZooKeeper集群的情况,使用如下命令:
/usr/local/zookeeper/bin/zkServer.sh status
./zkCli.sh -server ip //进入zookeeper,可查看版本号
通过以上截图信息,我们可以很明显的看到ActiveMQ都已经安装完毕,而且ZooKeeper集群也正常启动。
环境初始化完毕后,下面开始配置ActiveMQ集群。
三、配置ActiveMQ集群
ActiveMQ集群的配置比较简单,我们只需要修改ActiveMQ的配置文件activemq.xml中部分内容即可。
ActiveMQ根目录下的conf/activemq.xml文件,原来默认内容如下:
vim conf/activemq.xml +81
<persistenceAdapter>
<kahaDB directory=”${activemq.data}/kahadb”/>
</persistenceAdapter>
修改后的内容如下:
vim conf/activemq.xml +81
<persistenceAdapter>
<replicatedLevelDB
directory=”${activemq.data}/leveldb”
replicas=”3″
bind=”tcp://0.0.0.0:0″
zkAddress=”10.1.1.127:2181,10.1.1.128:2181,10.1.1.129:2181″
zkSessionTimeout=”4s”
hostname=”10.1.1.127″
sync=”local_disk”
zkPath=”/activemq/leveldb-stores”
/>
</persistenceAdapter>
上述配置的意义解释如下:
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集群
ActiveMQ集群配置完毕后,我们现在来启动ActiveMQ集群。但是在正式启动ActiveMQ集群之前,一定要先启动ZooKeeper集群。
要启动ActiveMQ集群,我们只需要启动这3台服务器的ActiveMQ服务即可。如下:
/usr/local/activemq/bin/activemq start
ps -ef |grep mq
ActiveMQ集群启动完毕,根据ZooKeeper的策略,会从这三台ActiveMQ服务器选一台作为master对外提供服务,其他两台作为slave等待运行,而slave只是做数据上的主从同步。
所以,ActiveMQ集群后,访问http://10.1.1.127:8161/admin/、http://10.1.1.128:8161/admin/、http://10.1.1.129:8161/admin/只会有一个成功。
那么现在在ActiveMQ集群中,如何查看哪一台服务器是master节点呢?
我们可以通过查看这三台服务器哪一台服务器监听8161端口,来判断哪台服务器是master节点。
现在在切换到服务器上查看监听的端口,如下:
netstat -tunlp |grep 8161
通过上图,我们可以很明显的看出,目前只有10.1.1.127这台服务器监听8161端口的。那就说明目前10.1.1.127是master节点。其他两个节点是slave节点,处于待机状态,没有监听8161端口。
现在我们再来看访问10.1.1.127服务器ActiveMQ管理控制台看看,如下:
到此说明ActiveMQ集群已经部署完毕。
五、验证ActiveMQ集群高可用
要验证ActiveMQ集群的高可用,我们只需要关闭能访问http://ip:8161/admin/的ActiveMQ服务,然后访问其他两个。
如果其中有一个能访问,那就说明ActiveMQ+ZooKeeper集群高可用已经配置成功。
通过第四章节,我们知道目前master节点是10.1.1.127这台服务器。现在我们来关闭10.1.1.127这台服务器的ActiveMQ服务,看看ActiveMQ集群,是否能正常访问。如下:
ps -ef |grep mq
kill -9 3889
上图中,我们已经把10.1.1.127这台服务器的ActiveMQ服务已经关闭了。
现在我们再来看看目前哪台服务器是master节,也即是查看哪台服务器的8161端口对外提供服务器。如下:
netstat -tunlp |grep 8161
ps -ef |grep mq
通过上图,我们可以很明显的看出目前10.1.1.128这台服务器是master节点。现在我再来通过管理控制台访问10.1.1.128的8161端口看看。如下:
http://10.1.1.128:8161/admin/
通过上图,我们可以很明显的看出10.1.1.127这台服务器的ActiveMQ服务停止后,并没有影响ActiveMQ集群的正常运行。这也就说明了ActiveMQ集群是正常工作的。
*****************************************************************************************************
1.从官网下载MQ,传送到三台服务器,并解压
2.修改配置文件
1).brokerId根据服务器进行编号
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-group" brokerId="broker-id-service-node2" dataDirectory="${activemq.data}">
2).消息挂起的数目设置,此处设置为1000条
<pendingMessageLimitStrategy>
<constantPendingMessageLimitStrategy limit="1000"/>
</pendingMessageLimitStrategy>
3).消息持久化策略设置
此处以leveldb为例
<persistenceAdapter>
<replicatedLevelDB
directory="/data0/mq/app_datas/mq/activemq-lvdb-data"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="10.50.40.150:2181,10.50.40.151:2181,10.50.40.152:2181"
zkSessionTmeout="6s"
zkPath="/activemq/basic-service/leveldb-stores"
hostname="10.50.40.183" />
</persistenceAdapter>
directory 表示持久化的消息保存在服务器上的路径,注意一定要先创建好路径
replicas 表示MQ集群的节点数量
bind 绑定的机器的地址与端口,此处0.0.0.0:0 表示端口随机,本机所有可用IP
zkAddress mq集群leveldb存储方式依赖的zookeeper集群地址
zkSessionTmeout 表示MQ与zookeeper集群的会话超时时间,注意拼写是zkSessionTmeout ,不是zkSessionTimeout
zkPath mq在zookeeper集群上创建的znode节点的路径
hostname mq机器的host