一、环境准备
使用vm虚拟机安装两台centos7虚拟机,IP分别为192.168.30.139和140 注意防火墙问题,实验环境可选择关闭防火墙
代码语言:javascript复制systemctl stop firewalld
systemctl disable firewalld
二、软件准备
1、安装jdk8 查询yum库中java版本
代码语言:javascript复制yum list java*
需要安装java-1.8.0-openjdk.x86_64
和java-1.8.0-openjdk-devel.x86_64
yum install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
安装完成,查看java版本
java -version
openjdk version "1.8.0_322"
OpenJDK Runtime Environment (build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (build 25.322-b06, mixed mode)
2、安装ActiveMQ
当前官网ActiveMQ版本有两个,ActiveMQ 5.17.0
和 5.16.4
,其支持的功能和环境不同,我这里使用5.16.4
下载并上传到两台服务器 https://activemq.apache.org/components/classic/download/
解压缩
tar xvzf apache-activemq-5.16.4-bin.tar.gz
3、单机测试ActiveMQ
编辑 ./apache-activemq-5.16.4/conf/jetty.xml
将
<property name="host" value="127.0.0.1"/>
改为
代码语言:javascript复制<property name="host" value="0.0.0.0"/>
启动服务
./apache-activemq-5.16.4/bin/activemq start
登录web平台,账号密码admin
http://192.168.30.140:8161/
三、部署Master-Slave模式
使用Shared Filesystem Master-Slave KahaDB文件锁方式
规划如下,仅以openwire举例,其他服务如MQTT其实道理完全相同
节点 | IP | openwire | admin端口 |
---|---|---|---|
mq1 | 192.168.30.139 | 61616 | 8161 |
mq2 | 192.168.30.139 | 61617 | 8162 |
mq3 | 192.168.30.139 | 61618 | 8163 |
mq4 | 192.168.30.140 | 61619 | 8164 |
mq5 | 192.168.30.140 | 61620 | 8165 |
mq6 | 192.168.30.140 | 61621 | 8166 |
注意:Master-Slave模式是在一台机器上运行三个程序提供提供3选1的可用性,因此只在192.168.30.159上配置
在/usr/local
目录下创建mqcluster
目录,然后在该目录中创建mq1
,mq2
,mq3
的文件夹
mkdir /usr/local/mqcluster/mq1 -p
mkdir /usr/local/mqcluster/mq2 -p
mkdir /usr/local/mqcluster/mq3 -p
将ActiveMQ安装包放入上面三个目录中
代码语言:javascript复制cp -r ./apache-activemq-5.16.4/* /usr/local/mqcluster/mq1
cp -r ./apache-activemq-5.16.4/* /usr/local/mqcluster/mq2
cp -r ./apache-activemq-5.16.4/* /usr/local/mqcluster/mq3
配置brokername
vi /usr/local/mqcluster/mq1/conf/activemq.xml
vi /usr/local/mqcluster/mq2/conf/activemq.xml
vi /usr/local/mqcluster/mq3/conf/activemq.xml
将
代码语言:javascript复制<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
修改为
代码语言:javascript复制<broker xmlns="http://activemq.apache.org/schema/core" brokerName="brokerA" dataDirectory="${activemq.data}">
持久化配置 采用KahaDB文件锁方式,让三个服务共用一个KahaDB文件,当主服务崩溃后,备用服务会自动运行。
代码语言:javascript复制vi /usr/local/mqcluster/mq1/conf/activemq.xml
vi /usr/local/mqcluster/mq2/conf/activemq.xml
vi /usr/local/mqcluster/mq3/conf/activemq.xml
将
代码语言:javascript复制<kahaDB directory="${activemq.data}/kahadb"/>
修改为
代码语言:javascript复制<kahaDB directory="/usr/local/mqcluster/mq1/data/kahadb"/>
修改openwire端口
代码语言:javascript复制vi /usr/local/mqcluster/mq1/conf/activemq.xml
vi /usr/local/mqcluster/mq2/conf/activemq.xml
vi /usr/local/mqcluster/mq3/conf/activemq.xml
将
代码语言:javascript复制<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
分别改为
代码语言:javascript复制<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
注意:该行下面几列如mqtt
、ws
等原理相同,如果使用需要保证端口不重复,如果不使用请删除!
修改Jetty端口,即web服务端口
代码语言:javascript复制vi /usr/local/mqcluster/mq1/conf/jetty.xml
vi /usr/local/mqcluster/mq2/conf/jetty.xml
vi /usr/local/mqcluster/mq3/conf/jetty.xml
将
代码语言:javascript复制 <property name="host" value="127.0.0.1"/>
<property name="port" value="8161"/>
分别改为
代码语言:javascript复制 <property name="host" value="0.0.0.0"/>
<property name="port" value="8161"/>
<property name="host" value="0.0.0.0"/>
<property name="port" value="8162"/>
<property name="host" value="0.0.0.0"/>
<property name="port" value="8163"/>
启动集群
代码语言:javascript复制/usr/local/mqcluster/mq1/bin/activemq start
/usr/local/mqcluster/mq2/bin/activemq start
/usr/local/mqcluster/mq3/bin/activemq start
测试集群是否生效
第一种方式:
通过web端口,同时只有一个端口能够访问,如mq1能够访问,通过/usr/local/mqcluster/mq1/bin/activemq stop
后,mq2
和mq3
中会选出一个继续提供端口访问。
http://192.168.30.139:8161/
http://192.168.30.139:8162/
http://192.168.30.139:8163/
第二种方式: 查看日志,
代码语言:javascript复制cat /usr/local/mqcluster/mq1/data/activemq.log
cat /usr/local/mqcluster/mq2/data/activemq.log
cat /usr/local/mqcluster/mq3/data/activemq.log
此时主服务器的日志为
代码语言:javascript复制2022-04-09 08:03:40,021 | INFO | ActiveMQ Jolokia REST API available at http://0.0.0.0:8161/api/jolokia/ | org.apache.activemq.web.WebConsoleStarter | main
备用服务器日志为
代码语言:javascript复制2022-04-09 08:06:01,001 | INFO | Database /usr/local/mqcluster/mq1/data/kahadb/lock is locked by another server. This broker is now in slave mode waiting a lock to be acquired | org.apache.activemq.store.SharedFileLocker | main
四、配置Broker-Cluster集群
准备工作:
将第二台服务器按Master-Slave
模式搭建完,注意搭建的是192.168.30.140
上的mq4
、mq5
、mq6
配置Broker-Cluster集群,使两组Master-Slave能够负载均衡
只修改192.168.30.139
即brokerA
组
vi /usr/local/mqcluster/mq1/conf/activemq.xml
vi /usr/local/mqcluster/mq2/conf/activemq.xml
vi /usr/local/mqcluster/mq3/conf/activemq.xml
在persistenceAdapter
标签前配置
<networkConnectors>
<networkConnector name="brokerB" uri="static:(tcp://192.168.30.140:61619,tcp://192.168.30.140:61620,tcp://192.168.30.140:61621)" duplex="true" />
</networkConnectors>
重新启动所有节点即完成配置,配置开机启动和进程守护等内容本文不再赘述。
至此,ActiveMQ高可用 负载均衡集群搭建完毕。