MinIO 监控实战:Healthcheck 探针与 Prometheus 指标端点完全解析
MinIO 通过一组无鉴权的健康检查端点和一组受鉴权保护的 Prometheus 指标端点,向外暴露完整的可观测性数据。本文基于官方监控指南 docs/metrics/README.md 展开,覆盖 liveness/cluster 探针的工作原理与 Kubernetes 接入方式,以及 cluster、bucket、node、resource 四类 Prometheus 指标端点的鉴权机制、采集配置与典型指标含义,并深入源码印证各端点的实现细节,帮助你为 MinIO 单节点或分布式部署搭建一套可直接运行的 Prometheus 监控方案。
监控体系总览
MinIO 的监控数据分为两大类,均通过 HTTP 端点暴露给外部工具采集:
- 健康检查探针(Healthcheck Probe):无需认证,供 Kubernetes 等平台做存活/就绪/集群可维护性判断;
- Prometheus 探针(Prometheus Probe):默认需要认证,供 Prometheus 按 pull 模型拉取时序指标。
端点一览(均以 /minio 为保留前缀):
| 端点 | 用途 | 鉴权 |
|---|---|---|
/minio/health/live |
存活探针 | 无 |
/minio/health/ready |
就绪探针 | 无 |
/minio/health/cluster |
集群写仲裁探针 | 无 |
/minio/health/cluster/read |
集群读仲裁探针 | 无 |
/minio/v2/metrics/cluster |
集群级指标(可从任一节点采集全集群数据) | 默认 JWT |
/minio/v2/metrics/bucket |
桶级指标 | 默认 JWT |
/minio/v2/metrics/node |
单节点指标(含 Go 运行时与进程指标) | 默认 JWT |
/minio/v2/metrics/resource |
资源级指标(CPU/内存/磁盘/网络等) | 默认 JWT |
/minio/prometheus/metrics |
已废弃的旧版指标端点 | 默认 JWT |
这些路径在路由注册代码中统一定义于 metrics 路由:prometheusMetricsPathLegacy = "/prometheus/metrics" 与四个 v2 路径并存,这也印证了文档中「旧端点已废弃」的说明——代码仍保留兼容处理,但新接入应一律使用 /minio/v2/metrics/*。
Healthcheck 探针详解
端点注册与整体结构
四个健康检查路由统一在 healthcheck 路由 中注册,全部同时支持 GET 与 HEAD 方法:
healthCheckPath = "/health"
healthCheckLivenessPath = "/live"
healthCheckReadinessPath = "/ready"
healthCheckClusterPath = "/cluster"
healthCheckClusterReadPath = "/cluster/read"
healthCheckPathPrefix = minioReservedBucketPath + healthCheckPath
因此完整对外路径为 /minio/health/...。
Liveness 探针:/minio/health/live
官方文档说明该探针几乎总是返回 200 OK,仅在配置了 etcd 且 etcd 不可达时失败;失败时 Kubernetes 类平台会重启容器。结合 LivenessCheckHandler 源码 可以看到其设计意图:
- 若对象存储层尚未初始化,会写入
X-Minio-Server-Status: offline响应头; - 内部节点间互查请求(携带
X-Minio-Peer-Call头)直接短路返回 200,避免级联误判; - 若排队请求数超过
requestsPoolCapacity上限,返回ErrBusy(即过载保护); - 源码注释明确指出:liveness 检查「不联系外部系统」,以防止外部依赖抖动引发 Pod 被误重启。
典型的 Kubernetes 配置(来自 healthcheck 文档):
livenessProbe:
httpGet:
path: /minio/health/live
port: 9000
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 30
timeoutSeconds: 10
successThreshold: 1
failureThreshold: 3
Readiness 探针:/minio/health/ready
就绪探针比 liveness 多做两件事(见 ReadinessCheckHandler):
- KMS 可达性:若配置了 KMS,会用 1 分钟超时执行一次
GenerateKey调用验证密钥服务可用; - etcd 可达性:若配置了 etcd,执行一次带超时的
Get("health")探测。
任一检查失败则返回错误,Kubernetes 会停止向该容器路由流量。参考配置:
readinessProbe:
httpGet:
path: /minio/health/ready
port: 9000
scheme: HTTP
initialDelaySeconds: 120
periodSeconds: 15
timeoutSeconds: 10
successThreshold: 1
failureThreshold: 3
Cluster 探针:/minio/health/cluster 与 /minio/health/cluster/read
写仲裁探针由 ClusterCheckHandler 实现:
- 先经过
checkHealth前置检查(对象层未就绪、bucket 元数据系统未初始化、IAM 系统未初始化时直接返回 503); - 再调用
objLayer.Health(ctx, opts)跨节点汇聚集群状态,在globalAPIConfig.getClusterDeadline()超时窗口内完成; - 集群具备写仲裁时返回
200 OK,否则返回503 Service Unavailable。
响应头中携带了诊断信息,文档给出的真实响应示例:
curl http://minio1:9001/minio/health/cluster
HTTP/1.1 503 Service Unavailable
Accept-Ranges: bytes
Content-Length: 0
Server: MinIO
Vary: Origin
X-Amz-Bucket-Region: us-east-1
X-Minio-Write-Quorum: 3
X-Amz-Request-Id: 16239D6AB80EBECF
X-Xss-Protection: 1; mode=block
Date: Tue, 21 Jul 2020 00:36:14 GMT
从源码看,该端点还会附带:
X-Minio-Write-Quorum:当前写仲裁数;X-Minio-Storage-Defaults:是否正在使用默认存储类;X-Minio-Healing-Drives:正在被修复的磁盘数(仅在大于 0 时输出)。
读仲裁探针 /minio/health/cluster/read(ClusterReadCheckHandler)逻辑相同,只是以 HealthyRead 判断并返回 X-Minio-Read-Quorum。
维护模式:判断节点能否安全下线
通过查询参数 maintenance=true,可以让探针回答「这台节点现在是否可以摘除做维护」。文档给出的语义在源码中一一对应(healthcheck-handler.go):
- 集群不健康 +
maintenance=true→412 Precondition Failed,表示摘除该节点会丢失 HA 能力,不要下线; - 集群不健康 + 非维护模式 →
503 Service Unavailable; - 健康 →
200 OK,可以安全下线。
curl http://minio1:9001/minio/health/cluster?maintenance=true
HTTP/1.1 412 Precondition Failed
...
X-Minio-Write-Quorum: 3
这一端点特别适合在编排平台(Kubernetes、Ansible 等)滚动升级前做前置检查。此外源码还支持 deployment-type 查询参数,用于按部署形态调整健康判定,可结合 healthcheck 文档 使用。
Prometheus 指标端点与鉴权
鉴权模式:MINIO_PROMETHEUS_AUTH_TYPE
MinIO 的 Prometheus 端点支持两种鉴权模式,由环境变量 MINIO_PROMETHEUS_AUTH_TYPE 控制,默认是 jwt(需要认证)。这一逻辑在 metrics 路由 中非常直观:
authType := prometheusAuthType(strings.ToLower(env.Get(EnvPrometheusAuthType, string(prometheusJWT))))
auth := AuthMiddleware
if authType == prometheusPublic {
auth = NoAuthMiddleware
}
metricsRouter.Handle(prometheusMetricsV2ClusterPath, auth(metricsServerHandler()))
metricsRouter.Handle(prometheusMetricsV2BucketPath, auth(metricsBucketHandler()))
metricsRouter.Handle(prometheusMetricsV2NodePath, auth(metricsNodeHandler()))
metricsRouter.Handle(prometheusMetricsV2ResourcePath, auth(metricsResourceHandler()))
- 保持默认
jwt模式时,Prometheus 通过 bearer token 认证,token 需由mc生成; - 设置
MINIO_PROMETHEUS_AUTH_TYPE="public"后,四个 v2 端点均可匿名抓取,适合内网可信环境:
export MINIO_PROMETHEUS_AUTH_TYPE="public"
minio server ~/test
在 jwt 模式下,AuthMiddleware 做了两层校验:
- 校验 bearer token 是合法 JWT,且 issuer 必须为
prometheus(即由mc admin prometheus generate签发的专用 token); - 通过 IAM 策略检查
PrometheusAdminAction,允许把抓取权限授予专门的监控账号而非主账号。
四类 v2 端点的差异
理解四个端点的关键在于它们各自聚合的数据范围(结合 metrics-v2.go 与 metrics-resource.go 的处理器实现):
/minio/v2/metrics/cluster:由clusterCollector提供,可从集群任一单节点读取整个集群的指标。对负载均衡后面的多节点部署,只需抓取 LB 地址即可拿到全集群视图,无需知道每个节点地址——这正是监控指南强调的核心能力;/minio/v2/metrics/bucket:由bucketCollector提供,以桶为中心的指标(桶容量、对象数、按桶的 TTFB 等);/minio/v2/metrics/node:由nodeCollector加上prometheus.NewGoCollector()和NewProcessCollector()注册组成,即文档所说「包含额外的 go metrics 或 process metrics」。由于这些指标是本机视角,需要在每个节点上分别抓取,targets里列出所有服务器;/minio/v2/metrics/resource:由resourceCollector提供资源子系统的指标(处理器、内存、磁盘、网络等),同样建议按节点抓取。
典型指标速览
完整的指标定义清单见 metrics 列表文档,这里摘录几个最有代表性的集群级指标:
| 指标名 | 含义 |
|---|---|
minio_cluster_capacity_raw_total_bytes |
集群在线原始总容量 |
minio_cluster_capacity_raw_free_bytes |
集群在线原始剩余容量 |
minio_cluster_capacity_usable_total_bytes |
集群可用总容量(扣除纠删码开销等) |
minio_cluster_usage_total_bytes |
集群总使用量 |
minio_cluster_drive_online_total / minio_cluster_drive_offline_total |
集群在线/离线磁盘数 |
minio_cluster_ilm_transitioned_bytes |
已过渡到存储层的字节数 |
s3_ttfb_seconds |
请求服务耗时直方图,bucket 为 .05, .1, .25, .5, 1, 2.5, 5, 10 秒 |
其中 s3_ttfb_seconds 在 metrics.go 中定义为 HistogramVec,按 api 标签(桶级版本还带 bucket 标签)分桶,可直接用于 P99 延迟告警。版本信息则通过 minio_version_info{version, commit} gauge 暴露,方便在告警与面板中标注部署版本。
Prometheus 接入实战
以下步骤完整继承自 Prometheus 监控指南,可直接照做。
1. 下载并解压 Prometheus
tar xvfz prometheus-*.tar.gz
cd prometheus-*
./prometheus --help
Prometheus 是单一二进制,支持 --help 查看全部选项。
2. 生成认证模式下的 scrape_configs
如果 MinIO 保持默认 jwt 模式,使用 mc 生成带 bearer token 的抓取配置(token 有时效性,定期重新生成即可):
mc admin prometheus generate <alias> [METRIC-TYPE]
METRIC-TYPE 可选 cluster、node、bucket、resource,缺省为 cluster。生成结果形如:
# Cluster
scrape_configs:
- job_name: minio-job
bearer_token: <secret>
metrics_path: /minio/v2/metrics/cluster
scheme: http
static_configs:
- targets: ['localhost:9000']
# Bucket centric
- job_name: minio-job-bucket
bearer_token: <secret>
metrics_path: /minio/v2/metrics/bucket
scheme: http
static_configs:
- targets: ['localhost:9000']
# Node centric(可选,需按节点抓取)
- job_name: minio-job-node
bearer_token: <secret>
metrics_path: /minio/v2/metrics/node
scheme: http
static_configs:
- targets: ['localhost:9000']
# Resource centric(可选)
- job_name: minio-job-resource
bearer_token: <secret>
metrics_path: /minio/v2/metrics/resource
scheme: http
static_configs:
- targets: ['localhost:9000']
3. public 模式下的简化配置
若设置了 MINIO_PROMETHEUS_AUTH_TYPE="public",无需 bearer token,一次抓取即可收集集群指标:
scrape_configs:
- job_name: minio-job
metrics_path: /minio/v2/metrics/cluster
scheme: http
static_configs:
- targets: ['localhost:9000']
桶级指标同理指向 /minio/v2/metrics/bucket。节点级指标必须在每个服务器实例上分别抓取,targets 需要列出全部节点,这样 Grafana 才能对每个节点分别画图:
scrape_configs:
- job_name: minio-job
metrics_path: /minio/v2/metrics/node
scheme: http
static_configs:
- targets: ['server1:9000','server2:9000','server3:9000','server4:9000']
4. 启动 Prometheus 并验证
把生成的 scrape_configs 段落粘贴进 prometheus.yml,然后启动:
./prometheus --config.file=prometheus.yml
默认 Prometheus Web UI 位于 http://localhost:9090,可以在此确认 MinIO 指标已成功入站。
负载均衡场景注意事项:Prometheus 会对 MinIO 指标端点发出 Host: domain:port 头。若 MinIO 部署在 HAProxy、nginx、pfSense、OPNsense 等负载均衡/反向代理之后,需要确保网络设备能把这些请求正确路由到 MinIO 部署,否则抓取会失败。
可视化与告警
指标入站后,Grafana 是标准的可视化载体:仓库内提供了开箱即用的 Dashboard JSON,包括总览面板 minio-dashboard.json、桶级 minio-bucket.json、节点级 minio-node.json 以及复制相关面板,导入说明见 Grafana 配置文档。
告警方面,Prometheus AlertManager 与 MinIO 相关的告警规则(如纠删码容错阈值)配置在 alerts 文档,可配合 AlertManager 接入通知渠道。
关于已废弃端点
旧版 /minio/prometheus/metrics 端点已废弃:源码中它仍映射到 metricsHandler()(metrics-router.go),但仅注册了基础 collector,指标覆盖面远小于 v2 端点。新环境不应再配置该路径;已有抓取配置应迁移到 /minio/v2/metrics/cluster 等 v2 端点。
小结
- 健康检查走
/minio/health/{live,ready,cluster,cluster/read},无认证,支持maintenance=true判断节点可否安全下线,412 表示摘除会损失 HA; - 指标采集走
/minio/v2/metrics/{cluster,bucket,node,resource},默认 JWT 鉴权,可用mc admin prometheus generate生成带 token 的scrape_configs;内网可信环境可设MINIO_PROMETHEUS_AUTH_TYPE="public"简化配置; cluster端点一次抓取即可覆盖全集群,是负载均衡部署下的首选;node/resource端点需按节点逐一抓取以获得 Go 运行时、进程与硬件资源细节;- 抓取配置落地后,配合仓库提供的 Grafana 面板与告警规则文档,即可形成完整的 MinIO 监控闭环。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0622
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00