各位开发者朋友大家好,平日里我一直做中间件部署与运维相关工作,RocketMQ凭借性能强、可用性高的特点,成为分布式消息队列里的常用选择,在日常业务项目里使用频率非常高,不少人搭建集群时,总会遇到找不到资源、配置出错、服务启动失败这类问题,这篇文章就把RocketMQ集群全套部署资源以及从零到一的完整流程整理齐全,全程都是实操内容、没有多余废话,跟着步骤一步步操作就能顺利完成部署。
本次部署选用生产环境中很常用的2主2从异步复制集群架构,这种架构既能保障集群稳定可用,又能兼顾消息传输效率,适合绝大多数业务场景,系统以CentOS 7作为基础环境,全程用到的命令都可以直接复制粘贴使用。
一、集群前置资源准备(全套下载)
搭建集群之前,大家要提前备好各类依赖资源,避免部署过程中出现中断的情况,文中用到的所有资源都是官方稳定版,部署起来足够安全,大家可以放心下载使用。
1. 核心依赖环境
RocketMQ依靠Java语言开发,所以第一步要先配好JDK环境,版本要求在JDK 1.8及以上,更推荐大家用JDK8,这个版本和组件的适配性最好。
JDK1.8下载地址(官网):www.oracle.com/java/technologies/downloads/#java8
要是内网环境没有外网访问权限,也能通过开源镜像站下载安装包,省去官网登录验证的繁琐步骤。
2. RocketMQ安装包
更建议大家使用4.9.7这个稳定版本,生产环境千万别盲目追新,运行平稳不出错才最重要,直接下载二进制编译包即可,不用手动编译源码,解压之后就能直接部署使用。
Linux服务器可以直接通过wget命令下载安装包,不用先在本地下载再上传到服务器,少了多余的操作步骤。
3. 集群规划(提前梳理)
本次搭建的2主2从集群一共需要4台服务器,大家也可以在单台机器上通过不同端口做模拟部署(这种方式只适合测试环境),生产环境一定要把节点分开单独部署,各节点的角色分配详情如下。
NameServer:两台,分别部署在192.168.1.10、192.168.1.11,默认端口9876
Broker-a Master:192.168.1.12,端口10911
Broker-a Slave:192.168.1.13,端口10912
Broker-b Master:192.168.1.13,端口10911
Broker-b Slave:192.168.1.12,端口10912
大家要先关闭所有节点的防火墙,或是开放9876、10911、10912这几个端口,确保集群里各个节点之间的网络能够正常连通。
二、基础环境配置(所有节点通用)
1. JDK环境安装配置
第一步配置JDK环境是RocketMQ正常运行的基础,这个操作需要在每一台服务器上都执行一遍。
将JDK安装包上传至服务器后完成解压,本文以解压到/usr/local/目录为例,对应的操作命令如下。
tar -zxvf jdk-8uxxx-linux-x64.tar.gz -C /usr/local/
大家可以给文件夹重新命名,方便后续简化环境变量的配置流程。
mv /usr/local/jdk1.8.0_xxx /usr/local/jdk8
配置系统环境变量需要编辑/etc/profile这份配置文件,直接执行对应命令即可。
vim /etc/profile
在文件末尾添加下方环境变量配置,就能完成基础的环境参数设置。
export JAVA_HOME=/usr/local/jdk8
export PATH=$PATH:$JAVA_HOME/bin
刷新系统环境变量能让配置立即生效,不用重启服务器就能正常使用。
source /etc/profile
执行命令查看版本信息,就能检验JDK是否安装配置到位。
java -version
控制台能正常显示JDK版本详情,就说明JDK环境已经配置完成。
2. RocketMQ解压与目录优化
在每台服务器上完成RocketMQ安装包的下载或是上传操作,再将安装包解压到/usr/local/目录下。
unzip rocketmq-all-4.9.7-bin-release.zip -d /usr/local/
给解压后的目录重新命名,能简化后续各类命令的执行路径,操作起来更方便。
mv /usr/local/rocketmq-all-4.9.7-bin-release /usr/local/rocketmq
新建日志存放和数据存储目录,方便后续对集群进行运维管理。
mkdir -p /usr/local/rocketmq/logs
mkdir -p /usr/local/rocketmq/store
3. JVM内存参数调整(关键!)
RocketMQ默认的JVM内存配置数值过高,普通测试服务器根本无法承载,必须手动修改参数,不然服务启动时会直接报错无法运行。
先修改NameServer的JVM参数,找到对应的配置文件进行编辑即可。
vim /usr/local/rocketmq/bin/runserver.sh
找到文件里的JAVA_OPT配置项,把默认的-Xms4g -Xmx4g改成适配测试环境的小内存配置,修改后的具体内容如下。
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
改完NameServer参数后,接着修改Broker节点的JVM配置文件。
vim /usr/local/rocketmq/bin/runbroker.sh
用同样的方式修改内存参数,测试环境更推荐使用下方的配置参数。
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
生产环境可以根据服务器硬件配置调高内存数值,核心就是不要使用系统默认的内存配置。
三、NameServer集群部署
NameServer相当于RocketMQ的注册中心,主要负责Broker节点的注册与服务发现,集群模式下不用做额外关联配置,每台节点单独启动就能正常工作。
大家需要在192.168.1.10、192.168.1.11两台服务器上,分别执行下方的启动命令。
先进入RocketMQ的bin目录,再执行后续的启动操作。
cd /usr/local/rocketmq/bin
通过后台方式启动NameServer服务,避免关闭终端后服务停止运行。
nohup sh mqnamesrv > /usr/local/rocketmq/logs/namesrv.log 2>&1
服务启动后查看运行日志,就能检查NameServer是否正常启动。
tail -f /usr/local/rocketmq/logs/namesrv.log
日志中出现“The Name Server boot success”字样,就说明NameServer启动完成,两台节点都要完成检查,确保服务能够稳定运行。
四、Broker集群配置与启动(核心步骤)
Broker节点分为主节点和从节点两种,主节点负责处理消息写入,从节点同步主节点的数据以此实现集群高可用,大家可以直接使用RocketMQ自带的2m-2s-async配置模板,简单修改参数后就能直接使用。
1. 修改Broker-a Master配置
先进入配置文件存放目录,再对Broker配置进行编辑修改。
cd /usr/local/rocketmq/conf/2m-2s-async
编辑broker-a.properties这份主节点配置文件,修改核心参数即可。
vim broker-a.properties
修改下方核心配置内容,把配置里的IP地址换成自己服务器对应的实际地址。
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=192.168.1.10:9876;192.168.1.11:9876
brokerIP1=192.168.1.12
storePathRootDir=/usr/local/rocketmq/store
storePathCommitLog=/usr/local/rocketmq/store/commitlog
2. 修改Broker-a Slave配置
接着编辑broker-a-s.properties从节点配置文件,区分好主从节点的参数差异。
vim broker-a-s.properties
从节点核心配置如下,大家要留意主从节点参数的细微区别。
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
namesrvAddr=192.168.1.10:9876;192.168.1.11:9876
brokerIP1=192.168.1.13
storePathRootDir=/usr/local/rocketmq/store
3. 修改Broker-b Master与Slave配置
Broker-b的配置方法和broker-a完全一致,只需要把brokerName改为broker-b,同步修改对应的brokerId,IP地址替换为对应服务器的实际地址,对应的配置文件分别为broker-b.properties、broker-b-s.properties,这里就不再重复罗列,大家记住主从节点的brokerName必须保持一致,主节点brokerId为0,从节点数值大于0即可。
4. 逐个启动Broker节点
启动Broker节点要遵循固定顺序,先启动所有主节点,再启动对应的从节点,每台Broker服务器都要先进入bin目录,再执行对应的启动命令。
执行对应命令,启动Broker-a主节点。
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a.properties > /usr/local/rocketmq/logs/broker-a.log 2>&1
执行对应命令,启动Broker-a从节点。
nohup sh mqbroker -c /usr/local/rocketmq/conf/2m-2s-async/broker-a-s.properties > /usr/local/rocketmq/logs/broker-a-s.log 2>&1
Broker-b主从节点的启动方式和Broker-a完全一样,只需要替换对应的配置文件路径就能执行。
Broker节点启动完成后,查看对应日志就能检查节点的运行状态。
tail -f /usr/local/rocketmq/logs/xxx.log
日志中显示“The broker boot success”字样,就代表Broker节点启动成功。
五、集群状态验证
集群所有节点启动完毕后,借助RocketMQ自带的运维脚本查看集群状态,确认主从节点、集群整体信息无异常即可。
进入bin目录后,执行集群状态查询命令,就能查看节点详情。
sh mqadmin clusterList -n 192.168.1.10:9876
命令执行后,控制台会显示4台Broker节点的详细信息,2主2从状态均无异常,就代表集群部署成功。
大家也可以做消息收发测试,检验集群的生产、消费功能是否可以正常运转。
先设置NameServer地址环境变量,再执行测试相关命令。
export NAMESRV_ADDR=192.168.1.10:9876;192.168.1.11:9876
启动生产者模块,发送测试消息验证生产功能。
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
启动消费者模块,接收测试消息验证消费功能。
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
消息生产、消费流程都没有问题,就说明整个集群可以正常投入使用。
六、集群运维与关闭
1. 服务关闭顺序
关闭集群必须遵守固定顺序,先关闭所有Broker节点,再关闭NameServer节点,避免出现数据丢失、出错的问题。
执行下方命令,关闭Broker节点。
sh mqshutdown broker
执行下方命令,关闭NameServer节点。
sh mqshutdown namesrv
2. 常见问题排查
服务启动失败优先查看日志排查问题,日志路径就是启动时设置的logs目录;
节点无法正常注册上线,要检查防火墙状态、端口是否开放、IP配置是否准确;
出现JVM内存相关报错,返回重新修改runserver.sh和runbroker.sh的内存参数即可。
七、总结
整套RocketMQ 2主2从集群搭建,核心流程为资源筹备→JDK配置→JVM调优→NameServer启动→Broker配置→集群校验,各个步骤衔接紧密,只要按照流程一步步操作,避开内存配置、IP端口这类常见问题,就能快速完成部署。
文章里的所有资源、命令、配置都经过实际测试,测试环境和生产环境都可以参考使用,生产环境只需根据服务器配置调高JVM内存、做好服务器权限管控即可,后续我会更新RocketMQ管控台部署、集群优化相关内容,感兴趣的朋友可以持续关注。