feat: 新增中间件文档和内部通讯技能

新增中间件相关文档包括 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 文件。补充文档版权信息。更新文件头部的元数据描述。规范文件命名和目录结构。
This commit is contained in:
2026-01-23 17:15:16 +08:00
parent 50455cc8c6
commit 3525aee49e
16 changed files with 2368 additions and 26 deletions
@@ -0,0 +1,961 @@
# 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)执行
```bash
# 创建 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)执行
```bash
# 仅创建 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 服务:
```yaml
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 服务:
```yaml
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 服务:
```yaml
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`:
```properties
# 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`:
```properties
# ========== 节点标识配置(每个节点不同) ==========
# 节点 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`:
```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 核心功能
1. **自动主从切换**
- 监控 Broker 健康状态
- Master 故障时自动选举新 Master
- 更新 NameServer 路由信息
2. **元数据管理**
- 统一管理 Topic、订阅组等元数据
- 避免元数据不一致问题
- 支持动态扩缩容
3. **负载均衡**
- 自动进行 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` 中添加:
```properties
# 开启 ACL 认证
aclEnable = true
# 指定 ACL 配置文件路径
globalWhiteRemoteAddresses = 127.0.0.1
```
#### 8.1.2 创建 ACL 配置文件
创建 `/data/rocketmq/broker/plain_acl.yml`:
```yaml
# 全局白名单(允许访问的 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 配置文件挂载:
```yaml
volumes:
- /data/rocketmq/broker/plain_acl.yml:/home/rocketmq/conf/plain_acl.yml
```
### 8.2 TLS/SSL 加密(可选)
生产环境建议开启 TLS/SSL 加密,保障数据传输安全。
#### 8.2.1 生成证书
```bash
# 生成 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` 中添加:
```properties
# 开启 TLS
tlsTestModeEnable = false
tlsServerCert = /home/rocketmq/conf/server.crt
tlsServerKey = /home/rocketmq/conf/server.key
tlsServerAuthClient = true
tlsClientCertPath = /home/rocketmq/conf/ca.crt
```
挂载证书文件:
```yaml
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台节点执行)
```bash
# 进入目录
cd /data/rocketmq
# 启动 NameServer
docker compose up -d rocketmq-nameserver
# 查看启动状态
docker compose ps
```
#### 9.1.2 启动 Broker(仅2台高性能机执行)
```bash
# 进入目录
cd /data/rocketmq
# 启动 Broker
docker compose up -d rocketmq-broker
# 查看启动状态
docker compose ps
```
#### 9.1.3 启动 Dashboard(可选,建议在高性能机执行)
```bash
# 进入目录
cd /data/rocketmq
# 启动 Dashboard
docker compose up -d rocketmq-dashboard
# 查看启动状态
docker compose ps
```
**启动顺序建议**:
1. 先在所有3台节点启动 NameServer
2. 等待 NameServer 启动完成(约 30 秒)
3. 再在2台高性能机启动 Broker
4. 最后启动 Dashboard(可选)
### 9.2 验证 NameServer
```bash
# 查看日志(所有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
```bash
# 查看日志(仅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
```bash
# 查看 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 失败
**排查步骤**:
1. 检查 `namesrvAddr` 配置是否正确
2. 检查防火墙是否开放 9876 端口
3. 检查网络连通性:`telnet <nameserver-ip> 9876`
### 10.2 Controller 集群无法选举 Leader
**现象**:Controller 集群一直处于选举状态
**排查步骤**:
1. 检查 `jRaftInitConf` 和 `jRaftServerId` 配置是否正确
2. 检查 9880 和 9770 端口是否开放
3. 检查节点时间是否同步(NTP)
4. 查看 NameServer 日志:`docker logs rocketmq-nameserver`
### 10.3 主从切换失败
**现象**:Master 故障后无法自动切换
**排查步骤**:
1. 检查 `enableControllerMode` 是否为 `true`
2. 检查 Controller 集群状态是否正常
3. 检查 Slave 节点是否正常运行
4. 查看 Broker 日志:`docker logs rocketmq-broker`
### 10.4 消息发送失败
**现象**:客户端发送消息超时或失败
**排查步骤**:
1. 检查 NameServer 地址配置是否正确
2. 检查 Topic 是否存在(`autoCreateTopicEnable` 是否开启)
3. 检查 Broker 是否正常注册到 NameServer
4. 检查网络连通性和防火墙规则
### 10.5 磁盘空间不足
**现象**:Broker 日志显示磁盘空间不足
**解决方案**:
1. 调整 `fileReservedTime` 参数,缩短消息保留时间
2. 调整 `deleteWhen` 参数,增加清理频率
3. 扩容磁盘空间
4. 手动清理过期消息:`docker exec rocketmq-broker sh mqadmin cleanExpiredCQFile -n <nameserver-addr>`
---
## 十一、性能优化建议
### 11.1 JVM 参数优化
在 `docker-compose.yml` 中调整 JVM 参数:
```yaml
environment:
- JAVA_OPT_EXT=-Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
```
### 11.2 操作系统优化
```bash
# 增加文件描述符限制
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 数据备份
```bash
# 备份 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 数据恢复
```bash
# 停止 Broker
docker compose stop rocketmq-broker
# 恢复数据
tar -xzf rocketmq-broker-backup-20240121.tar.gz -C /
# 启动 Broker
docker compose start rocketmq-broker
```
---
## 十四、升级和扩容
### 14.1 版本升级
```bash
# 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 集群扩容
```bash
# 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 最佳实践
1. **架构设计**:
- 3台 NameServer 确保服务注册发现的高可用
- 2台 Broker 部署在高性能机,低配机仅参与选举
- Controller 跨3台机部署,确保选举的高可用性
2. **数据可靠性**:根据业务需求选择 `brokerRole` 和 `flushDiskType`
3. **监控告警**:建立完善的监控和告警机制,及时发现异常
4. **定期备份**:定期备份配置文件和数据,防止数据丢失
5. **安全加固**:生产环境建议开启 ACL 认证和 TLS 加密
6. **性能优化**:根据实际负载调整 JVM 参数和系统参数
7. **日志管理**:定期清理日志,避免磁盘满
8. **资源规划**:低配机仅部署 NameServer,高性能机部署 Broker,资源利用率最大化
---
**参考资料**:
- [RocketMQ 官方文档](https://rocketmq.apache.org/zh/docs/)
- [RocketMQ 5.x Controller 模式介绍](https://rocketmq.apache.org/zh/docs/featureBehavior/05controller)
- [jRaft 官方文档](https://github.com/sofastack/sofa-jraft)