服务公告

服务公告 > 综合新闻 > RocketMQ 消息队列-星耀云

RocketMQ 消息队列-星耀云

发布时间:2026-04-28 06:01
本文面向运维老兵,实战讲解RocketMQ单节点部署与基本运维操作,覆盖CentOS/RHEL和Ubuntu两大发行版,附带老手才知道的坑点吐槽。搞定消息队列从0到1,省去你到处翻文档的时间。
一、前言 干了10年运维,消息队列这玩意儿要么不用,要么一用就是踩坑无数。RocketMQ阿里系出身,工业级稳定性,但官方文档写得跟学生作业似的,部署文档缺胳膊少腿。今天把10年踩坑经验攒成这篇实战教程,手把手带你从零搭起可用环境,少走三个月弯路。 二、操作步骤

步骤1:环境检查与依赖确认

**CentOS/RHEL 执行:**
$ java -version
openjdk version "1.8.0_322" 64-Bit
$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15938        1234       11234         256        3468       14234
Swap:          4095           0        4095
**Ubuntu 执行:**
$ java -version
openjdk version "1.8.0_322" 64-Bit
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
$ free -m
              total        used        free      shared  buff/cache   available
Mem:          15938        1234       11234         256        3468       14234
Swap:          4095           0        4095
**预期输出说明:** 必须确认JDK 1.8+已安装,内存至少8G可用。RocketMQ吃内存不眨眼,4G小水管跑着跑着就OOM给你看。 ---
搞定这步之后,继续往下看

步骤2:下载RocketMQ二进制包

$ cd /opt
$ wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
--2024-01-15 10:30:45--  https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
Resolving archive.apache.org... 140.211.11.136
Connecting to archive.apache.org|140.211.11.136|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 68142321 (65M) [application/zip]
Saving to: 'rocketmq-all-4.9.4-bin-release.zip'

rocketmq-all-4.9.4-bin-release.zip      100%[===================>]  65.01M  2.1 MB/s    in 31s
2024-01-15 10:31:16 (2.09 MB/s) - 'rocketmq-all-4.9.4-bin-release.zip' saved [68142321/81]
**预期输出说明:** 下载完成会显示saved [68142321/81],如果网络慢换阿里云镜像源:
$ wget https://mirrors.aliyun.com/apache/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
---
完成这步之后,就简单了

步骤3:解压并创建软链接

$ unzip rocketmq-all-4.9.4-bin-release.zip
$ ln -s /opt/rocketmq-all-4.9.4-bin-release /opt/rocketmq
$ ls -la /opt/rocketmq
lrwxrwxrwx 1 root root 22 Jan 15 10:32 rocketmq -> /opt/rocketmq-all-4.9.4-bin-release
$ ls /opt/rocketmq/
benchmark  bin  conf  lib  licenses  NOTICE  README.md
**预期输出说明:** 解压后bin目录放启动脚本,conf目录放配置文件,lib目录放依赖jar包。别TM把conf删了改配置,有些人真干过这事。 ---
这一步搞定了,我们继续

步骤4:配置RocketMQ运行参数

**CentOS/RHEL 执行:**
$ vi /opt/rocketmq/bin/runserver.sh
# 找到以下行修改JVM参数
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"
# 默认-Xms4g -Xmx4g,4G物理机直接OOM,改成512m先跑起来
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"

$ vi /opt/rocketmq/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
**Ubuntu 执行:**
$ sudo vi /opt/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"

$ sudo vi /opt/rocketmq/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
**预期输出说明:** 生产环境按需调整,测试环境512m够用。改完别忘了wq保存,vi基本功不解释了。 ---
完成这步之后,就简单了

步骤5:启动NameServer

$ cd /opt/rocketmq/bin
$ nohup ./mqnamesrv > /var/log/rocketmq-namesrv.log 2>&1 &
[1] 15432

$ sleep 3
$ ps aux | grep mqnamesrv | grep -v grep
root     15432  0.2  0.0  123456  5678  pts/0    S    10:35   0:00 java -server -Xms512m -Xmx512m -Xmn256m ...

$ tail -20 /var/log/rocketmq-namesrv.log
2024-01-15 10:35:23 INFO NamesrvStartup:109 - RocketMQ NameServer starting...
2024-01-15 10:35:23 INFO NamesrvStartup:125 - NameServer bound to 0.0.0.0:9876
2024-01-15 10:35:23 INFO NamesrvStartup:146 - RocketMQ NameServer started successfully
**预期输出说明:** 看到"RocketMQ NameServer started successfully"才算成功,只起进程不算成功。默认监听9876端口,防火墙记得开。
# CentOS/RHEL 防火墙
$ firewall-cmd --permanent --add-port=9876/tcp
$ firewall-cmd --reload

# Ubuntu 防火墙
$ ufw allow 9876/tcp
$ ufw reload
---
搞定这步之后,继续往下看

步骤6:启动Broker

$ cd /opt/rocketmq/bin
$ nohup ./mqbroker -n localhost:9876 > /var/log/rocketmq-broker.log 2>&1 &
[2] 15456

$ sleep 5
$ ps aux | grep mqbroker | grep -v grep
root     15456  0.5  0.0  234567  8901  pts/0    S    10:36   0:00 java -server -Xms512m -Xmx512m -Xmn256m ...

$ tail -30 /var/log/rocketmq-broker.log
2024-01-15 10:36:05 INFO BrokerController:234 - Broker controller started, brokerName: localhost
2024-01-15 10:36:05 INFO BrokerController:267 - You broker[localhost, 192.168.1.100:10911] boot success...
2024-01-15 10:36:05 INFO BrokerController:289 - The broker[localhost, 192.168.1.100:10911] running as the mode SLAVE
2024-01-15 10:36:06 WARN BrokerController:445 - Load config exception, will try to use default config
2024-01-15 10:36:06 INFO BrokerController:512 - Brokers start successfully
**预期输出说明:** 看到"Brokers start successfully"表示Broker注册到NameServer成功。如果报connect refused,检查9876端口是否通,NameServer是否先启动了。 ---
搞定这步之后,继续往下看

步骤7:测试消息收发

$ export NAMESRV_ADDR=localhost:9876

# 发送测试消息
$ ./tools.sh org.apache.rocketmq.example.quickstart.Producer
10:40:15.123 [main] INFO Producer - Producer started successfully
10:40:15.234 [main] INFO Producer - Send message: Hello RocketMQ, count: 0
10:40:15.345 [main] INFO Producer - Send message: Hello RocketMQ, count: 1
...
10:40:16.789 [main] INFO Producer - Send 100 messages OK

# 消费测试消息
$ ./tools.sh org.apache.rocketmq.example.quickstart.Consumer
10:40:20.456 [main] INFO Consumer - Consumer started successfully
10:40:20.567 [MQClientFactoryScheduledThread] INFO Consumer - Subscribe Topic: TopicTest, Group: please_rename_unique_group_name
10:40:21.123 [ConsumeMessageThread_1] INFO Consumer - Receive message: Hello RocketMQ, count: 0
...
10:40:22.890 [ConsumeMessageThread_1] INFO Consumer - Consume 100 messages OK
**预期输出说明:** 发送100条、消费100条,0失败率才算链路通。有失败看日志别看表面数字,有些人截了图说通了,实际上有重试。 ---
搞完这步,离成功就不远了

步骤8:配置管理脚本(实用运维技巧)

$ cat > /opt/rocketmq/rocketmq-admin.sh << 'EOF'
#!/bin/bash
export ROCKETMQ_HOME=/opt/rocketmq
export NAMESRV_ADDR=localhost:9876

case $1 in
    start-namesrv)
        nohup $ROCKETMQ_HOME/bin/mqnamesrv > /var/log/rocketmq-namesrv.log 2>&1 &
        echo "NameServer started, PID: $!"
        ;;
    start-broker)
        nohup $ROCKETMQ_HOME/bin/mqbroker -n localhost:9876 > /var/log/rocketmq-broker.log 2>&1 &
        echo "Broker started, PID: $!"
        ;;
    stop)
        $ROCKETMQ_HOME/bin/mqshutdown broker
        $ROCKETMQ_HOME/bin/mqshutdown namesrv
        ;;
    status)
        ps aux | grep -E 'mqnamesrv|mqbroker' | grep -v grep
        ;;
    *)
        echo "Usage: $0 {start-namesrv|start-broker|stop|status}"
        ;;
esac
EOF

$ chmod +x /opt/rocketmq/rocketmq-admin.sh
$ /opt/rocketmq/rocketmq-admin.sh status
root 15432 ... mqnamesrv ...
root 15456 ... mqbroker ...
**预期输出说明:** 写个管理脚本省得每次敲一堆命令。注意$!拿PID,stop顺序先Broker再NameServer,别搞反了。 三、常见问题FAQ

Q1:NameServer启动报错" unable to find valid certification path to requested target"

老手回答:这TM是JDK证书问题,不是RocketMQ的问题。大概率你网络环境需要代理或者内网DNS污染。 **解决方法:**
# CentOS/RHEL
$ vi $JAVA_HOME/jre/lib/security/java.security
# 找到并修改
crypto.policy=unlimited

# 或者加启动参数跳过证书验证
$ vi /opt/rocketmq/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -Dcom.sun.management.ssl=false"

# 重启NameServer
$ /opt/rocketmq/bin/mqshutdown namesrv
$ nohup /opt/rocketmq/bin/mqnamesrv > /var/log/rocketmq-namesrv.log 2>&1 &


如果还不行,直接在内网部署,别走外网下载东西。

Q2:Broker连接不上NameServer,报"connect namesrv failed"

老手回答:这个问题问得最多,但答案就三个字:检查网络。
# 1. 检查NameServer端口是否监听
$ netstat -tlnp | grep 9876
tcp        0      0 0.0.0.0:9876    0.0.0.0:*    LISTEN      15432/java

# 2. 检查防火墙
$ iptables -L -n | grep 9876
# 不通就加规则
$ firewall-cmd --add-port=9876/tcp --permanent

# 3. 检查Broker配置里的namesrv地址
$ grep -A5 "namesrvAddr" /opt/rocketmq/conf/broker.conf
# 如果是空的就用启动参数指定
$ ./mqbroker -n 127.0.0.1:9876


90%是这个顺序排查完解决的,剩下10%是机器时间不同步导致的。

Q3:消息积压,消费不动,怎么快速处理

老手回答:消息积压分两种情况,你得先分清楚是消费端慢还是Broker性能不够。
# 查看消费积压情况
$ ./mqadmin consumerProgress -n localhost:9876
# 输出类似:
# consumerGroup    topic               subscriptionGroup        accumulated   consumptionDiff
# my-consumer      TopicTest           my-consumer-sub            50000        +200/s

# 如果accumulated持续增长,说明消费速度跟不上生产速度
# 解决方案:
# 1. 扩容消费者实例
# 2. 优化消费逻辑(异步处理、批量消费)
# 3. 增加消费者线程数


别TM上来就增加消费者线程数,先看日志找瓶颈在哪,90%的情况是你消费代码里有同步数据库操作拖慢了。

四、总结

**核心要点:**
- RocketMQ依赖JDK 1.8+,部署前先检查环境,别上来就装包
- NameServer和Broker启动顺序不能乱,必须先NameServer后Broker
- 测试环境JVM堆内存512m够用,生产环境按流量预估
- 防火墙记得开9876和10911两个端口
- 消息队列链路通了不代表没问题,必须做发送+消费的完整测试

**延伸阅读:**
- RocketMQ官方文档:https://rocketmq.apache.org/docs/
- 集群部署方案:双主双从同步双写模式生产必备
- 监控接入:Prometheus + Grafana监控队列深度和消费延迟
- 告警配置:重点监控queue深度>10万、consume线程池满、GC频繁

搞消息队列最怕的不是部署,是线上出问题不知道在哪。搭完环境顺手把监控和告警配上,不然半夜报警你连日志在哪都不知道。                

上一篇: Apache-星耀云

下一篇: VsCode-星耀云