简介
activemq基于master-slave集群实现方式有多种,主要为目录共享和数据库共享,但从activemq5.9.0版本开始,增加了基于zookeeper+leveldb的实现方式。借助于zookeeper,因此至少需要(replicas/2)+1个activemq服务存活才能保证集群的正常运行,从而避免单点故障,缺点是没有负载均衡的作用。
准备
10.10.2.20 zookeeper1 activemq1
10.10.2.21 zookeeper2 activemq2
10.10.2.22 zookeeper3 activemq3
安装与配置
- 一.zookeeper安装配置
以下操作是在其中一台上,其他两台按照如下配置即可。
1.添加hosts
vim /etc/hosts
10.10.2.20 amq1
10.10.2.21 amq2
10.10.2.22 amq3
2.配置java环境
vim /etc/profile
##JAVA###
export JAVA_HOME=/usr/local/jdk1.7.0_71
export JRE_HOME=/usr/local/jdk1.7.0_71/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
3.安装zookeeper
cd /usr/local/src
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz
tar -zxvf zookeeper-3.4.6.tar.gz -C /usr/local
4.配置zk的环境变量
vim /etc/profile
#zookeeper
ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
export PATH=$PATH:$ZOOKEEPER_HOME/bin
source /etc/profile
5.修改zookeeper配置文件
#创建zookeeper的数据目录和日志目录
mkdir -p /data/zookeeper/zk1/{data,log}
cd /usr/local/zookeeper-3.4.6/conf
cp zoo_sample.cfg zoo.cfg
vim /etc/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zookeeper/zk1/data
dataLogDir=/data/zookeeper/zk1/log
clientPort=2181
server.1=amq1:2888:3888
server.2=amq2:2888:3888
server.3=amq3:2888:3888
6.在dataDir下创建myid文件,对应节点id
#在20上
cd /data/zookeeper/zk1/data
echo 1 > myid
#在21上
cd /data/zookeeper/zk2/data
echo 2 > myid
#在22上
cd /data/zookeeper/zk3/data
echo 3 > myid
7.启动zookeeper服务
依次在3台服务器上启动zk服务
/usr/local/zookeeper-3.4.6/bin/zkServer.sh start
注:注:在你所在的当前目录下会生成一个zookeeper.out的日志文件,里面记录了启动过程中的详细信息;由于集群没有全部信息,会报“myid 2或myid 3 未启动”的信息,当集群全部启动后就会正常,我们可以忽略。
8.查看zookeeper所有节点的状态
#20
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: leader
#21
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
#22
/usr/local/zookeeper-3.4.6/bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
- 二.activemq安装配置
activemq5.12需要jre1.7(1.6 for version <=5.10.0)
1.安装
[root@test ~]# cd /usr/local/src
[root@test src]# wget http://mirrors.hust.edu.cn/apache/activemq/5.12.1/apache-activemq-5.12.1-bin.tar.gz
[root@test src]# tar -zxvf apache-activemq-5.12.1-bin.tar.gz
[root@test src]# mv apache-activemq-5.12.1 /usr/local/
2.配置
在3台服务器上做同样配置,需注意个别参数配置。
[root@test apache-activemq-5.12.1]# vim conf/activemq.xml
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="10.10.2.20:2181,10.10.2.21:2181,10.10.2.22:2181"
hostname="10.10.2.20"
sync="local_disk"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
其中:
directory : 存储数据的路径
replicas : 集群中的节点数【(replicas/2)+1公式表示集群中至少要正常运行的服务数量】,3台集群那么允许1台宕机, 另外两台要正常运行
bind : 当这个节点成为Master, 它会绑定配置好的地址和端口来履行主从复制协议,默认端口为61616
zkAddress : ZooKeeper的ip和port, 如果是集群, 则用逗号隔开(这里作为简单示例ZooKeeper配置为单点, 这样已经适用于大多数环境了, 集群也就多几个配置)
zkPassword : 当连接到ZooKeeper服务器时用的密码,此处由于没有密码
hostname : 本机ip
sync : 在认为消息被消费完成前, 同步信息所存贮的策略, 如果有多种策略用逗号隔开, ActiveMQ会选择较强的策略(local_mem, local_disk则肯定选择存贮在本地硬盘)
zkPath : ZooKeeper选举信息交换的存贮路径,启动服务后actimvemq会到zookeeper上注册生成此路径。
注意: 在某些情况下,可以调整下zkSessionTimeout参数,以免网络波动或其他情况导致不必要的重新选举。
3.启动服务
依次在3台服务器上启动服务,会启动activemq的8161和61616两个端口;由于zookeeper机制,并不是3台服务器都会启动这两个端口,zk确保只有一台会启动这两个端口对外提供服务。
/usr/local/apache-activemq-5.12.1/bin/activemq start
总结
zookeeper+activemq的配置方案,能够提供(3-1)/2的容错率,也就是3台服务器允许宕机一台,而不影响整个集群的对外提供服务。
客户端连接使用failover方案:
mq.broker.url=failover:(tcp://192.168.1.191:61616,tcp://192.168.1.192:61616,tcp://192.168.1.193:61616)?initialReconnectDelay=1000
关掉其中任何一台,经过测试能够正常提供服务,客户端会自动切换连接,从而避免单点故障。