原理
使用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
配置
修改一、
把下面这行中的 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>
启动测试
按照上面的配置修改好三台服务器后启动测试
/opt/activemq/bin/activemq start # INFO: Loading '/opt/activemq-5.16.6//bin/env' # INFO: Using java '/opt/jdk/bin/java' # INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details # INFO: pidfile created : '/opt/activemq-5.16.6//data/activemq.pid' (pid '12405')
注意:这里需要注意,要三个服务全都启动后,集群才是正常,并且只有一台机器提供服务,剩下两台并不监听端口
查看:
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]#
来源:https://www.cnblogs.com/winstom/p/12390077.html