# 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 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 ` --- ## 十一、性能优化建议 ### 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@:/data/rocketmq/broker/ scp /data/rocketmq/nameserver/namesrv.conf root@:/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)