资讯动态

RocketMQ环境搭建:单机、集群、Docker部署适配微服务项目

发布时间:2026/9/6 7:54:27 来源:尧图企业网站定制
RocketMQ环境搭建单机、集群、Docker部署适配微服务项目作者黒漂技术佬系列专栏RocketMQ核心原理与无人售货柜项目实战一、环境准备1.1 JDK要求RocketMQ 5.x 要求JDK 8 或以上推荐JDK 8/11 LTS版本。先确认本机JDK环境java-version# 输出类似openjdk version 1.8.0_362如果没装JDKUbuntu下一行搞定sudoaptinstall-yopenjdk-8-jdkCentOSsudoyuminstall-yjava-1.8.0-openjdk-devel1.2 Linux系统配置RocketMQ跑在生产环境时有几个系统参数需要调优# 1. 文件描述符限制RocketMQ会打开大量文件echo* soft nofile 65536/etc/security/limits.confecho* hard nofile 65536/etc/security/limits.conf# 2. 关闭swap避免内存页被换到磁盘影响性能sudoswapoff-a# 3. 调整vm.swappiness不想完全关闭swap的话echovm.swappiness0/etc/sysctl.confsysctl-p开发环境不用这么讲究但文件描述符建议调一下否则跑起来可能报Too many open files。二、单机部署最原始的方式单机部署适合第一次接触RocketMQ手动走一遍流程能理解各组件的关系。2.1 下载发行包到RocketMQ官网下载页面选择5.x稳定版# 下载以5.3.1为例wgethttps://archive.apache.org/dist/rocketmq/5.3.1/rocketmq-all-5.3.1-bin-release.zip# 解压unziprocketmq-all-5.3.1-bin-release.zipcdrocketmq-all-5.3.1-bin-release解压后目录结构rocketmq-all-5.3.1-bin-release/ ├── bin/ # 启动脚本mqnamesrv、mqbroker、mqadmin等 ├── conf/ # 配置文件 ├── lib/ # 依赖jar包 ├── logs/ # 日志目录 └── store/ # 消息存储目录2.2 启动NameServer# 前台启动看日志用shbin/mqnamesrv# 后台启动生产环境用nohupshbin/mqnamesrvlogs/namesrv.log21看到The Name Server boot success. serializeTypeJSON就说明启动成功了。NameServer默认监听9876端口。2.3 启动Broker启动Broker之前需要指定NameServer地址。有两种方式方式一环境变量exportNAMESRV_ADDR127.0.0.1:9876nohupshbin/mqbrokerlogs/broker.log21方式二配置文件# 编辑conf/broker.conf添加NameServer地址namesrvAddr127.0.0.1:9876# 同时指定Broker的IP多网卡环境下必须配brokerIP1127.0.0.1# 启动时指定配置文件nohupshbin/mqbroker-cconf/broker.conflogs/broker.log21看到The broker boot success日志就OK了。Broker默认监听10911端口。2.4 验证发送和消费测试消息RocketMQ自带了测试工具可以快速验证环境是否正常# 设置NameServer地址exportNAMESRV_ADDR127.0.0.1:9876# 发送测试消息shbin/tools.sh org.apache.rocketmq.example.quickstart.Producer# 看到大量 SendResult 输出说明发送成功# 消费测试消息shbin/tools.sh org.apache.rocketmq.example.quickstart.Consumer# 看到大量 ConsumeMessageThread 输出说明消费成功2.5 关闭服务shbin/mqshutdown broker# 先关Brokershbin/mqshutdown namesrv# 再关NameServer三、Docker部署开发环境首选强烈推荐手动部署搞一遍理解原理就够了日常开发用Docker一键拉起才是正道。下面给出一个完整的docker-compose.yml编排NameServer Broker Dashboard三件套。3.1 docker-compose.ymlversion:3.8services:namesrv:image:apache/rocketmq:5.3.1container_name:rmqnamesrvports:-9876:9876environment:-JAVA_OPT_EXT-server-Xms512m-Xmx512m-Xmn128mcommand:sh mqnamesrvvolumes:-./data/namesrv/logs:/home/rocketmq/logsnetworks:-rocketmq-netbroker:image:apache/rocketmq:5.3.1container_name:rmqbrokerports:-10909:10909-10911:10911-10912:10912environment:-NAMESRV_ADDRnamesrv:9876-JAVA_OPT_EXT-server-Xms512m-Xmx512m-Xmn128mcommand:sh mqbroker-c /home/rocketmq/conf/broker.confvolumes:-./data/broker/logs:/home/rocketmq/logs-./data/broker/store:/home/rocketmq/store-./config/broker.conf:/home/rocketmq/conf/broker.confdepends_on:-namesrvnetworks:-rocketmq-netdashboard:image:apacherocketmq/rocketmq-dashboard:1.0.0container_name:rmqdashboardports:-8080:8080environment:-JAVA_OPTS-Drocketmq.namesrv.addrnamesrv:9876depends_on:-brokernetworks:-rocketmq-netnetworks:rocketmq-net:driver:bridge3.2 Broker配置文件在./config/broker.conf中写入# Broker名称 brokerNamebroker-a # Broker ID0Master0Slave brokerId0 # 删除过期文件时间凌晨4点 deleteWhen04 # 文件保留时长48小时 fileReservedTime48 # Broker角色ASYNC_MASTER异步复制Master brokerRoleASYNC_MASTER # 刷盘方式ASYNC_FLUSH异步刷盘 flushDiskTypeASYNC_FLUSH # 自动创建Topic开发环境开启生产环境关闭 autoCreateTopicEnabletrue # 自动创建订阅组 autoCreateSubscriptionGrouptrue # Broker对外IP重要容器外访问必须配 brokerIP1宿主机IP这里有个大坑brokerIP1如果不配或配错Producer/Consumer从NameServer拿到的Broker地址是容器内部IP从容器外连不上。开发环境配成宿主机IP即可。3.3 端口映射说明端口用途说明9876NameServerProducer/Consumer连接获取路由10909Broker FastRemoting高速通道端口10911Broker Listen主监听端口收发消息10912Broker HAMaster-Slave数据同步端口8080Dashboard可视化控制台Web端口3.4 启动和停止# 启动在docker-compose.yml所在目录docker-composeup-d# 查看容器状态docker-composeps# 查看Broker日志dockerlogs-frmqbroker# 停止docker-composedown启动后访问http://localhost:8080就能看到Dashboard界面了。3.5 数据卷说明挂载的目录作用./data/namesrv/logsNameServer日志排查路由问题用./data/broker/logsBroker日志排查消息收发问题./data/broker/store消息存储文件CommitLog/ConsumeQueue删了这个等于清空所有消息开发环境想重置MQ删掉store目录重启Broker就行比删数据库还刺激。四、集群部署概述生产环境不能单机跑至少得搭集群。RocketMQ支持多种集群模式4.1 多Master模式最简单的集群多个Broker都是Master互为主从。NameServer-1 NameServer-2 ↑ ↑ │心跳 │心跳 ┌──┴──┐ ┌───┴──┐ │Master│ │Master│ │ A │ │ B │ └──────┘ └──────┘优点配置简单无Slave开销性能最高缺点单台Master宕机期间该Broker上的消息不可用适用日志类、允许少量丢失的场景4.2 多Master多Slave-异步复制每个Master配一个SlaveMaster异步复制数据到Slave。┌────────┐ ┌────────┐ │Master-A│ │Master-B│ └───┬────┘ └───┬────┘ │异步复制 │异步复制 ┌───┴────┐ ┌───┴────┐ │Slave-A │ │Slave-B │ └────────┘ └────────┘优点Master宕机后Slave可提供读服务数据基本不丢缺点Master宕机瞬间可能有少量未复制的数据丢失适用大多数业务场景售货柜订单、支付回调4.3 多Master多Slave-同步双写和上面一样但Master写消息时同步等Slave写完才返回。优点数据零丢失缺点发送延迟略增约增加几毫秒Slave不可用时Master会阻塞适用金融级强一致场景支付核心链路售货柜项目建议订单和支付消息走同步双写的集群日志和行为数据走异步复制的集群按Topic分布到不同Broker上。五、RocketMQ Dashboard可视化控制台Dashboard是RocketMQ的Web管理界面日常开发排查问题离不开它。5.1 功能一览Dashboard主要功能运维查看集群状态、Broker列表、Broker配置主题Topic管理创建/删除/查看、队列分布、消息轨迹消费者ConsumerGroup列表、消费进度、堆积量监控消息按Topic/MessageId/Key查询消息内容、重新投递消息死信队列查看死信消息、重新投递5.2 日常排查常用操作查消息是否发送成功消息 → 按Topic查询 → 选择时间范围 → 看消息列表。能看到消息说明Producer没问题。查消费进度消费者 → 选择ConsumerGroup → 查看消费位点Offset。如果Broker最新Offset和Consumer消费Offset差距很大说明消息堆积了。查死信队列主题 → 筛选%DLQ%开头的Topic → 查看死信消息。死信队列里的消息是重试16次仍然失败的需要人工介入。六、常见部署问题问题1内存不足Broker启动直接被OOM KillRocketMQ默认JVM内存配置比较大8G开发机扛不住。解决修改bin/runbroker.sh里的JVM参数# 原始值适合生产# JAVA_OPT${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g# 改小适合开发JAVA_OPT${JAVA_OPT}-server -Xms512m -Xmx512m -Xmn128mNameServer同理改bin/runnamesrv.shJAVA_OPT${JAVA_OPT}-server -Xms256m -Xmx256m -Xmn128m问题2端口不通Broker注册到NameServer但Producer连不上症状NameServer里有Broker信息但Producer发送时报connect to ip:port failed。原因99%是brokerIP1没配对。Broker注册到NameServer的IP是从网卡自动获取的Docker容器里拿到的是容器内网IP外部根本访问不到。解决在broker.conf中显式配置brokerIP1你的宿主机IP或公网IP问题3Broker注册失败NameServer看不到Broker症状Dashboard的集群页面看不到Broker或只看到NameServer。排查步骤# 1. 确认NameServer启动且端口通telnet127.0.0.19876# 2. 确认Broker配置的NameServer地址正确catconf/broker.conf|grepnamesrvAddr# 3. 看Broker日志tail-100logs/broker.log# 如果有 register broker to name server 但没成功响应# 检查防火墙是否放行9876端口# 4. 用mqadmin工具手动查看路由shbin/mqadmin clusterList-n127.0.0.1:9876问题4Docker部署Broker闪退原因broker.conf挂载路径不对或文件格式有问题Windows编辑的文件带了CRLF换行符。解决确保配置文件路径和docker-compose.yml中一致且文件用LF换行。可以用dos2unix转一下dos2unix config/broker.conf七、开发环境快速启动命令清单把整套环境拉起来的完整命令照着敲就行# 1. 创建目录结构mkdir-procketmq-docker/{data/namesrv/logs,data/broker/logs,data/broker/store,config}cdrocketmq-docker# 2. 写broker.confcatconfig/broker.confEOF brokerNamebroker-a brokerId0 deleteWhen04 fileReservedTime48 brokerRoleASYNC_MASTER flushDiskTypeASYNC_FLUSH autoCreateTopicEnabletrue autoCreateSubscriptionGrouptrue brokerIP1127.0.0.1 namesrvAddrnamesrv:9876 EOF# 3. 写docker-compose.yml复制上面的内容# ...略# 4. 启动docker-composeup-d# 5. 等待10秒查看状态sleep10docker-composeps# 6. 验证Broker注册成功dockerexecrmqbrokershmqadmin clusterList-nnamesrv:9876# 7. 访问Dashboard# 浏览器打开 http://localhost:8080看到Dashboard的集群页面有Broker信息说明环境搭建完成可以开始写代码了。八、小结这一篇覆盖了单机部署理解原理、Docker部署日常开发首选、集群部署生产环境三种模式三种方式详细说明了Dashboard的使用和常见部署坑。下一篇我们正式进入代码实战学习RocketMQ的三种消息发送方式和消费方式。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价