RocketMQ 4.9.5 集群搭建
RocketMQ 4.9.5 「2主2从 异步复制」集群搭建完整实践笔记
环境:Ubuntu、JDK8、RocketMQ 4.9.5、控制台端口 8088
集群架构:2 Master + 2 Slave(异步复制)
节点规划(单机模拟多节点,不同端口区分服务)
一、集群端口&角色规划(单机伪集群)
| 角色 | 名称 | IP | NameServer端口 | Broker监听端口 | 对外通信端口 |
|---|---|---|---|---|---|
| Master1 | broker-a | 192.168.150.130 | 9876 | 10911 | 10912 |
| Slave1 | broker-a-s | 192.168.150.130 | 9876 | 11011 | 11012 |
| Master2 | broker-b | 192.168.150.130 | 9876 | 11111 | 11112 |
| Slave2 | broker-b-s | 192.168.150.130 | 9876 | 11211 | 11212 |
统一 NameServer:单节点 192.168.150.130:9876(单机简化,生产可多NameServer)
复制模式:异步复制
二、前期准备
1. 进入RocketMQ根目录
cd ~/myrocketmq/rocketmq-all-4.9.5-bin-release
2. 停止原有所有服务(清理环境)
# 关闭原有 Broker、NameServer
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
# 关闭控制台
pkill -f rocketmq-dashboard
# 释放占用端口
fuser -k 8088/tcp
3. 目录规划(区分多组Broker配置)
在 conf 目录下创建集群专属配置,直接使用官方示例目录(4.9.5自带):
# 进入配置目录
cd conf
# 查看2主2从异步复制默认配置文件
ls -l 2m-2s-async/
内置4个核心配置文件:
broker-a.properties:Master1broker-a-s.properties:Slave1broker-b.properties:Master2broker-b-s.properties:Slave2
三、修改集群配置(核心:IP、角色、主从关系)
1. 统一修改所有配置文件的本机IP
依次编辑4个配置文件,把 brokerIP1 改为你的服务器IP 192.168.150.130
① 编辑 Master1 配置
vim 2m-2s-async/broker-a.properties
完整内容(直接替换):
# 集群名称,主从必须一致
brokerClusterName = DefaultCluster
# Broker名称,主从成对一致
brokerName = broker-a
# 0=Master,1=Slave
brokerId = 0
# 本机IP
brokerIP1=192.168.150.130
# NameServer地址
namesrvAddr=192.168.150.130:9876
# 监听端口
listenPort=10911
# 异步复制(默认就是异步,无需额外修改)
# 允许自动创建主题(测试必备)
autoCreateTopicEnable=true
② 编辑 Slave1 配置
vim 2m-2s-async/broker-a-s.properties
完整内容:
brokerClusterName = DefaultCluster
brokerName = broker-a
# 从节点固定为 1
brokerId = 1
brokerIP1=192.168.150.130
namesrvAddr=192.168.150.130:9876
listenPort=11011
autoCreateTopicEnable=true
③ 编辑 Master2 配置
vim 2m-2s-async/broker-b.properties
完整内容:
brokerClusterName = DefaultCluster
brokerName = broker-b
brokerId = 0
brokerIP1=192.168.150.130
namesrvAddr=192.168.150.130:9876
listenPort=11111
autoCreateTopicEnable=true
④ 编辑 Slave2 配置
vim 2m-2s-async/broker-b-s.properties
完整内容:
brokerClusterName = DefaultCluster
brokerName = broker-b
brokerId = 1
brokerIP1=192.168.150.130
namesrvAddr=192.168.150.130:9876
listenPort=11211
autoCreateTopicEnable=true
关键规则:
- 同一组主从:
brokerName必须完全相同- Master:
brokerId=0,Slave:brokerId=1- 所有节点
brokerClusterName全局统一- 每个Broker
listenPort不能重复
四、启动集群(启动顺序:NameServer → 所有Master → 所有Slave)
回到 RocketMQ 根目录
cd ..
1. 启动 NameServer(全局唯一)
nohup sh bin/mqnamesrv > ns.log 2>&1 &
sleep 2
# 校验9876端口
ss -lnp | grep 9876
2. 启动两台 Master 节点
# 启动 Master1 broker-a
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties > broker-a.log 2>&1 &
sleep 2# 启动 Master2 broker-b
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties > broker-b.log 2>&1 &
sleep 2
3. 启动两台 Slave 节点
# 启动 Slave1 broker-a-s
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties > broker-a-s.log 2>&1 &
sleep 2# 启动 Slave2 broker-b-s
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties > broker-b-s.log 2>&1 &
sleep 2
4. 查看全部 Broker 进程
jps | grep BrokerStartup
正常会出现 4 个 Broker 进程 + 1 个 Namesrv 进程。
五、启动可视化控制台(8088 端口,已预配置)
# 后台启动控制台
nohup java -jar rocketmq-dashboard-1.0.0.jar > dashboard.log 2>&1 &
sleep 2
访问控制台
http://192.168.150.130:8088
进入控制台 → 集群 页面,可看到:
- 集群名称:
DefaultCluster - 两组主从节点:
broker-a(主/从)、broker-b(主/从)
代表 2主2从 异步集群搭建成功。
六、集群消息收发测试
1. 配置 NameServer 环境变量
export NAMESRV_ADDR=192.168.150.130:9876
2. 启动生产者(发送消息)
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
3. 新开终端启动消费者(接收消息)
export NAMESRV_ADDR=192.168.150.130:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
收发正常 → 集群功能可用。
七、集群全套关闭命令
# 逐个关闭 Broker
sh bin/mqshutdown broker
# 关闭 NameServer
sh bin/mqshutdown namesrv
# 关闭控制台
pkill -f rocketmq-dashboard
八、后续日常重启集群(固定步骤)
每次开机/重启直接按顺序执行:
# 1. 启动 NameServer
nohup sh bin/mqnamesrv > ns.log 2>&1 &# 2. 启动两台 Master
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties > broker-a.log 2>&1 &
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties > broker-b.log 2>&1 &# 3. 启动两台 Slave
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties > broker-a-s.log 2>&1 &
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties > broker-b-s.log 2>&1 &# 4. 启动控制台
nohup java -jar rocketmq-dashboard-1.0.0.jar > dashboard.log 2>&1 &
九、关键说明 & 踩坑总结
- 主从判断
brokerId=0→ 主节点;brokerId=1→ 从节点- 同组主从
brokerName必须一致,否则无法同步数据
- 端口冲突
单机伪集群必须保证每个 Broker 的listenPort唯一,不能重复 - 异步复制
当前使用官方2m-2s-async目录,默认就是异步复制,Master 写完立即返回ACK,再异步同步给Slave - IP 配置
brokerIP1必须填写真实内网IP,不能用127.0.0.1,否则控制台无法识别集群节点 - 容灾特点
2主2从异步模式:Master宕机后,Slave可接管服务;存在毫秒级数据同步延迟,极端情况会丢失少量消息。
十、常用排查命令
# 查看所有MQ进程
jps | grep -E "Namesrv|Broker|dashboard"# 查看各节点日志
tail -f ns.log
tail -f broker-a.log
tail -f broker-a-s.log
tail -f dashboard.log# 查看端口监听
ss -lnp | grep -E "9876|10911|11011|11111|11211"
