目录
-
- [一、场景 & 服务器配置建议](#一、场景 & 服务器配置建议)
- [二、镜像版本解释:`rabbitmq:management` vs `rabbitmq:4-management`](#二、镜像版本解释:
rabbitmq:managementvsrabbitmq:4-management) - [三、最终推荐的 `docker-compose.yml`(去掉 vm_memory_high_watermark)](#三、最终推荐的
docker-compose.yml(去掉 vm_memory_high_watermark)) - [四、healthcheck 是干嘛的?](#四、healthcheck 是干嘛的?)
- [五、docker-compose 文件放哪里、怎么运行?](#五、docker-compose 文件放哪里、怎么运行?)
- [六、如何卸载 / 重装 RabbitMQ(Docker 版)](#六、如何卸载 / 重装 RabbitMQ(Docker 版))
- [七、docker compose 看日志(跟 docker 一样吗)](#七、docker compose 看日志(跟 docker 一样吗))
- [八、遇到的报错:`RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated`](#八、遇到的报错:
RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated)
一、场景 & 服务器配置建议
1. 业务量:每天 5000 万任务
假设情况:
- 每条任务作为一条消息进入 MQ;
- 消费能力跟得上(不会长时间堆积几亿条);
- 消息体不极大(几百字以内 JSON)。
综合经验 + 官方建议,大概这样配置比较合适:
CPU
-
8 核起步(物理核)
-
MQ 本身 CPU 压力不大,但你还有:
- 连接数管理
- 消息路由
- ack/confirm
- 管理界面 / metrics
你现在常用 8 核 16G 的机子,拿一台专门跑 MQ 问题不大。
内存
-
16 GB 比较舒服
-
只给 MQ 用的话,设置个粗暴经验:
- RabbitMQ 内部会自己根据物理内存算内存 watermark;
- 我们这次就 不主动改内存 watermark 了,避免你遇到的报错。
磁盘容量
关键是:是否会堆积很多"未消费的持久化消息"。
-
如果只是任务很快消费,队列里不会长期积压几千万:
-
MQ 本身持久化 + 元数据用不了太多(几十 GB 内)
-
建议:系统盘 + 数据盘
- 系统盘:40--80 GB
- 数据盘(挂载到
/data/rabbitmq):200 GB--500 GB,足够你观察一段时间
-
-
如果存在:
- 夜间批量写入,白天消费
- 或者某些异常可能短期堆积几亿条消息
那就建议把数据盘再拉大,比如 1 TB 级别。
一句话总结:
你这种"每天 5000w 任务",实际用下来,200--500 GB 的 SSD/NVMe 数据盘,90% 场景够用,后面不够再扩容。
磁盘 IO 要求
RabbitMQ 属于"高 IOPS + 小块写入"的应用:
-
强烈建议:SSD / NVMe 独立挂载一块盘,比如:
nvme0n1→ 挂载到/data- RabbitMQ 数据目录指到
/data/rabbitmq
-
大概指标印象:
- IOPS:几千级就够用(云盘一般轻松满足)
- 延迟:单次读写 <1ms 越好
如果你在同一块机械盘上又跑 DB 又跑 MQ,又跑爬虫日志,那就可能出现磁盘队头排队,吞吐掉下去。
二、镜像版本解释:rabbitmq:management vs rabbitmq:4-management
-
rabbitmq:management- 通常是 "当前默认稳定大版本 + management 插件"
- 比如之前常见的是
3.13.x-management
-
rabbitmq:4-management-
明确指定:4.x 大版本 + management 插件
-
好处:
- 你现在用的是 4.x 系列(更"新",接口/配置也有变化,比如你遇到的 env 弃用)
- 将来 RabbitMQ 出 5.x 时,
rabbitmq:management可能自动升级到 5.x;
但rabbitmq:4-management依然在 4.x,不会突然大升级。
-
你的偏好:"用最新稳定版"
- 如果你 想尝鲜 + 不怕大版本升级 :用
rabbitmq:management - 如果你想 锁定在 4.x 系列 (推荐生产这样搞):用
rabbitmq:4-management
你现在这个写法是 OK 的:
yaml
image: rabbitmq:4-management
三、最终推荐的 docker-compose.yml(去掉 vm_memory_high_watermark)
下面这个版本已经删掉 了会导致报错的
RABBITMQ_VM_MEMORY_HIGH_WATERMARK,只保留常用 & 安全配置。
yaml
version: "3.8"
services:
rabbitmq:
image: rabbitmq:4-management
container_name: rabbitmq
restart: always
hostname: rabbitmq-1
ports:
- "5672:5672" # 应用连接用的 AMQP 端口
- "15672:15672" # Web 管理界面
environment:
RABBITMQ_DEFAULT_USER: admin
RABBITMQ_DEFAULT_PASS: your_strong_password_here
# 注意:不要再加 RABBITMQ_VM_MEMORY_HIGH_WATERMARK 相关变量,4.x 已不推荐用 env 改
volumes:
- /data/rabbitmq/data:/var/lib/rabbitmq
- /data/rabbitmq/log:/var/log/rabbitmq
ulimits:
nofile:
soft: 1000000
hard: 1000000
# 生产环境可以加健康检查(可选)
# healthcheck:
# test: ["CMD", "rabbitmq-diagnostics", "ping"]
# interval: 30s
# timeout: 5s
# retries: 5
说明要点
-
账号密码是否通用?
-
RABBITMQ_DEFAULT_USER / PASS是 MQ 的用户:- 使用 5672 端口 的应用连接,需要这个账号密码(AMQP 协议)
- 使用 15672 管理界面 登录,也可以用这个账号密码
-
所以你可以理解为:两个端口都是这个账号密码在用,只是协议不同(一个 AMQP,一个 HTTP)。
-
-
ulimits参数解释yamlulimits: nofile: soft: 1000000 hard: 1000000nofile= 单进程最大打开文件数(套接字也算文件)soft= 运行时默认限制hard= 上限,soft 不能超过 hard
MQ 连接多、队列多、文件句柄多,所以要放大。
是不是越大越好?
-
不是。
-
太大可能会:
- 超出内核或系统允许范围(比如你没改
/etc/security/limits.conf,容器里配 1000000 也没用) - 在极端情况下放大内核内存占用(文件描述符表)
- 超出内核或系统允许范围(比如你没改
一般推荐:
-
生产 MQ:至少 100,000--200,000
-
你改成 1,000,000 也可以,只要:
- 宿主机
ulimit -n也调大 /etc/security/limits.conf和 Docker daemon 没有限制住
- 宿主机
-
系统级
ulimit如何调整以 Ubuntu 为例,步骤大概是:
-
编辑
/etc/security/limits.confbashsudo vim /etc/security/limits.conf追加:
text* soft nofile 1000000 * hard nofile 1000000如果你有专门的运行用户(比如
docker、ubuntu),也可以写成:textubuntu soft nofile 1000000 ubuntu hard nofile 1000000 -
编辑
/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive,保证有这一行(Ubuntu 一般默认有):textsession required pam_limits.so -
重新登录 SSH(非常关键),然后执行:
bashulimit -n确认已经变大。
-
Docker 容器里你已经在
docker-compose.yml里用ulimits放大了,就能继承宿主机的上限。
-
四、healthcheck 是干嘛的?
yaml
# healthcheck:
# test: ["CMD", "rabbitmq-diagnostics", "ping"]
# interval: 30s
# timeout: 5s
# retries: 5
-
这块是 Docker 的健康检查配置(被我注释掉了,可按需打开):
- 每隔
interval(30s)执行一次rabbitmq-diagnostics ping - 超过
timeout(5s)视为失败 - 连续失败
retries次,容器健康状态变为unhealthy
- 每隔
用途:
-
方便你在:
docker ps、docker compose ps看到容器健康状态- 结合 Swarm/K8s 等编排时,进行自动重启 / 剔除
不影响 MQ 正常跑,只是监控和编排更友好。
五、docker-compose 文件放哪里、怎么运行?
-
随便建一个目录,比如:
bashmkdir -p /opt/rabbitmq-docker cd /opt/rabbitmq-docker -
创建
docker-compose.yml文件:bashvim docker-compose.yml # 把前面的 compose 内容粘进去,保存 -
启动:
bashdocker compose up -d
(旧版本 docker 可能是 docker-compose up -d)
-
查看容器状态:
bashdocker compose ps -
访问管理界面:
- 浏览器打开:
http://服务器IP:15672 - 账号密码:
RABBITMQ_DEFAULT_USER / PASS对应的值。
- 浏览器打开:
六、如何卸载 / 重装 RabbitMQ(Docker 版)
Docker 的"卸载"本质上是:停止容器 + 删容器 + 删数据卷目录。
-
先停容器:
bashcd /opt/rabbitmq-docker docker compose down- 这一步只会关掉容器,不会删你挂载的
/data/rabbitmq/...目录。
- 这一步只会关掉容器,不会删你挂载的
-
如果你打算 彻底干净重装(包括删除所有队列数据):
bashrm -rf /data/rabbitmq/data rm -rf /data/rabbitmq/log -
再次启动(相当于全新安装):
bashdocker compose up -d -
如果只是想换配置(比如改账号、改端口),一般只需要:
-
改
docker-compose.yml -
然后:
bashdocker compose down docker compose up -d
不删
/data就不会丢消息。 -
七、docker compose 看日志(跟 docker 一样吗)
基本一样:
-
当前目录是
docker-compose.yml所在目录时:bash# 看所有服务的日志 docker compose logs -f # 只看 rabbitmq 这个服务 docker compose logs -f rabbitmq # 查看最近 100 行 docker compose logs --tail=100 rabbitmq -
单纯 docker 也类似:
bashdocker logs -f rabbitmq
两者差异:
docker compose logs会按 compose 里的 service 名称来过滤;docker logs用的是容器名或 ID。
八、遇到的报错:RABBITMQ_VM_MEMORY_HIGH_WATERMARK is set but deprecated
这个是 RabbitMQ 4.x 的新行为:
- 以前 3.x 可以通过环境变量
RABBITMQ_VM_MEMORY_HIGH_WATERMARK来配置; - 现在 4.x 提示:
这个环境变量已经弃用,建议用配置文件方式; - 你日志里这个错误不断刷,就是因为容器启动脚本看到这个 env,就一直报错。