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 最佳实践的核心要点:
- 架构设计:集群规划、高可用架构
- 配置优化:Broker 配置、JVM 配置、系统参数
- 运维管理:日常巡检、备份策略、监控告警
- 故障处理:常见问题、应急预案
- 性能优化:性能基准、优化建议
- 安全检查:安全配置、检查清单
核心要点:
- 根据业务规模规划集群
- 建立高可用架构
- 优化配置参数
- 建立完善的运维体系
- 建立应急预案
- 定期性能优化
- 建立安全体系
参考资料
- RocketMQ 最佳实践官方文档
- RocketMQ 运维官方文档
- 《RocketMQ 技术内幕》第 12 章