原理
使用ZooKeeper实现的Master-Slave实现方式,是对ActiveMQ进行高可用的一种有效的解决方案。
高可用的原理:
- 使用ZooKeeper(集群)注册所有的ActiveMQ Broker。
- 只有其中的一个Broker可以对外提供服务(也就是Master节点),其他的Broker处于待机状态,被视为Slave。
- 如果Master因故障而不能提供服务,则利用ZooKeeper的内部选举机制会从Slave中选举出一个Broker充当Master节点,继续对外提供服务。
环境准备
主机名 | 系统 | IP地址 | zk 端口 | MQ 版本 | MQ 消息端口 | MQ 控制台端口 |
---|---|---|---|---|---|---|
node01 | Centos7.5 | 172.16.1.11 | 2181 | 5.15.6 | 61616 | 8161 |
node02 | Centos7.5 | 172.16.1.12 | 2181 | 5.15.6 | 61616 | 8161 |
node03 | Centos7.5 | 172.16.1.13 | 2181 | 5.15.6 | 61616 | 8161 |
zookeeper 集群
zookeeper 的集群安装之前文章已经介绍过, CentOS 7 Zookeeper 介绍 及 集群安装,本次也同样使用该环境;
ActiveMQ 安装
下载地址:
下面的操作,需要在三台服务器上操作:
cd /opt/soft/
tar xf apache-activemq-5.15.6-bin.tar.gz
mv apache-activemq-5.15.6 /opt/activemq-5.16.6
ln -s /opt/activemq-5.16.6 /opt/activemq
ls -ld /opt/activemq*
# lrwxrwxrwx 1 root root 20 Mar 1 14:22 /opt/activemq -> /opt/activemq-5.16.6
# drwxr-xr-x 10 root root 193 Sep 4 2018 /opt/activemq-5.16.6
增加服务管理脚本:
cat > /etc/systemd/system/activemq.service <<EOF
[Unit]
Description=ActiveMQ
Requires=ActiveMQ.target
After=ActiveMQ.target
[Service]
User=root
Group=root
Type=forking
Environment=JAVA_HOME=/opt/jdk
WorkingDirectory=/opt/activemq
ExecStart=/opt/activemq/bin/activemq start
ExecStop=/opt/activemq/bin/activemq stop
ExecReload=/opt/activemq/bin/activemq restart
[Install]
WantedBy=multi-user.target
EOF
配置
修改一、
把下面这行中的 brokerName
值为 activemq-cluster
,或者任意自定义的,这里的值需要另外两个都一样才可以,表示是一个集群。
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="activemq-cluster" dataDirectory="${activemq.data}">
修改二、
需要增加集群相关的信息,增加zookeeper的信息等,如下:
可以删除源文件中的 persistenceAdapter 标签,然后直接复制下来内容后进行端口相关的修改。
下面的这段配置,剩下的两台都需要配置,唯一不同的是需要把hostname
中的值对应到每台机器的名称修改。
<persistenceAdapter>
<!--<kahaDB directory="${activemq.data}/kahadb"/> -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62222"
zkAddress="172.16.1.11:2181,172.16.1.12:2181,172.16.1.13:2181"
hostname="node01"
sync="local_disk"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
启动测试
按照上面的配置修改好三台服务器后启动测试
# systemctl start activemq
# systemctl status activemq
● activemq.service - ActiveMQ
Loaded: loaded (/etc/systemd/system/activemq.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-03-03 14:01:09 CST; 3s ago
Process: 16243 ExecStart=/opt/activemq/bin/activemq start (code=exited, status=0/SUCCESS)
Main PID: 16298 (java)
CGroup: /system.slice/activemq.service
└─16298 /opt/jdk/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=logging.properties -Djava.security.auth.login...
Mar 03 14:01:09 node03 systemd[1]: Starting ActiveMQ...
Mar 03 14:01:09 node03 activemq[16243]: INFO: Loading '/opt/activemq-5.16.6//bin/env'
Mar 03 14:01:09 node03 activemq[16243]: INFO: Using java '/opt/jdk/bin/java'
Mar 03 14:01:09 node03 activemq[16243]: INFO: Starting - inspect logfiles specified in logging.properties and log4j.proper...details
Mar 03 14:01:09 node03 activemq[16243]: INFO: pidfile created : '/opt/activemq-5.16.6//data/activemq.pid' (pid '16298')
Mar 03 14:01:09 node03 systemd[1]: Started ActiveMQ.
Hint: Some lines were ellipsized, use -l to show in full.
注意:这里需要注意,要三个服务全都启动后,集群才是正常,并且只有一台机器提供服务,剩下两台并不监听端口
查看:
node01:
[root@node01 conf]# netstat -lntup | egrep '61616|8161|62222'
tcp6 0 0 :::8161 :::* LISTEN 12405/java
tcp6 0 0 :::62222 :::* LISTEN 12405/java
tcp6 0 0 :::61616 :::* LISTEN 12405/java
node02:
[root@node02 data]# netstat -lntup | egrep '61616|8161|62222'
[root@node02 data]#
node03:
[root@node03 data]# netstat -lntup | egrep '61616|8161|62222'
[root@node03 data]#