rocketmq 4.X 扩容思路

本文分享了参加RocketMQ杭州站Meetup的感悟,深入讨论了RocketMQ的master/slave配置下slave重启对master性能的影响及解决方案,提出了通过写禁止实现broker无缝扩容的思路,并展望了计算存储分离的未来架构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开篇

 周末抽空去参加了rocketmq杭州站的Meetup,虽然之前阅读过rocketmq的一些源码,不过本身不是专业运维消息中间件的所以相对的运维经验不足,在跟公司的中间件普大神聊天的时候提到了一些问题,刚好趁这次机会一起请教了。

 整个分享过程中有两个问题印象比较深刻:1、master/slave的主从配置下slave重启会重新拷贝master数据导致master的写性能下降;2、现有架构下的broker的扩容思路以及未来broker的读写分离架构,写个文章记录下。

 针对问题一:现有mq的主从同步方式没办法进行限流,提出一个思路就是如果master因为主从同步导致master写入性能下降那么在条件允许的情况下实现master的写禁止。

 针对问题二:现有mq的架构下也可以通过巧用mq的写禁止来实现无缝扩容,扩容思路见下面的图解,额外补充一句:这部分思路纯属个人交流没有实战操作经验,供探索。


扩容思路

扩容前现状

说明:

  • 1、 假设原来的broker集群有两个broker节点,由于容量估算导致磁盘空间不足。
  • 2、 思路一:如果考虑消息可丢失可以通过删除一部分commitlog来释放空间。
  • 3、 思路二:通过扩容broker来实现磁盘空间的可扩容。



扩容后部署

说明:

  • 1、 步骤一:新增3台broker节点,与原来2台broker节点组成5个broker节点集群。
  • 2、 步骤二:由于旧集群的broker依然会进行数据写入,磁盘空间依旧告急。
  • 3、 步骤三:对旧集群的2台broker通过admin配置命令禁止数据写入但依然允许读操作。
  • 4、 效果:通过写禁止解决原broker集群的磁盘空间问题,通过原broker的读允许保证数据依然能够消费。


未来的架构

broker未来架构

说明:

  • 1.、mq的未来版本当中会针对broker进行改造,针对broker层会实现计算和存储的分离。
  • 2、 计算存储分离之后,broker的功能会退化成读写层,变成无状态的一层。
  • 3、 计算存储分离之后,存储层会提供存储扩容功能,具体的细节等mq的版本发布再看。


招聘信息

【招贤纳士】

欢迎热爱技术、热爱生活的你和我成为同事,和贝贝共同成长。

贝贝集团诚招算法、大数据、BI、Java、PHP、android、iOS、测试、运维、DBA等人才,有意可投递zhi.wang@beibei.com

贝贝集团创建于2011年,旗下拥有贝贝网、贝店、贝贷等平台,致力于成为全球领先的家庭消费平台。

贝贝创始团队来自阿里巴巴,先后获得IDG资本、高榕资本、今日资本、新天域资本、北极光等数亿美金的风险投资。

公司地址:杭州市江干区普盛巷9号东谷创业园(上下班有多趟班车)

<think>我们正在解决Docker部署的RocketMQ5.3实例因磁盘空间不足导致的错误。根据之前部署方案,我们知道RocketMQ在Docker容器中运行时会使用挂载的本地目录来存储消息(store目录)和日志(logs目录)。磁盘空间不足可能是由于这些挂载目录所在磁盘分区空间不足,或者容器内存储的消息和日志过多导致。解决方案思路:1.检查宿主机磁盘空间:确保挂载目录所在的磁盘有足够空间。2.清理RocketMQ存储:删除旧的、不再需要的消息文件(commitlog和consumequeue)。3.调整RocketMQ配置:设置消息的保留时间,自动清理过期消息。4.扩展磁盘空间(如果需要):如果磁盘空间确实不足,考虑增加磁盘空间或迁移挂载目录到更大分区。具体步骤: ###1.检查磁盘空间使用命令检查宿主机磁盘空间: ```bashdf -h```查看挂载目录(例如`/your/local/path/broker/store`和`/your/local/path/broker/logs`)所在分区的使用情况。###2.清理RocketMQ存储如果磁盘空间不足是由于消息存储过多,可以手动删除旧的存储文件。注意:删除存储文件可能会导致消息丢失,请确保这些消息已经不再需要。 RocketMQ的消息存储目录结构如下: ```store├── commitlog├── config├──consumequeue├──index└──lock```其中,`commitlog`目录存放实际消息,`consumequeue`存放消息索引。清理步骤:1.停止Broker容器:```bashdockerstop rmqbroker```2.删除`commitlog`和`consumequeue`目录下的旧文件。RocketMQ按照时间分文件,文件名是偏移量(长整数),代表该文件第一条消息的存储时间。我们可以根据时间删除旧文件。例如,删除7天前的commitlog文件(注意:RocketMQ默认按时间滚动生成文件,每个文件1G):```bashfind/your/local/path/broker/store/commitlog-typef -mtime+7-execrm {}\;```同样,删除consumequeue目录下的旧文件:```bashfind/your/local/path/broker/store/consumequeue -type f-mtime +7 -exec rm{} \;```注意:`/your/local/path`替换为实际挂载路径。3.启动Broker容器:```bashdockerstart rmqbroker```###3.调整Broker配置自动清理为了避免再次出现磁盘空间不足,我们应该调整Broker的配置文件`broker.conf`,设置消息的保留时间。在`broker.conf`中添加或修改以下配置: ```properties#消息存储时间(小时),默认72小时fileReservedTime=48#清理文件的时间点(默认凌晨4点) deleteWhen=04```解释:- `fileReservedTime`:消息保留时间,单位小时,超过这个时间的消息文件会被自动删除。- `deleteWhen`:在每天的什么时候执行删除,这里设置为凌晨4点。修改配置后,重启Broker容器使配置生效:```bashdockerrestart rmqbroker``` ###4.扩展磁盘空间如果宿主机磁盘空间不足,可以考虑: -清理宿主机上其他无用文件。-将挂载目录迁移到更大的磁盘分区。 -扩展当前磁盘分区(如果支持)。 ###5.监控磁盘空间建议设置监控,当磁盘空间使用超过一定阈值时报警。 ###注意事项-删除消息文件是危险操作,确保在业务低峰期进行,并备份重要数据。-调整`fileReservedTime`时,需要根据业务需求设置合理的保留时间。通过以上步骤,应该能够解决磁盘空间不足的问题,并防止问题再次发生。引用说明: [^1]:在Docker部署中,我们挂载了store目录,因此消息文件存储在宿主机的挂载目录中,磁盘空间不足指的是宿主机对应目录所在分区的空间不足。[^2]:RocketMQ的存储机制中,消息存储文件(commitlog)和消息队列文件(consumequeue)会随着时间增长,因此需要定期清理。相关问题:1.RocketMQ5.3的存储机制有哪些改进?2.如何监控RocketMQ磁盘使用情况?3.Docker容器磁盘空间不足的通用解决方案有哪些?4. RocketMQ Broker的配置参数中,还有哪些与存储相关的参数可以优化?</think>### Docker 部署 RocketMQ 5.3 磁盘空间不足解决方案 当 Docker 部署的 RocketMQ 5.3 报错 "disk is full" 时,需从存储机制和容器配置两方面解决。以下是完整解决方案: --- #### 一、问题定位步骤 1. **检查宿主机磁盘空间**: ```bash df -h # 查看磁盘使用情况 du -sh /挂载目录/* # 检查挂载目录大小(如 /mydata/rocketmq) ``` 2. **检查容器存储状态**: ```bash docker exec -it rmqbroker sh df -h /home/rocketmq/store # 查看容器内存储路径 ``` --- #### 二、核心解决方案 ##### 方案 1:清理过期消息文件 修改 `broker.conf` 配置文件: ```properties # 缩短消息保留时间(单位:小时) fileReservedTime=24 # 设置清理时间点(凌晨4点) deleteWhen=04 ``` 重启 Broker 容器: ```bash docker restart rmqbroker ``` ##### 方案 2:扩展存储空间 1. **迁移挂载目录**: ```bash # 创建新存储目录 mkdir /new/large/disk/store # 停止并重建容器(更新挂载路径) docker run ... -v /new/large/disk/store:/home/rocketmq/store ... ``` 2. **动态扩展 Docker 卷**(若使用 volume): ```bash docker volume inspect rocketmq_store # 使用工具如 lvextend 扩展底层文件系统 ``` ##### 方案 3:优化存储机制 在 `broker.conf` 中添加: ```properties # 启用透明大页压缩(减少磁盘占用) transientStorePoolEnable=true # 调整刷盘策略(降低IO压力) flushDiskType=ASYNC_FLUSH ``` --- #### 三、预防措施 1. **监控配置**: ```properties # broker.conf 添加磁盘警戒线 diskMaxUsedSpaceRatio=85 ``` 2. **日志轮转**: ```bash # 容器启动时限制日志大小 docker run ... --log-opt max-size=100m --log-opt max-file=5 ``` 3. **定期清理脚本**: ```bash # 清理超过7天的 commitlog find /挂载目录/store/commitlog -type f -mtime +7 -exec rm {} \; ``` --- #### 四、根本原因解析 RocketMQ 磁盘空间问题通常由以下原因导致: 1. **消息堆积**:未消费消息持续占用 `commitlog`(默认保留72小时)[^4] 2. **存储配置不当**:挂载目录位于小容量磁盘分区 3. **日志膨胀**:未限制容器日志大小 4. **刷盘策略**:同步刷盘(`SYNC_FLUSH`)导致高IO负载[^4] > 通过 `docker exec rmqbroker sh bin/mqadmin statsAll` 可查看消息堆积情况 --- #### 五、验证修复效果 ```bash # 查看 Broker 运行状态 docker exec rmqbroker sh bin/mqadmin brokerStatus -n localhost:9876 # 检查磁盘警戒线配置 grep "diskMaxUsedSpaceRatio" ./broker.conf ``` ### 相关问题 1. RocketMQ 5.3 的消息存储机制与 4.x 版本有何区别? 2. 如何通过 Prometheus 监控 Docker 容器的磁盘使用情况? 3. RocketMQ 在 Kubernetes 中如何实现持久化存储的动态扩容4. 哪些配置参数可以优化 RocketMQ 在高吞吐场景下的磁盘 IO 性能? 5. 如何安全地清理 RocketMQ 的历史消息而不影响正在消费的消息?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值