- 后端
- 消息队列
- 消息路由
【免费下载链接】rabbitmq-server
Open source RabbitMQ: core server and tier 1 (built-in) plugins
RabbitMQ 的 Quorum Queues(仲裁队列)基于 Raft 共识算法实现,每个队列都由一个 Raft 组(由集群中多个节点上的 Raft 成员组成)承载。本文围绕仓库中 RabbitMQ-Quorum-Queues-Raft 仪表盘发布文档 展开,结合 rabbitmq-prometheus 插件源码 与仓库内配套的 Docker 演示环境,讲解如何通过 Grafana 仪表盘观测集群中所有 Quorum Queue Raft 成员的提交速率、提交延迟、未提交日志、选主频率与日志积压,并掌握每个面板的 PromQL 查询与故障诊断思路。
一、仪表盘定位:一张图看懂 Quorum Queues 的 Raft 状态
原文档对该仪表盘的定义非常明确:
Raft state for all Quorum Queues running in a RabbitMQ cluster —— 展示集群中所有 Quorum Queue 所运行 Raft 成员的状态。
它解决的核心问题在于:Quorum Queue 的每一个队列实例实际上都是一个 Raft 状态机,数据以日志(log)形式追加写入、通过多数派(quorum)提交后才算成功。传统队列监控只能看到吞吐与积压,而这张仪表盘把视角下沉到Raft 共识层,帮助你回答几类关键问题:
- 集群当前整体的日志提交吞吐是多少(发布、消费确认等所有队列操作都包含在内);
- 一条日志从写入到被提交需要多久(Raft 开销的量化指标);
- 是否有日志已经写入但迟迟无法提交(往往意味着成员失联、多数派不可用);
- 是否有频繁的 Leader 选举(term 快速增长通常是网络抖动或节点不稳定信号);
- 哪些队列的 Raft 日志已经积压了超过 5000 条(可能是大积压,也可能是可用性问题)。
原文档明确说明该仪表盘面向 RabbitMQ 3.8.x 集群,并依赖rabbitmq-prometheus插件——该插件自 RabbitMQ v3.8.0 起内置。从仓库中仪表盘 JSON 的定义(RabbitMQ-Quorum-Queues-Raft.json)可以看到,面板查询同时保留了旧版指标名(如rabbitmq_raft_log_commit_index)与 RabbitMQ 4.2+ 的新指标名(如rabbitmq_raft_commit_index),因此新旧版本均可使用。
二、五大核心面板:指标含义、PromQL 与诊断解读
仪表盘共包含 5 个面板,全部由 RabbitMQ-Quorum-Queues-Raft.json 定义。每个面板的查询都通过on(instance, job) group_left(rabbitmq_cluster, rabbitmq_node)与rabbitmq_identity_info做标签关联,把指标归属到具体的 RabbitMQ 集群与节点,并按rabbitmq_node分组。
2.1 Log entries committed / s(每秒提交的日志条目数)
这是一个 Time series 折线面板,统计 Raft 日志提交速率。面板描述指出:它包含所有队列操作,包括发布与消费者确认;它跟踪的是所有成员(含 follower)上 commit index 的推进速度。如果一个 RabbitMQ 节点没有运行任何 Raft 成员,它不会上报任何已提交条目。
主查询(旧版指标名):
sum(rate(rabbitmq_raft_log_commit_index[$__rate_interval]) * on(instance, job) group_left(rabbitmq_cluster, rabbitmq_node) rabbitmq_identity_info{rabbitmq_cluster="$rabbitmq_cluster", namespace="$namespace",rabbitmq_endpoint="$endpoint"}) by(rabbitmq_node)RabbitMQ 4.2+ 版本使用新指标名rabbitmq_raft_commit_index,其余结构相同。该面板为每条节点序列设置了 80 的阈值(红色告警线),并内置了节点级颜色编码:节点名末尾数字 0–9 分别对应固定颜色(如rabbit@…0为绿色#56A64B、rabbit@…1为黄色#F2CC0C、rabbit@…2为蓝色#3274D9等),便于多节点对比。
2.2 Log entry commit latency(日志提交延迟)
这是一个 Heatmap 热力图面板,度量一条日志从写入 Raft 日志到被提交所耗费的时间,是Raft 操作开销的直接指示器。面板描述给出了两个关键论断:
- 随着负载增加,系统会用延迟换取吞吐,因此该值会随负载上升;
- Quorum Queue 在提交前会对所有操作执行 fsync 落盘,因此它们天然不适合低延迟负载场景。
查询表达式:
rabbitmq_raft_commit_latency_seconds * on(instance, job) group_left(rabbitmq_cluster, rabbitmq_node) rabbitmq_identity_info{rabbitmq_cluster="$rabbitmq_cluster", namespace="$namespace",rabbitmq_endpoint="$endpoint"}热力图按秒(unit: s)绘制延迟分布,配合 Y 轴直方图可观察提交延迟的整体分布形态与拖尾。
2.3 Uncommitted log entries(未提交日志条目数)
统计「已写入但尚未提交」的 Raft 日志数量,即 last written index 与 commit index 的差值:
sum( (rabbitmq_raft_log_last_written_index * on(instance, job) group_left(rabbitmq_cluster, rabbitmq_node) rabbitmq_identity_info{rabbitmq_cluster="$rabbitmq_cluster", namespace="$namespace",rabbitmq_endpoint="$endpoint"}) - (rabbitmq_raft_log_commit_index * on(instance, job) group_left(rabbitmq_cluster, rabbitmq_node) rabbitmq_identity_info{rabbitmq_cluster="$rabbitmq_cluster", namespace="$namespace",rabbitmq_endpoint="$endpoint"}) ) by(rabbitmq_node)RabbitMQ 4.2+ 版本对应替换为rabbitmq_raft_last_written_index与rabbitmq_raft_commit_index。
面板描述给出了明确的诊断结论:高且持续增长的值,可能表明无法凑齐多数派成员(quorum of members not being available),导致队列无法推进——这是排查 Quorum Queue「卡住不消费/不产出」类故障的第一指标。
2.4 Leader elections / s(每秒 Leader 选举次数)
跟踪 Raft term 的递增速率:
sum(rate(rabbitmq_raft_term[$__rate_interval]) * on(instance, job) group_left(rabbitmq_cluster, rabbitmq_node) rabbitmq_identity_info{rabbitmq_cluster="$rabbitmq_cluster", namespace="$namespace",rabbitmq_endpoint="$endpoint"}) by(rabbitmq_node)面板描述指出:
- 持续非零的选举速率通常意味着网络问题或可用性问题,或是队列频繁增减(queue churn),另一种可能原因是频繁的 Quorum Queue 声明(每次声明新队列都会触发 Raft 组初始化);
- 大于 0 是正常的,少量选举在预期之内;持续高值才值得警惕。
面板设置了 3 次/秒的橙色告警阈值(thresholdsStyle: line+area),方便快速识别异常区间。
2.5 Raft members with >5k entries in the log(日志条目超过 5000 的 Raft 成员)
统计自上次快照(snapshot)以来每个 Raft 日志中积累的条目数:
sum( (rabbitmq_raft_log_last_written_index * on(instance, job) group_left(rabbitmq_cluster, rabbitmq_node) rabbitmq_identity_info{rabbitmq_cluster="$rabbitmq_cluster", namespace="$namespace",rabbitmq_endpoint="$endpoint"}) - (rabbitmq_raft_log_snapshot_index * on(instance) group_left(rabbitmq_cluster, rabbitmq_node) rabbitmq_identity_info{rabbitmq_cluster="$rabbitmq_cluster", namespace="$namespace",rabbitmq_endpoint="$endpoint"}) ) by(queue, rabbitmq_node)RabbitMQ 4.2+ 版本对应替换为rabbitmq_raft_last_written_index与rabbitmq_raft_snapshot_index。面板按queue与rabbitmq_node分组,图例格式为{{rabbitmq_node}} {{queue}},可精确定位到具体队列。
面板描述给出了组合判读方法:
- 大值可能意味着较大的 Quorum Queue 积压(backlog),也可能是可用性问题;
- 如果 Uncommitted entries 指标同时也很大,则系统存在真实的可用性问题(日志既积压又无法提交,说明多数派很可能不可用)。
面板以 5000 条为阈值做了颜色区分(0–5000 绿色,5000 以上橙色),这与面板标题中的 ">5k" 完全对应。
三、指标源头:Raft 指标采集器的源码实现
仪表盘展示的所有rabbitmq_raft_*指标,都来自 prometheus_rabbitmq_raft_metrics_collector.erl。理解它的实现有助于你判断指标的粒度与含义。
3.1 指标前缀与三种采集模式
Collector 定义了三个指标前缀:
| 前缀 | 用途 |
|---|---|
rabbitmq_raft_ | 默认聚合(aggregate)模式与 per-object 模式下的指标名 |
rabbitmq_detailed_raft_ | /metrics/detailed端点下的详细指标 |
采集模式由collect_mf/2的注册表参数决定,并在默认模式下读取应用环境变量return_per_object_metrics(对应配置文件中的prometheus.return_per_object_metrics):
- 聚合模式(默认,
return_per_object_metrics=false):输出collect_aggregate_metrics/2,即「关键组件指标 + max 聚合指标」,不带 queue 标签,指标总量可控; - per-object 模式(
return_per_object_metrics=true):输出collect_per_object_metrics/2,为每个 Quorum Queue 输出带queue、vhost等标签的指标,面板中按 queue 分组的查询依赖这种粒度; - detailed 模式:通过
/metrics/detailed端点配合prometheus_vhost_filter、prometheus_queue_filter过滤指定 vhost 与队列,输出rabbitmq_detailed_raft_前缀的全量指标。
3.2 Quorum Queue 与协调系统的区分
采集器通过两个过滤函数区分指标归属:
does_belong_to_quorum_queue/1:匹配带queue标签的指标,即 Quorum Queue 的 Raft 指标;does_belong_to_coordination_system/1:匹配ra_system => coordination的指标,即集群协调系统(如 Khepri)的 Raft 指标。
Quorum Queue 部分只取固定指标集:term、snapshot_index、last_applied、commit_index、last_written_index、commit_latency、num_segments——这正是仪表盘各面板所用指标(commit index、commit latency、last written index、snapshot index、term)的直接来源。同时采集器还通过seshat:format(ra, …)输出 Raft 写入前端的 WAL 指标(wal_files、bytes_written、mem_tables)与 Segment Writer 指标(entries、segments)。
3.3 max 聚合指标
在聚合模式下,采集器会对 Quorum Queue 的num_segments与commit_latency两类指标跨队列求最大值,输出rabbitmq_raft_max_num_segments、rabbitmq_raft_max_commit_latency,标签固定为ra_system="quorum_queues"(源码注释中注明这里硬编码了 ra_system,理想做法是max() GROUP BY ra_system)。这类指标适合做跨集群的聚合告警。
四、仪表盘的过滤与模板变量
原文档指出该仪表盘支持按RabbitMQ Cluster过滤。在 RabbitMQ-Quorum-Queues-Raft.json 的templating部分可以看到完整的变量体系:
| 变量 | 类型 | 数据来源 | 说明 |
|---|---|---|---|
DS_PROMETHEUS | datasource | Prometheus | 数据源选择 |
namespace | query | label_values(rabbitmq_identity_info, namespace) | Kubernetes 命名空间维度 |
endpoint | query | label_values(rabbitmq_identity_info{…}, rabbitmq_endpoint) | 指标端点(默认端点排除memory-breakdown) |
rabbitmq_cluster | query | label_values(rabbitmq_identity_info{namespace="$namespace"}, rabbitmq_cluster) | 即文档所述「RabbitMQ Cluster」过滤,对应配置项cluster_name |
所有面板查询都会引用$rabbitmq_cluster、$namespace、$endpoint三个变量,因此在一个 Prometheus 同时监控多个 RabbitMQ 集群时,可以轻松切换视角。仪表盘默认刷新间隔 15s(refresh: "15s"),默认时间范围now-15m,均可在 Grafana 中调整。
五、三步快速开始:用仓库自带 Docker 环境复现
原文档给出了「3 步本地跑通」的 Quick Start 指引。仓库的 docker 目录 提供了可直接运行的完整演示环境,包含三节点 Quorum Queue 集群、Prometheus、Grafana 与压测工具,步骤如下:
第 1 步:启动三节点 RabbitMQ 集群与压测负载
docker-compose-qq.yml 定义了rmq0-qq、rmq1-qq、rmq2-qq三个节点(镜像pivotalrabbitmq/rabbitmq:master-otp-max),端口映射如下:
| 节点 | 管理端口 | 指标端口 |
|---|---|---|
| rmq0-qq | 15679 → 15672 | 15699 → 15692 |
| rmq1-qq | 15680 → 15672 | 15700 → 15692 |
| rmq2-qq | 15681 → 15672 | 15701 → 15692 |
每个节点通过只读挂载注入三份配置:rabbitmq-qq.conf(主配置)、rabbitmq-qq-env.conf(环境变量)、rabbitmq-qq-definitions.json(队列定义)。qq-moderate-load服务使用pivotalrabbitmq/perf-test产生中等负载:创建qq1–qq10共 10 个x-queue-type=quorum、x-max-length=1000的队列,10 个生产者 + 10 个消费者,持久化消息、每队列限速 50 msg/s 并开启 publisher confirms。
关键配置说明(rabbitmq-qq.conf):
loopback_users.guest = false:允许 guest 远程登录(演示环境用);vm_memory_high_watermark.absolute = 1536MB:Raft WAL 默认上限 512MB,注释明确要求节点可用内存达到其约 3 倍;cluster_name = rabbitmq-qq:与仪表盘的RabbitMQ Cluster过滤器对应;cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config+nodes.1/2/3:静态组建三节点集群;collect_statistics_interval = 10000:把统计刷新间隔从默认 5s 提到 10s——注释解释了原因:要低于 Prometheus 的抓取间隔(15s),又能在抓取前完成刷新,同时这个值决定了rate()查询使用的区间;prometheus.return_per_object_metrics = true:按需开启 per-object(未注释默认关闭),开启后才会输出按队列拆分的指标。
rabbitmq-qq-env.conf 则通过-ra wal_max_size_bytes 536870912将 Ra WAL 上限显式设为 512MB。
第 2 步:启动 Prometheus 抓取指标
prometheus.yml 中scrape_interval: 15s,rabbitmq-server抓取任务覆盖所有:15692指标端点(包括rmq0-qq–rmq2-qq);另有一个rabbitmq-server-detailed任务抓取/metrics/detailed端点并按family: ["queue_coarse_metrics"]过滤。抓取间隔与 rabbitmq-qq.conf 中collect_statistics_interval = 10000的配合关系是理解rate()曲线平滑度的关键。
第 3 步:导入 Grafana 仪表盘
仪表盘 JSON 位于 RabbitMQ-Quorum-Queues-Raft.json,uid 为f1Mee9nZz,需要 Prometheus 数据源(DS_PROMETHEUS)。仓库还提供了 Grafana provisioning 配置 dashboards.yml,通过 file 类型 provider 指向/dashboards目录,把 JSON 放入该目录即可实现自动加载;Grafana 首次导入时会要求绑定 Prometheus 数据源,随后即可选择RabbitMQ Cluster(对应cluster_name = rabbitmq-qq)查看五大面板。
六、生产环境诊断实践与注意事项
结合原文档、面板描述与源码,给出几条可直接落地的运维建议:
- 先看 Uncommitted log entries,再看 >5k entries。面板描述给出的组合判读是:日志大量积压但能够持续提交,说明是正常的大积压(吞吐瓶颈);积压与未提交同时走高,则指向多数派成员不可用的真实可用性问题,应优先检查集群节点连通性与磁盘状态。
- Leader elections 允许非零,警惕持续高值。term 增长速率持续超过每秒数次并伴随提交吞吐下滑,优先排查网络分区、节点重启与频繁的队列声明(queue churn)。
- fsync 决定了延迟下限。Quorum Queue 提交前强制落盘,因此 commit latency 天然高于普通内存队列;若该值异常升高,结合 WAL 指标(
rabbitmq_raft_wal_files、rabbitmq_raft_bytes_written,见 prometheus_rabbitmq_raft_metrics_collector.erl)判断磁盘性能是否为瓶颈。 - 正确设置统计刷新间隔与抓取间隔。参考 rabbitmq-qq.conf 的做法:
collect_statistics_interval(10s)应低于 Prometheusscrape_interval(15s),保证每次抓取拿到的是最新刷新后的指标,rate()结果才平滑可信。 - 按需开启 per-object 指标。默认聚合模式不带 queue 标签,指标基数小、适合长期运行;需要按队列定位(如「>5k entries」面板按 queue 分组)时,再设置
prometheus.return_per_object_metrics = true,并注意随之增长的指标基数与存储开销。
七、相关资源索引
- 仪表盘发布文档:rabbitmq-quorum-queues-raft-11340.md
- 仪表盘定义(PromQL 与面板配置):RabbitMQ-Quorum-Queues-Raft.json
- Raft 指标采集器源码:prometheus_rabbitmq_raft_metrics_collector.erl
- 插件说明:rabbitmq_prometheus/README.md
- 演示环境编排:docker-compose-qq.yml、rabbitmq-qq.conf、prometheus.yml、dashboards.yml
- 同目录其他仪表盘文档:rabbitmq-overview-10991.md、rabbitmq-stream-14798.md
这张仪表盘把 Raft 共识层「黑盒」透明化:提交速率反映吞吐、提交延迟反映开销、未提交条目与日志积压反映健康度、选举速率反映稳定性。将它与 RabbitMQ-Overview 等仪表盘配合使用,即可对 Quorum Queue 集群形成从队列层到共识层的完整可观测闭环。
- 后端
- 消息队列
- 消息路由
【免费下载链接】rabbitmq-server
Open source RabbitMQ: core server and tier 1 (built-in) plugins
相关推荐
Satellizer监控告警:Prometheus指标与Grafana仪表盘
Satellizer监控告警:Prometheus指标与Grafana仪表盘 Satellizer作为Token based AngularJS Authent
前端应用安全Apache Pulsar 监控指南:Grafana 官方仪表盘与 Prometheus 指标解析
Apache Pulsar 监控指南:Grafana 官方仪表盘与 Prometheus 指标解析 导读 本指南基于 Apache Pulsar 仓库中 gra
消息队列后端Astral网络加速:5分钟打造稳定P2P连接的终极指南
Astral网络加速:5分钟打造稳定P2P连接的终极指南 你是否经常遇到远程办公时视频会议卡顿、游戏延迟过高、或文件传输缓慢的问题?Astral是一款基于Eas
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考