zookeeper+ActiveMQ集群实现高可用
MQ学习系列:
- 消息队列概念与认知
- ActiveMQ Topic消息重发
- ActiveMQ Topic 持久化订阅
- zookeeper+ActiveMQ集群实现高可用
使用ZooKeeper实现的Master-Slave实现方式,是对ActiveMQ进行高可用的一种有效的解决方案。
高可用的原理:使用ZooKeeper(集群)注册所有的ActiveMQ Broker。只有其中的一个Broker可以对外提供服务(也就是Master节点),其他的Broker处于待机状态,被视为Slave。如果Master因故障不能提供服务,则利用ZooKeeper的内部选举机制从 Slave中选举出一个Broker充当Master节点,继续对外提供服务。通过ZooKeeper+ActiveMQ实现的集群,可以有效的排除单点故障引起的服务中断。
1、环境准备
(1)准备三台虚拟机(没有真实环境只能用虚拟机了),IP分别为:
- 192.168.121.128
- 192.168.121.131
- 192.168.121.132
关于VM虚拟机下安装centos7并且克隆出多个系统:这里 (来源网络|VMware 14自动分配ip,后半部分可以不看)。
(2)安装JDK
CentOS 7上会默认安装了OpenJDK,默认版本是1.7
[n@localhost Desktop]$ java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (rhel-2.4.5.5.el7-x86_64 u51-b31)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
[n@localhost Desktop]$
当然也可安装其他版本的JDK而不是用默认的JDK,安装步骤如下:
a. 上传并解压 [这里推荐WinSCP连接虚拟机]
tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/java
b. 删除压缩包[理由:浪费空间]
rm jdk-8u201-linux-x64.tar.gz
c. 编辑配置文件配置环境变量
vim /etc/profile
添加如下内容:JAVA_HOME根据实际目录来
export JAVA_HOME=/usr/local/java/jdk1.8.0_201/
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME="$JAVA_HOME/jre"
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/rt.jar
d. 重新加载配置或者重启虚拟机
source /etc/profile
sudo shutdown -r now
c. 更该Linux默认安装的OpenJDK为自己安装的JDK[如下命令]
[root@localhost ~]# java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (rhel-2.4.5.5.el7-x86_64 u51-b31)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
[root@localhost ~]# cd /usr/bin
[root@localhost bin]# ln -s -f /usr/local/java/jdk1.8.0_201/jre/bin/java
[root@localhost bin]# ln -s -f /usr/local/java/jdk1.8.0_201/bin/javac
[root@localhost bin]# rm -f /usr/bin/java
[root@localhost bin]# rm -f /usr/bin/javac
[root@localhost bin]# rm -f /etc/alternatives/java
[root@localhost bin]# rm -f /etc/alternatives/javac
[root@localhost bin]# java -version
-bash: /usr/bin/java: No such file or directory
[root@localhost bin]# cd ..
[root@localhost usr]# source /etc/profile
[root@localhost usr]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
[root@localhost usr]#
(3)安装zookeeper和activeMQ
Linux上 zookeeper安装过程:
a. 将下载的zookeeper安装包分别上传到三台虚拟机上
b. 解压压缩包
tar -zxvf zookeeper-3.4.13.tar.gz -C /usr/local
c. 将/usr/local下的zookeeper-3.4.13重命名
mv zookeeper-3.4.13 zookeeper
d. 在zookeeper目录下创建两个目录data和logs,分别存放数据和日志
mkdir data
mkdir logs
f. 复制zookeeper/conf目录下的zoo_sample.cfg文件并重命名zoo.cfg
cp zoo_sample.cfg zoo.cfg
Linux上 activeMQ安装过程:
a. 将下载的activemq安装包分别上传到三台虚拟机上
b. 解压压缩包
tar -zxvf apache-activemq-5.15.8-bin.tar.gz -C /usr/local/
c. 重命名
mv apache-activemq-5.15.8 activemq
三台虚拟机按照如上过程安装即可,事实上,我们可以只安装一台然后克隆几台虚拟机,哈哈哈。
2、集群配置
第一步:在/usr/local/zookeeper/data下创建myid文件,文件内容为1。同理,其他虚拟机中也创建myid文件,内容分别为2和3。
第二步:修改/usr/local/zookeeper/conf/zoo.cfg文件,加入以下内容。
dataDir=/usr/local/zookeeper/data/
dataLogDir=/usr/local/zookeeper/logs
server.1=192.168.121.128:2888:3888
server.2=192.168.121.131:2888:3888
server.3=192.168.121.132:2888:3888
第三步:分别启动三台zookeeper(需要关闭防火墙)
service iptables stop
centOS7 查看防火墙
systemctl list-unit-files | grep firewalld
systemctl list-unit-files | grep iptables
/usr/local/zookeeper/bin/zkServer.sh start
通过/usr/local/zookeeper/bin/zkServer.sh status
我们可以看到其中一台虚拟机zookeeper的mode为leader剩下两台为Mode: follower
第四步:修改/usr/local/activemq/conf目录下的activemq.xml
修改brokerName='activemq-cluster'
将文件持久化配置器改为:
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="192.168.121.128:2181,192.168.121.131:2181,192.168.121.132:2181"
hostname="192.168.121.128"
zkPath="/activemq/leveldb-stores"/>
</persistenceAdapter>
第五步:启动activemq
./bin/activemq start
访问三台服务器的ActiveMQ的仪表盘发现:只用其中的一台可以使用;停掉这台可以使用的,剩下两台中会通过选举算法再选出一个主节点提供服务。