新增中间件相关文档包括 RocketMQ、Nacos、PowerJob 的部署指南和故障分析文档,完善 Keepalived 和 MySQL 的文档内容。新增内部通讯技能模板和示例文件,包括 3P更新、公司通讯、FAQ回答等格式指南。优化服务文档结构,补充 FIX 引擎高可用架构说明。新增中间件综合指南,详细说明高可用部署方案和灾备转换原理。 新增 RocketMQ 5.3.2 集群部署文档,包含 Controller 模式详解和详细配置说明。新增 Nacos 和 PowerJob 部署文档,补充服务依赖和关键配置。更新 MySQL 故障分析文档,优化复制冲突解决流程。新增内部通讯技能模板文件,规范公司内部通讯格式。 docs: 补充服务文档和中间件 TODO 列表 新增 g3fo-exchange-fix-engine-service 服务文档,详细说明服务职责和关键配置。新增中间件 TODO 列表,跟踪待补充的文档内容。更新 Keepalived 部署文档,新增主库抢占前置检查脚本和配置说明。优化中间件文档结构,补充常见问题和性能优化建议。 style: 统一文档格式和代码块样式 统一所有文档的代码块格式和标题层级。优化表格显示样式,增强可读性。规范环境变量和配置项的显示方式。调整文档结构,确保逻辑清晰。修复部分拼写错误和格式问题。 chore: 新增 LICENSE 文件 新增内部通讯技能的 Apache 2.0 LICENSE 文件。补充文档版权信息。更新文件头部的元数据描述。规范文件命名和目录结构。
29 KiB
RocketMQ 5.3.2 集群部署文档
一、概述
1.1 核心功能
RocketMQ 是一款分布式消息中间件,具有高吞吐、高可用、支持事务消息、延时消息等特性。RocketMQ 5.x 引入了 Controller 模式,实现了自动主从切换,提升了集群的高可用能力。
1.2 Controller 模式说明
RocketMQ 5.x 引入了基于 jRaft 的 Controller 模式,实现了以下核心功能:
- 自动主从切换:当 Master 节点故障时,Controller 自动选举新的 Master,无需人工干预
- 元数据管理:统一管理 Topic、订阅组等元数据,避免元数据不一致
- 负载均衡:自动进行 Broker 负载均衡,优化集群资源利用率
1.3 适用场景
- 生产环境下的高可用消息队列需求
- 需要事务消息、延时消息的分布式系统
- 大规模消息吞吐场景(百万级 TPS)
1.4 前置条件
- 运行环境:Docker & Docker Compose
- 镜像版本:apache/rocketmq:5.3.2
- 网络规划:所有节点需网络互通,且需明确各宿主机的外部 IP
- 集群规模:建议至少 3 个节点组成集群(NameServer、Broker、Controller 各 3 个实例)
二、环境准备
2.1 节点信息规划
| 节点 | 主机IP | brokerId | jRaftServerId | 机器配置 | 角色 |
|---|---|---|---|---|---|
| 节点1 | 192.168.3.230 | 0 | 192.168.3.230:9880 | 高性能 | Master + NameServer + Controller |
| 节点2 | 192.168.3.200 | 1 | 192.168.3.200:9880 | 高性能 | Slave + NameServer + Controller |
| 节点3 | 192.168.3.110 | - | 192.168.3.110:9880 | 低配 | NameServer + Controller(仅选举) |
架构说明:
- 3台机均部署 NameServer:NameServer 作为服务注册发现中心,所有节点都需要部署以避免单点
- 2台高性能机部署 Broker:Broker 负责消息存储和转发,对性能要求高,仅在两台高性能机上部署
- Controller 内嵌于 NameServer:Controller 基于 jRaft 实现,随 NameServer 一起启动,用于 Broker 的自动主从切换
- 低配机仅用于选举:192.168.3.110 节点仅部署 NameServer(包含 Controller),参与 Controller 集群选举,不部署 Broker
2.2 目录结构配置
2.2.1 高性能机节点(192.168.3.230、192.168.3.200)执行
# 创建 Broker 相关目录
sudo mkdir -p /data/rocketmq/broker/{logs,store}
# 创建 NameServer 相关目录
sudo mkdir -p /data/rocketmq/nameserver/{logs,data}
# 设置目录权限(RocketMQ 容器默认用户 UID/GID 为 3000)
sudo chown 3000:3000 /data/rocketmq -R
2.2.2 低配机节点(192.168.3.110)执行
# 仅创建 NameServer 相关目录(无需 Broker 目录)
sudo mkdir -p /data/rocketmq/nameserver/{logs,data}
# 设置目录权限
sudo chown 3000:3000 /data/rocketmq -R
三、部署架构说明
3.1 单节点部署(开发/测试环境)
适用于开发测试环境,部署单个 NameServer 和 Broker 实例:
- 1 个 NameServer 实例
- 1 个 Broker 实例(Master)
- 1 个 Dashboard 实例(可选)
优点:部署简单,资源占用少 缺点:无高可用,单点故障风险
3.2 集群部署(生产环境推荐)
适用于生产环境,部署多个实例组成高可用集群:
- 3 个 NameServer 实例(避免单点,3台机均部署)
- 2 个 Broker 实例(1 Master + 1 Slave,仅在2台高性能机部署)
- 3 个 Controller 实例(基于 jRaft,内嵌于 NameServer)
- 1 个 Dashboard 实例(可选,建议部署在高性能机)
优点:高可用、自动故障转移、负载均衡、资源优化 缺点:部署复杂,资源占用较多
架构优势:
- 低配机仅承担 NameServer 和 Controller 选举职责,资源占用低
- 高性能机专注处理 Broker 消息存储和转发,性能最大化
- Controller 集群跨3台机部署,确保选举的高可用性
四、Docker Compose 配置
4.1 NameServer 配置(所有3台节点统一执行)
创建 /data/rocketmq/docker-compose.yml,添加 NameServer 服务:
version: "3.8"
networks:
my-net:
driver: bridge
services:
rocketmq-nameserver:
image: apache/rocketmq:5.3.2
container_name: rocketmq-nameserver
restart: always
deploy:
resources:
limits:
memory: 1G
replicas: 1
placement:
constraints:
- node.role == manager
networks:
- my-net
ports:
- "9876:9876" # NameServer 默认端口
- "9880:9880" # jRaft 内部通信端口
- "9770:9770" # Controller 外部通信端口
volumes:
- /etc/localtime:/etc/localtime
- /etc/timezone:/etc/timezone
- /data/rocketmq/nameserver/logs:/home/rocketmq/logs/rocketmqlogs
- /data/rocketmq/nameserver/data:/home/rocketmq/data
- /data/rocketmq/nameserver/namesrv.conf:/home/rocketmq/conf/namesrv.conf
environment:
- TZ=Asia/Hong_Kong
command: sh mqnamesrv -c /home/rocketmq/conf/namesrv.conf
注意:NameServer 配置在所有3台节点(192.168.3.230、192.168.3.200、192.168.3.110)都需要执行。
4.2 Broker 配置(仅2台高性能机执行)
在 /data/rocketmq/docker-compose.yml 中添加 Broker 服务:
rocketmq-broker:
image: apache/rocketmq:5.3.2
container_name: rocketmq-broker
restart: always
deploy:
resources:
limits:
memory: 2G
networks:
- my-net
environment:
- TZ=Asia/Hong_Kong
ports:
- "10911:10911" # Broker 默认服务端口
- "10909:10909" # HA 端口(Master-Slave 同步)
- "18081:18081" # gRPC 代理端口
- "18080:18080" # HTTP 代理端口
volumes:
- /etc/localtime:/etc/localtime
- /etc/timezone:/etc/timezone
- /data/rocketmq/broker/logs:/home/rocketmq/logs/rocketmqlogs
- /data/rocketmq/broker/store:/home/rocketmq/store
- /data/rocketmq/broker/broker.conf:/home/rocketmq/broker.conf
- /data/rocketmq/broker/rmq-proxy.json:/home/rocketmq/rocketmq-5.3.2/conf/rmq-proxy.json
command: sh mqbroker -c /home/rocketmq/broker.conf --enable-proxy
注意:Broker 配置仅在2台高性能机(192.168.3.230、192.168.3.200)执行,低配机(192.168.3.110)不需要部署 Broker。
4.3 Dashboard 配置(可选,建议在高性能机部署)
在 /data/rocketmq/docker-compose.yml 中添加 Dashboard 服务:
rocketmq-dashboard:
image: apacherocketmq/rocketmq-dashboard
container_name: rocketmq-dashboard
restart: always
deploy:
resources:
limits:
memory: 512M
replicas: 1
placement:
constraints:
- node.role == manager
networks:
- my-net
ports:
- "8086:8080"
volumes:
- /etc/localtime:/etc/localtime
- /etc/timezone:/etc/timezone
environment:
- JAVA_OPTS=-Xmx512M -Xms256M -Xmn128M -Drocketmq.namesrv.addr=192.168.3.230:9876;192.168.3.200:9876;192.168.3.110:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
注意:Dashboard 建议部署在高性能机(如 192.168.3.230),仅需部署1个实例即可。
五、核心配置文件
5.1 NameServer 配置(所有3台节点统一执行)
创建 /data/rocketmq/nameserver/namesrv.conf:
# NameServer 监听端口
listenPort = 9876
# 启用内嵌 Controller(5.x 新特性)
enableControllerInNamesrv = true
# jRaft 内核配置(三台节点统一)
controllerType = jRaft
# 集群唯一标识
jRaftGroupId = controller-jraft-group
# Raft 内部通信地址(对应容器 9880 端口)
jRaftInitConf = 192.168.3.230:9880,192.168.3.200:9880,192.168.3.110:9880
# Controller 外部通信地址(对应容器 9770 端口)
jRaftControllerRPCAddr = 192.168.3.230:9770,192.168.3.200:9770,192.168.3.110:9770
# 标志自己节点的 ServerId,必须出现在 jRaftInitConf 中
# 每个节点需要修改为对应的主机 IP
jRaftServerId = 192.168.3.200:9880
# Controller 数据存储路径
controllerStorePath = /home/rocketmq/data
注意:每个节点的 jRaftServerId 需要修改为对应的主机 IP,例如:
- 节点1(192.168.3.230):
jRaftServerId = 192.168.3.230:9880 - 节点2(192.168.3.200):
jRaftServerId = 192.168.3.200:9880 - 节点3(192.168.3.110):
jRaftServerId = 192.168.3.110:9880
5.2 Broker 配置(仅2台高性能机执行)
创建 /data/rocketmq/broker/broker.conf:
# ========== 节点标识配置(每个节点不同) ==========
# 节点 ID,0 表示 Master,其他正整数表示 Slave
brokerId = 1
# Broker 节点名称,集群部署时同一主从对的名称相同
brokerName = broker
# ========== Controller 模式配置 ==========
# Broker Controller 模式的总开关,只有该值为 true,自动主从切换模式才会打开
enableControllerMode = true
# Controller 地址列表(多个用 ; 隔开)
controllerAddr = 192.168.3.230:9770;192.168.3.200:9770;192.168.3.110:9770
# ========== NameServer 配置 ==========
# NameServer 地址列表(多个用 ; 隔开)
namesrvAddr = 192.168.3.230:9876;192.168.3.200:9876;192.168.3.110:9876
# ========== 集群配置 ==========
# 集群名称,同一集群中必须一致
brokerClusterName = DefaultCluster
# ========== 网络配置 ==========
# Broker 对外服务的监听端口(默认 10911)
# 注意:Broker 启动后会占用 3 个端口(listenPort-2、listenPort、listenPort+1)
listenPort = 10911
# Broker 服务地址(内部使用填内网 IP,外部使用填公网 IP)
brokerIP1 = 192.168.3.200
# BrokerHAIP 地址,供 Slave 同步消息的地址
# brokerIP2 = 127.0.0.1
# ========== 主从复制配置 ==========
# Broker 角色
# ASYNC_MASTER:异步复制 Master,主写成功即响应,可能丢失少量数据
# SYNC_MASTER:同步双写 Master,主从都写成功才响应,不会丢失数据
# SLAVE:从节点
brokerRole = ASYNC_MASTER
# 刷盘方式
# SYNC_FLUSH:同步刷新,性能较差但可靠性高
# ASYNC_FLUSH:异步刷新,性能好但可能丢失少量数据
flushDiskType = ASYNC_FLUSH
# ========== 消息存储配置 ==========
# 每天什么时间删除超过保留时间的 commit log(默认 04 点)
deleteWhen = 04
# 文件保留时间(小时,默认 72 小时)
fileReservedTime = 24
# 消息最大大小(字节,默认 4MB)
maxMessageSize = 4194304
# ========== Topic 配置 ==========
# 自动创建 Topic 时的默认队列数
defaultTopicQueueNums = 4
# 是否允许 Broker 自动创建 Topic(建议线下开启,线上关闭)
autoCreateTopicEnable = true
# 是否允许 Broker 自动创建订阅组(建议线下开启,线上关闭)
autoCreateSubscriptionGroup = true
# ========== 延时消息配置 ==========
# 延时等级(从 1 开始,可自定义添加如 1d)
messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
# ========== 事务消息配置 ==========
# TM 在 20 秒内应将最终确认状态发送给 TC,否则引发消息回查(默认 60 秒)
transactionTimeout = 20
# 最多回查 5 次,超过后丢弃消息并记录错误日志(默认 15 次)
transactionCheckMax = 5
# 消息回查的时间间隔为 10 秒(默认 60 秒)
transactionCheckInterval = 10
# ========== 其他配置 ==========
# 延时消息最大时长(秒,默认 3 天,这里设置为 7 天)
timerMaxDelaySec = 604800
# 开启消息追踪
traceTopicEnable = true
注意:每个节点需要修改以下参数:
brokerId:高性能机1(192.168.3.230)为 0(Master),高性能机2(192.168.3.200)为 1(Slave)brokerIP1:当前节点的主机 IP
配置示例:
- 高性能机1(192.168.3.230):
brokerId = 0,brokerIP1 = 192.168.3.230 - 高性能机2(192.168.3.200):
brokerId = 1,brokerIP1 = 192.168.3.200 - 低配机(192.168.3.110):不需要部署 Broker
5.3 Proxy 配置(仅2台高性能机执行)
创建 /data/rocketmq/broker/rmq-proxy.json:
{
"rocketMQClusterName": "DefaultCluster",
"remotingListenPort": 18080,
"grpcServerPort": 18081,
"namesrvAddr": "192.168.3.200:9876;192.168.3.230:9876;192.168.3.110:9876"
}
注意:namesrvAddr 可以配置为当前节点优先的 NameServer 地址列表。
六、端口说明
6.1 NameServer 端口
| 端口 | 用途 | 说明 |
|---|---|---|
| 9876 | NameServer 服务端口 | 客户端和 Broker 连接 NameServer 的默认端口 |
| 9880 | jRaft 内部通信端口 | Controller 集群内部 Raft 协议通信 |
| 9770 | Controller 外部通信端口 | Broker 连接 Controller 的 RPC 端口 |
6.2 Broker 端口
| 端口 | 用途 | 说明 |
|---|---|---|
| 10911 | Broker 默认服务端口 | 客户端发送和接收消息的默认端口 |
| 10909 | HA 端口 | Master-Slave 主从同步端口(listenPort - 2) |
| 10912 | Fast Fail 端口 | 快速失败端口(listenPort + 1,自动占用) |
| 18080 | HTTP 代理端口 | Proxy HTTP 协议接入端口 |
| 18081 | gRPC 代理端口 | Proxy gRPC 协议接入端口 |
6.3 Dashboard 端口
| 端口 | 用途 | 说明 |
|---|---|---|
| 8086 | Dashboard Web 界面 | RocketMQ 管理控制台访问端口 |
注意:部署集群时需要确保所有节点的端口不冲突,建议提前规划端口分配。
七、Controller 模式详解
7.1 Controller 模式架构
Controller 模式基于 jRaft 实现,采用 Raft 一致性算法,确保元数据的一致性和高可用:
+-----------------+
| Client App |
+--------+--------+
|
v
+--------------------+--------------------+
| | |
+-------v-------+ +-------v-------+ +-------v-------+
| NameServer | | NameServer | | NameServer |
| (高性能机1) | | (高性能机2) | | (低配机) |
| (Node1) | | (Node2) | | (Node3) |
+-------+-------+ +-------+-------+ +-------+-------+
| | |
+--------------------+--------------------+
|
+--------v--------+
| Controller | (jRaft 集群)
| (Leader) |
+--------+--------+
|
+--------------------+
|
+-------v-------+
| Broker | (高性能机1)
| (Master) |
+---------------+
|
v
+---------------+
| Broker | (高性能机2)
| (Slave) |
+---------------+
架构说明:
- 3台 NameServer:所有节点都部署 NameServer,确保服务注册发现的高可用
- Controller 内嵌于 NameServer:Controller 基于 jRaft 实现,随 NameServer 一起启动
- 2台 Broker:仅在2台高性能机部署 Broker,低配机仅参与选举
- 自动主从切换:当 Master 故障时,Controller 自动选举 Slave 为新 Master
7.2 Controller 核心功能
-
自动主从切换
- 监控 Broker 健康状态
- Master 故障时自动选举新 Master
- 更新 NameServer 路由信息
-
元数据管理
- 统一管理 Topic、订阅组等元数据
- 避免元数据不一致问题
- 支持动态扩缩容
-
负载均衡
- 自动进行 Broker 负载均衡
- 优化集群资源利用率
- 支持流量调度
7.3 jRaft 配置说明
| 配置项 | 说明 | 示例值 |
|---|---|---|
controllerType |
Controller 实现类型 | jRaft |
jRaftGroupId |
Raft 集群唯一标识 | controller-jraft-group |
jRaftInitConf |
Raft 内部通信地址列表 | 192.168.3.230:9880,192.168.3.200:9880,192.168.3.110:9880 |
jRaftControllerRPCAddr |
Controller 外部通信地址列表 | 192.168.3.230:9770,192.168.3.200:9770,192.168.3.110:9770 |
jRaftServerId |
当前节点的 ServerId | 192.168.3.200:9880 |
注意:
jRaftServerId必须出现在jRaftInitConf中- 建议至少 3 个节点组成 Raft 集群,确保高可用
- Raft 集群会自动选举 Leader,无需手动指定
八、安全配置(可选)
8.1 ACL 认证配置
生产环境建议开启 ACL 认证,防止未授权访问。
8.1.1 启用 ACL 认证
在 broker.conf 中添加:
# 开启 ACL 认证
aclEnable = true
# 指定 ACL 配置文件路径
globalWhiteRemoteAddresses = 127.0.0.1
8.1.2 创建 ACL 配置文件
创建 /data/rocketmq/broker/plain_acl.yml:
# 全局白名单(允许访问的 IP 地址)
globalWhiteRemoteAddresses:
- 10.*.*.*
- 192.168.*.*
# 账户配置
accounts:
# 管理员账户
- accessKey: admin
secretKey: admin123
whiteRemoteAddress:
admin: true
# 普通用户账户
- accessKey: appuser
secretKey: appuser123
whiteRemoteAddress:
admin: false
defaultTopicPerm: PUB|SUB
defaultGroupPerm: PUB|SUB
topicPerms:
- topicA=PUB
- topicB=SUB
groupPerms:
- groupA=PUB|SUB
8.1.3 挂载 ACL 配置文件
在 docker-compose.yml 中添加 ACL 配置文件挂载:
volumes:
- /data/rocketmq/broker/plain_acl.yml:/home/rocketmq/conf/plain_acl.yml
8.2 TLS/SSL 加密(可选)
生产环境建议开启 TLS/SSL 加密,保障数据传输安全。
8.2.1 生成证书
# 生成 CA 证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=RocketMQ CA"
# 生成服务器证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr -subj "/CN=192.168.3.200"
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
# 生成客户端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr -subj "/CN=Client"
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
8.2.2 配置 TLS
在 broker.conf 中添加:
# 开启 TLS
tlsTestModeEnable = false
tlsServerCert = /home/rocketmq/conf/server.crt
tlsServerKey = /home/rocketmq/conf/server.key
tlsServerAuthClient = true
tlsClientCertPath = /home/rocketmq/conf/ca.crt
挂载证书文件:
volumes:
- /data/rocketmq/broker/server.crt:/home/rocketmq/conf/server.crt
- /data/rocketmq/broker/server.key:/home/rocketmq/conf/server.key
- /data/rocketmq/broker/ca.crt:/home/rocketmq/conf/ca.crt
九、启动和验证
9.1 启动服务
9.1.1 启动 NameServer(所有3台节点执行)
# 进入目录
cd /data/rocketmq
# 启动 NameServer
docker compose up -d rocketmq-nameserver
# 查看启动状态
docker compose ps
9.1.2 启动 Broker(仅2台高性能机执行)
# 进入目录
cd /data/rocketmq
# 启动 Broker
docker compose up -d rocketmq-broker
# 查看启动状态
docker compose ps
9.1.3 启动 Dashboard(可选,建议在高性能机执行)
# 进入目录
cd /data/rocketmq
# 启动 Dashboard
docker compose up -d rocketmq-dashboard
# 查看启动状态
docker compose ps
启动顺序建议:
- 先在所有3台节点启动 NameServer
- 等待 NameServer 启动完成(约 30 秒)
- 再在2台高性能机启动 Broker
- 最后启动 Dashboard(可选)
9.2 验证 NameServer
# 查看日志(所有3台节点执行)
docker logs rocketmq-nameserver
# 测试连接
telnet 192.168.3.230 9876
telnet 192.168.3.200 9876
telnet 192.168.3.110 9876
9.3 验证 Broker
# 查看日志(仅2台高性能机执行)
docker logs rocketmq-broker
# 检查 Broker 是否注册到 NameServer
docker exec rocketmq-nameserver sh mqadmin clusterList -n 192.168.3.230:9876
# 查看集群状态(应该看到 2 个 Broker)
docker exec rocketmq-nameserver sh mqadmin brokerStatus -n 192.168.3.230:9876
9.4 验证 Controller
# 查看 Controller 状态(所有3台节点执行)
docker exec rocketmq-nameserver sh mqadmin getControllerMode -n 192.168.3.230:9876
# 查看 Controller 集群状态
docker exec rocketmq-nameserver sh mqadmin getControllerInfo -n 192.168.3.230:9876
预期结果:
- Controller 模式应显示为
ENABLED - Controller 集群应选举出 Leader(3台节点中选1个)
9.5 访问 Dashboard
浏览器访问:http://192.168.3.230:8086
默认账号密码:admin / admin
验证内容:
- 集群概览中应显示 2 个 Broker
- NameServer 列表中应显示 3 个节点
- Controller 状态应为正常
十、常见问题
10.1 Broker 无法连接 NameServer
现象:Broker 日志显示连接 NameServer 失败
排查步骤:
- 检查
namesrvAddr配置是否正确 - 检查防火墙是否开放 9876 端口
- 检查网络连通性:
telnet <nameserver-ip> 9876
10.2 Controller 集群无法选举 Leader
现象:Controller 集群一直处于选举状态
排查步骤:
- 检查
jRaftInitConf和jRaftServerId配置是否正确 - 检查 9880 和 9770 端口是否开放
- 检查节点时间是否同步(NTP)
- 查看 NameServer 日志:
docker logs rocketmq-nameserver
10.3 主从切换失败
现象:Master 故障后无法自动切换
排查步骤:
- 检查
enableControllerMode是否为true - 检查 Controller 集群状态是否正常
- 检查 Slave 节点是否正常运行
- 查看 Broker 日志:
docker logs rocketmq-broker
10.4 消息发送失败
现象:客户端发送消息超时或失败
排查步骤:
- 检查 NameServer 地址配置是否正确
- 检查 Topic 是否存在(
autoCreateTopicEnable是否开启) - 检查 Broker 是否正常注册到 NameServer
- 检查网络连通性和防火墙规则
10.5 磁盘空间不足
现象:Broker 日志显示磁盘空间不足
解决方案:
- 调整
fileReservedTime参数,缩短消息保留时间 - 调整
deleteWhen参数,增加清理频率 - 扩容磁盘空间
- 手动清理过期消息:
docker exec rocketmq-broker sh mqadmin cleanExpiredCQFile -n <nameserver-addr>
十一、性能优化建议
11.1 JVM 参数优化
在 docker-compose.yml 中调整 JVM 参数:
environment:
- JAVA_OPT_EXT=-Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
11.2 操作系统优化
# 增加文件描述符限制
ulimit -n 65535
# 优化 TCP 参数
echo 'net.core.somaxconn = 1024' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_max_syn_backlog = 2048' >> /etc/sysctl.conf
sysctl -p
11.3 网络优化
- 使用万兆网络(10Gbps)
- 部署在同一机房,减少网络延迟
- 使用专用网络,避免公网访问
11.4 存储优化
- 使用 SSD 存储,提升 IO 性能
- 将日志和数据分离到不同磁盘
- 定期清理过期消息,避免磁盘满
十二、监控和告警
12.1 关键监控指标
| 指标 | 说明 | 告警阈值 |
|---|---|---|
| 消息堆积量 | 消息未消费数量 | > 10000 |
| 消息发送 TPS | 每秒发送消息数 | 异常波动 |
| 消息消费 TPS | 每秒消费消息数 | 异常波动 |
| Broker CPU 使用率 | Broker 进程 CPU 占用 | > 80% |
| Broker 内存使用率 | Broker 进程内存占用 | > 80% |
| 磁盘使用率 | 数据目录磁盘占用 | > 80% |
| 网络流量 | 网络入出流量 | 异常波动 |
12.2 日志监控
- Broker 日志:
/data/rocketmq/broker/logs/ - NameServer 日志:
/data/rocketmq/nameserver/logs/
建议使用 ELK 或 Loki 等日志收集系统进行集中管理。
十三、备份和恢复
13.1 数据备份
# 备份 Broker 数据
tar -czf rocketmq-broker-backup-$(date +%Y%m%d).tar.gz /data/rocketmq/broker/store
# 备份配置文件
tar -czf rocketmq-config-backup-$(date +%Y%m%d).tar.gz /data/rocketmq/broker/*.conf /data/rocketmq/broker/*.json
13.2 数据恢复
# 停止 Broker
docker compose stop rocketmq-broker
# 恢复数据
tar -xzf rocketmq-broker-backup-20240121.tar.gz -C /
# 启动 Broker
docker compose start rocketmq-broker
十四、升级和扩容
14.1 版本升级
# 1. 停止服务
docker compose down
# 2. 备份数据
tar -czf rocketmq-backup-$(date +%Y%m%d).tar.gz /data/rocketmq
# 3. 更新镜像版本
sed -i 's/apache\/rocketmq:5.3.2/apache\/rocketmq:5.3.3/g' docker-compose.yml
# 4. 启动服务
docker compose up -d
# 5. 验证服务
docker compose ps
14.2 集群扩容
# 1. 在新节点创建目录
sudo mkdir -p /data/rocketmq/broker/{logs,store}
sudo mkdir -p /data/rocketmq/nameserver/{logs,data}
sudo chown 3000:3000 /data/rocketmq -R
# 2. 复制配置文件到新节点
scp /data/rocketmq/broker/broker.conf root@<new-node>:/data/rocketmq/broker/
scp /data/rocketmq/nameserver/namesrv.conf root@<new-node>:/data/rocketmq/nameserver/
# 3. 修改新节点配置(brokerId、brokerIP1、jRaftServerId 等)
# 4. 在新节点启动服务
cd /data/rocketmq && docker compose up -d
# 5. 验证新节点注册
docker exec rocketmq-nameserver sh mqadmin clusterList -n 192.168.3.230:9876
十五、总结
15.1 部署检查清单
15.1.1 所有3台节点(192.168.3.230、192.168.3.200、192.168.3.110)
- NameServer 目录创建完成(
/data/rocketmq/nameserver/{logs,data}) - NameServer 目录权限设置正确(
chown 3000:3000 /data/rocketmq -R) - NameServer 配置文件正确(
/data/rocketmq/nameserver/namesrv.conf) - jRaftServerId 配置唯一(每个节点对应自己的 IP)
- Docker Compose 配置文件正确(包含 NameServer 服务)
- 防火墙规则配置正确(9876、9880、9770 端口开放)
- NameServer 启动成功,日志无错误
- NameServer 之间网络互通
15.1.2 高性能机节点(192.168.3.230、192.168.3.200)
- Broker 目录创建完成(
/data/rocketmq/broker/{logs,store}) - Broker 目录权限设置正确(
chown 3000:3000 /data/rocketmq -R) - Broker 配置文件正确(
/data/rocketmq/broker/broker.conf) - brokerId 配置正确(192.168.3.230 为 0,192.168.3.200 为 1)
- brokerIP1 配置正确(对应当前节点 IP)
- Proxy 配置文件正确(
/data/rocketmq/broker/rmq-proxy.json) - Docker Compose 配置文件正确(包含 Broker 服务)
- 防火墙规则配置正确(10911、10909、18080、18081 端口开放)
- Broker 启动成功,日志无错误
- Broker 成功注册到所有 NameServer
15.1.3 Dashboard 节点(建议在 192.168.3.230)
- Docker Compose 配置文件正确(包含 Dashboard 服务)
- 防火墙规则配置正确(8086 端口开放)
- Dashboard 启动成功
- Dashboard 可以正常访问(
http://192.168.3.230:8086)
15.1.4 集群整体验证
- 3 个 NameServer 都正常运行
- 2 个 Broker 都正常运行
- Controller 集群选举成功(有 1 个 Leader)
- Controller 模式已启用(
ENABLED) - Broker 主从关系正常(1 Master + 1 Slave)
- Dashboard 显示集群状态正常
15.2 最佳实践
-
架构设计:
- 3台 NameServer 确保服务注册发现的高可用
- 2台 Broker 部署在高性能机,低配机仅参与选举
- Controller 跨3台机部署,确保选举的高可用性
-
数据可靠性:根据业务需求选择
brokerRole和flushDiskType -
监控告警:建立完善的监控和告警机制,及时发现异常
-
定期备份:定期备份配置文件和数据,防止数据丢失
-
安全加固:生产环境建议开启 ACL 认证和 TLS 加密
-
性能优化:根据实际负载调整 JVM 参数和系统参数
-
日志管理:定期清理日志,避免磁盘满
-
资源规划:低配机仅部署 NameServer,高性能机部署 Broker,资源利用率最大化
参考资料: