Skip to content
清晨的一缕阳光
返回

RocketMQ 最佳实践进阶指南

RocketMQ 最佳实践进阶。本文将汇总生产环境中的最佳实践,包括架构设计、配置优化、运维管理、故障处理等。

一、架构设计

1.1 集群规划

小型集群

小型集群(日均 100 万消息):
- NameServer:2 节点
- Broker:2 节点(主从)
- 配置:4 核 8GB
- 存储:SSD 100GB

中型集群

中型集群(日均 1000 万消息):
- NameServer:2 节点
- Broker:4 节点(2 主 2 从)
- 配置:8 核 16GB
- 存储:SSD 500GB

大型集群

大型集群(日均 1 亿 + 消息):
- NameServer:4 节点
- Broker:8+ 节点(4 主 4 从+)
- 配置:16 核 32GB
- 存储:SSD 1TB+
- 启用 DLedger

1.2 高可用架构

同城双活

graph TB
    subgraph 可用区 A
        NS1[NameServer 1]
        B1M[Broker 1 Master]
    end
    
    subgraph 可用区 B
        NS2[NameServer 2]
        B1S[Broker 1 Slave]
    end
    
    NS1 -.-> NS2
    B1M -.-> B1S

异地多活

graph TB
    subgraph 北京机房
        B1M[Broker 1 Master]
    end
    
    subgraph 上海机房
        B1S[Broker 1 Slave]
    end
    
    subgraph 广州机房
        B2M[Broker 2 Master]
    end
    
    B1M -.-> B1S

二、配置优化

2.1 Broker 配置

# broker.conf

# 基础配置
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
namesrvAddr=ns1:9876;ns2:9876

# 性能配置
listenPort=10911
serverSocketSndBufSize=65536
serverSocketRcvBufSize=65536

# 线程配置
sendMessageThreadPoolNums=8
pullMessageThreadPoolNums=16
queryMessageThreadPoolNums=8

# 存储配置
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
storePathConsumeQueue=/data/rocketmq/store/consumequeue

# 刷盘配置(异步)
flushDiskType=ASYNC_FLUSH
flushCommitLogLeastPages=4
flushCommitLogThoroughInterval=200

# 日志配置
logFlushInterval=1000
logFlushStartThreshold=0.95

2.2 JVM 配置

# runbroker.sh

# 堆内存
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"

# G1 GC
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC"
JAVA_OPT="${JAVA_OPT} -XX:MaxGCPauseMillis=20"
JAVA_OPT="${JAVA_OPT} -XX:InitiatingHeapOccupancyPercent=35"

# 堆外内存
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=16g"

# GC 日志
JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=/var/log/rocketmq/gc.log:time,level,tags"

2.3 系统参数

# /etc/sysctl.conf

# 文件描述符
fs.file-max=1000000
fs.nr_open=1000000

# 网络参数
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216

# 连接参数
net.core.netdev_max_backlog=250000
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535

# 应用配置
sysctl -p
# /etc/security/limits.conf

# 文件描述符
* soft nofile 1000000
* hard nofile 1000000

# 进程数
* soft nproc 65535
* hard nproc 65535

# 内存锁
* soft memlock unlimited
* hard memlock unlimited

三、运维管理

3.1 日常巡检

#!/bin/bash
# 日常巡检脚本

echo "=== RocketMQ 日常巡检 ==="
echo "时间:$(date)"

# 1. 检查 NameServer
echo -e "\n=== NameServer 状态 ==="
mqadmin namesrvStatus -n ns1:9876

# 2. 检查 Broker
echo -e "\n=== Broker 状态 ==="
mqadmin clusterList -n ns1:9876

# 3. 检查 Topic
echo -e "\n=== Topic 统计 ==="
mqadmin updateTopic -n ns1:9876 | wc -l

# 4. 检查消费组
echo -e "\n=== 消费组进度 ==="
mqadmin consumerProgress -n ns1:9876 | awk 'NR>3 {sum+=$5} END {print "总堆积量:" sum}'

# 5. 检查磁盘
echo -e "\n=== 磁盘使用 ==="
df -h /data/rocketmq/store

echo -e "\n=== 巡检完成 ==="

3.2 备份策略

#!/bin/bash
# 备份脚本

BACKUP_DIR="/backup/rocketmq"
DATE=$(date +%Y%m%d)

echo "=== RocketMQ 备份 ==="

# 1. 备份配置
scp broker-a:/opt/rocketmq/conf/broker.conf $BACKUP_DIR/broker-a_$DATE.conf
scp broker-b:/opt/rocketmq/conf/broker.conf $BACKUP_DIR/broker-b_$DATE.conf

# 2. 备份 Topic 配置
mqadmin updateTopic -n ns1:9876 -t all -c DefaultCluster > $BACKUP_DIR/topics_$DATE.txt

# 3. 备份消费组
mqadmin consumerProgress -n ns1:9876 > $BACKUP_DIR/consumers_$DATE.txt

# 4. 保留 30 天
find $BACKUP_DIR -name "*.txt" -mtime +30 -delete
find $BACKUP_DIR -name "*.conf" -mtime +30 -delete

echo "=== 备份完成 ==="

3.3 监控告警

# alerting_rules.yml
groups:
  - name: rocketmq
    rules:
      # Broker 宕机
      - alert: RocketMQBrokerDown
        expr: up{job="rocketmq-broker"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Broker 宕机:{{ $labels.instance }}"
      
      # Consumer Lag
      - alert: RocketMQConsumerLag
        expr: rocketmq_group_diff > 10000
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "消费滞后:{{ $labels.group }} - {{ $value }}"
      
      # 磁盘使用率
      - alert: RocketMQDiskHigh
        expr: rocketmq_commitlog_disk_ratio > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "磁盘使用率过高:{{ $value }}%"

四、故障处理

4.1 常见问题

Broker 无法启动

# 1. 检查日志
tail -f /var/log/rocketmq/broker.log

# 2. 检查端口占用
netstat -tlnp | grep 10911

# 3. 检查磁盘空间
df -h /data/rocketmq/store

# 4. 检查 JVM 配置
cat /var/log/rocketmq/gc.log

消息堆积

# 1. 查看堆积情况
mqadmin consumerProgress -n ns1:9876

# 2. 增加消费者
# 启动更多消费者实例

# 3. 增加消费线程
# 修改 consumer.setConsumeThreadMax(64)

# 4. 优化消费逻辑
# 检查消费逻辑是否有性能问题

磁盘满

# 1. 清理过期消息
# 修改 log.retention.hours=72

# 2. 扩容磁盘
# 挂载新磁盘

# 3. 删除旧数据
# 手动删除旧的 CommitLog

4.2 应急预案

# RocketMQ 故障应急预案

## 故障信息
- 故障时间:YYYY-MM-DD HH:MM:SS
- 故障类型:Broker 宕机/NameServer 故障/磁盘故障
- 影响范围:Topic/Consumer Group

## 应急步骤

### 1. 故障确认
- [ ] 确认故障现象
- [ ] 确认影响范围
- [ ] 通知相关人员

### 2. 故障处理
- [ ] 执行故障切换
- [ ] 重启故障组件
- [ ] 验证集群状态

### 3. 恢复验证
- [ ] 验证 Producer 正常
- [ ] 验证 Consumer 正常
- [ ] 验证监控指标

### 4. 事后总结
- [ ] 记录故障原因
- [ ] 记录处理过程
- [ ] 提出改进建议

五、性能优化

5.1 性能基准

单 Broker 性能(8 核 16GB SSD):
- 生产 TPS:3 万 -5 万
- 消费 TPS:5 万 -8 万
- 平均延迟:< 10ms
- P99 延迟:< 50ms

集群性能(4 Broker):
- 生产 TPS:12 万 -20 万
- 消费 TPS:20 万 -32 万

5.2 优化建议

性能优化建议:
1. 使用 SSD 磁盘
2. 配置异步刷盘
3. 优化 JVM 参数
4. 合理设置队列数量
5. 启用压缩
6. 批量发送/消费

5.3 性能检查清单

性能检查:
- [ ] JVM 参数优化
- [ ] 磁盘配置优化
- [ ] 网络参数优化
- [ ] 批量配置优化
- [ ] 队列数合理
- [ ] 监控指标正常
- [ ] 性能基准测试

六、安全检查

6.1 安全配置

安全配置:
1. 启用 ACL 授权
2. 配置 IP 白名单
3. 启用 SSL 加密
4. 启用审计日志
5. 定期轮换密钥

6.2 安全检查清单

安全检查:
- [ ] 启用 ACL 授权
- [ ] 配置 IP 白名单
- [ ] 启用 SSL 加密
- [ ] 启用审计日志
- [ ] 定期轮换密钥
- [ ] 监控异常访问
- [ ] 定期安全审计

七、最佳实践总结

7.1 架构设计

架构设计:
1. 根据业务规模规划集群
2. 高可用架构设计
3. 跨可用区部署
4. 预留容量余量

7.2 配置优化

配置优化:
1. JVM 参数优化
2. 系统参数优化
3. Broker 配置优化
4. 存储配置优化

7.3 运维管理

运维管理:
1. 日常巡检
2. 定期备份
3. 监控告警
4. 故障演练

7.4 故障处理

故障处理:
1. 建立应急预案
2. 快速故障定位
3. 完善故障恢复
4. 事后总结改进

总结

RocketMQ 最佳实践的核心要点:

  1. 架构设计:集群规划、高可用架构
  2. 配置优化:Broker 配置、JVM 配置、系统参数
  3. 运维管理:日常巡检、备份策略、监控告警
  4. 故障处理:常见问题、应急预案
  5. 性能优化:性能基准、优化建议
  6. 安全检查:安全配置、检查清单

核心要点

参考资料


分享这篇文章到:

上一篇文章
Kafka 安全认证与授权详解
下一篇文章
Redis 数据分片策略详解