第 15/20 天
在 Ceph 生产环境中,”部署完成”绝不意味着”工作完成”。一个没有监控的存储集群就像一辆没有仪表盘的汽车——你不知道油量、不知道车速、不知道引擎温度,直到某天突然抛锚。前 14 天我们完成了从系统准备到认证安全的全部搭建,集群已经可以稳定对外提供块存储、对象存储和文件系统服务。然而,生产环境的核心诉求是”可观测性”:你要能在故障发生前看到征兆,在性能退化时定位瓶颈,在容量耗尽前完成扩容。今天我们就来搭建一套完整的 Ceph 监控体系——基于 Ceph 内置的 Prometheus exporter、Manager Dashboard,以及外部的 Grafana 可视化平台,构建从指标采集到告警触发的全链路监控能力。
一、架构与原理:Ceph 监控体系全景解析
1.1 监控目标与分层设计
生产级 Ceph 监控需要覆盖四个维度:
| 监控维度 | 关注指标 | 典型问题 |
|---|---|---|
| 集群健康 | HEALTH_OK/WARN/ERR、PG 状态、MON 仲裁 | PG 降级、MON 脑裂 |
| 容量容量 | 每个 pool 的已用/可用空间、增长趋势 | 容量耗尽导致写入失败 |
| 性能指标 | IOPS、吞吐量、延迟(apply/recommit) | 延迟飙升影响业务 |
| 组件状态 | OSD up/in、MGR active、RGW 请求量 | OSD 掉线、MGR 切换 |
1.2 监控数据流向
Ceph 的监控数据流遵循一条清晰的采集链路:
Ceph Cluster (MON/MGR/OSD/RGW)
│
▼
MGR prometheus module (:9283/metrics)
│ (Prometheus pull 模式定时抓取)
▼
Prometheus Server
│
├──→ Grafana (可视化仪表盘)
│
└──→ Alertmanager (告警路由分发)
│
▼
邮件 / Slack / 企业微信 / 钉钉
核心设计理念是 Pull 模式:Prometheus 主动去 Ceph MGR 的 /metrics 端点拉取指标,而不是 Ceph 主动推送。这种方式的好处是:采集端无状态,重启不影响被监控服务;Prometheus 自带服务发现,可以动态发现新增的 MGR 节点。
1.3 Ceph 内置监控能力
Ceph Squid(v19)的 Manager 模块自带三个监控相关模块:
- prometheus 模块:将集群内部指标转换为 Prometheus 格式,暴露在
http://<mgr-ip>:9283/metrics,包含 200+ 个指标 - dashboard 模块:内置 Web UI,端口
8443,提供集群概览、OSD 列表、Pool 详情、RGW 用户等管理视图 - alerting 模块:集成了 Prometheus Alertmanager 的告警规则管理,可以直接在 Ceph 内定义告警
这三个模块协同工作,构成了 Ceph “自带监控” 的基座。在此基础上接入外部 Prometheus + Grafana,则实现了更强大的长期存储、聚合查询和自定义可视化能力。

二、部署实战:从 Ceph 内置模块到 Grafana 大屏
2.1 环境准备:启用 MGR 监控模块
首先确认 MGR 服务正常运行,然后依次启用三个监控模块:
# 检查 MGR 服务状态
ceph -s | grep mgr
# 期望输出: mgr: ceph-mgr-01(active, since 2d), standbys: ceph-mgr-02
# 启用 prometheus 模块(指标采集核心)
ceph mgr module enable prometheus
# 启用 dashboard 模块(内置 Web UI)
ceph mgr module enable dashboard
# 启用 alerting 模块(告警规则管理)
ceph mgr module enable alerting
# 验证模块已加载
ceph mgr module ls | grep -E 'prometheus|dashboard|alerting'
启用 prometheus 模块后,MGR 会立即在 9283 端口开始提供指标服务。验证指标是否正常暴露:
# 在 MGR 节点上本地测试
curl -s http://localhost:9283/metrics | head -20
# 期望输出形如:
# # HELP ceph_health_status Cluster health status
# # TYPE ceph_health_status gauge
# ceph_health_status 0
# # HELP ceph_osd_up Total number of up OSDs
# # TYPE ceph_osd_up gauge
# ceph_osd_up 6
# # HELP ceph_osd_in Total number of in OSDs
# ceph_osd_in 6
ceph_health_status 为 0 表示 HEALTH_OK,1 表示 WARN,2 表示 ERR。这是监控体系中最基础也最重要的指标。
2.2 配置 Dashboard 内置仪表盘
Ceph Dashboard 自带 SSL 加密,需要先配置证书,然后设置登录凭据:
# 生成自签名证书(生产环境建议替换为正式 CA 签发的证书)
ceph dashboard create-self-signed-cert
# 创建管理员账户
ceph dashboard ac-user-create admin -i /tmp/admin_password.txt administrator
# 其中 /tmp/admin_password.txt 内容为你的密码
# 查看 dashboard 服务地址和端口
ceph config get mgr mgr/dashboard/server_addr
ceph config get mgr mgr/dashboard/server_port
# 默认端口 8443,绑定 0.0.0.0
# 如果需要修改端口
ceph config set mgr mgr/dashboard/server_port 8443
ceph config set mgr mgr/dashboard/ssl_verify true
# 获取 dashboard 登录 URL
ceph mgr services | python3 -c "import sys,json; print(json.load(sys.stdin).get('dashboard',''))"
# 期望输出: https://ceph-mgr-01:8443/
Dashboard 还可以开启 RGW 管理界面,直接在 Web UI 中管理对象存储用户和 bucket:
# 开启 RGW 管理功能(需要先创建 RGW 凭据)
ceph dashboard set-rgw-api-host ceph-rgw-01
ceph dashboard set-rgw-api-port 8080
ceph dashboard set-rgw-api-scheme http
ceph dashboard set-rgw-api-admin-resource admin
ceph dashboard set-rgw-api-user-id admin
# 验证 dashboard 功能模块
ceph dashboard feature status
2.3 部署 Prometheus Server
在独立的监控节点上安装 Prometheus(推荐使用 Docker 方式快速部署):
# 创建 Prometheus 配置文件
cat > /etc/prometheus/prometheus.yml << 'EOF'
global:
scrape_interval: 15s # 每 15 秒抓取一次指标
evaluation_interval: 15s # 每 15 秒评估一次告警规则
external_labels:
cluster: 'ceph-prod-cluster'
# 告警规则文件
rule_files:
– /etc/prometheus/rules/ceph_alerts.yml
# Alertmanager 配置
alerting:
alertmanagers:
– static_configs:
– targets: ['localhost:9093']
# 抓取目标配置
scrape_configs:
– job_name: 'ceph'
metrics_path: /metrics
static_configs:
– targets:
– 'ceph-mgr-01:9283' # active MGR
– 'ceph-mgr-02:9283' # standby MGR(failover 时自动接管)
labels:
cluster: 'ceph-prod'
EOF
# 启动 Prometheus 容器
docker run -d
–name prometheus
–restart always
-p 9090:9090
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
-v /etc/prometheus/rules:/etc/prometheus/rules
-v /var/lib/prometheus:/prometheus
prom/prometheus:v2.51.0
–config.file=/etc/prometheus/prometheus.yml
–storage.tsdb.retention.time=90d
–web.enable-lifecycle
# 验证 Prometheus 正常运行
curl -s http://localhost:9090/api/v1/targets | python3 -c "
import sys, json
data = json.load(sys.stdin)
for t in data['data']['activeTargets']:
print(f"{t['labels'].get('job','?')} -> {t['health']} ({t['scrapeUrl']})")
"
# 期望输出: ceph -> up (http://ceph-mgr-01:9283/metrics)
2.4 配置告警规则
Ceph 的 Prometheus 指标配合自定义告警规则,可以实现精准的故障预警:
# /etc/prometheus/rules/ceph_alerts.yml
groups:
– name: ceph-alerts
rules:
# 集群健康状态告警
– alert: CephHealthWarning
expr: ceph_health_status == 1
for: 5m
labels:
severity: warning
annotations:
summary: "Ceph 集群健康状态为 WARN"
description: "集群存在告警级别的问题,请检查 ceph -s 输出"
– alert: CephHealthError
expr: ceph_health_status == 2
for: 1m
labels:
severity: critical
annotations:
summary: "Ceph 集群健康状态为 ERR"
description: "集群存在严重问题,立即介入排查"
# OSD 掉线告警
– alert: CephOSDDown
expr: ceph_osd_down > 0
for: 2m
labels:
severity: warning
annotations:
summary: "{{ $value }} 个 OSD 处于 down 状态"
# 存储池容量告警(超过 85%)
– alert: CephPoolNearFull
expr: >
(ceph_pool_bytes_used / ceph_pool_max_avail) > 0.85
for: 10m
labels:
severity: warning
annotations:
summary: "存储池容量使用超过 85%"
description: "Pool {{ $labels.pool_id }} 即将满,请规划扩容"
# PG 降级告警
– alert: CephPGDegraded
expr: ceph_pg_degraded > 0
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $value }} 个 PG 处于降级状态"
description: "部分 PG 副本数不足,可能有 OSD 故障"
# MGR 无活跃实例
– alert: CephMGRInactive
expr: ceph_mgr_status < 1
for: 1m
labels:
severity: critical
annotations:
summary: "没有活跃的 MGR 实例"
description: "所有 MGR 都不可用,Dashboard 和部分管理功能中断"
2.5 部署 Grafana 可视化平台
Grafana 是业界最流行的监控可视化平台,支持 Prometheus 数据源,拥有完善的 Ceph 社区仪表盘模板:
# 部署 Grafana 容器
docker run -d
–name grafana
–restart always
-p 3000:3000
-v /var/lib/grafana:/var/lib/grafana
-v /etc/grafana/provisioning:/etc/grafana/provisioning
-e GF_SECURITY_ADMIN_PASSWORD='Gr@fana#2026!'
-e GF_USERS_ALLOW_SIGN_UP=false
grafana/grafana:10.4.0
# 配置 Prometheus 数据源(自动 provisioning 方式)
cat > /etc/grafana/provisioning/datasources/prometheus.yml << 'EOF'
apiVersion: 1
datasources:
– name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
editable: true
jsonData:
timeInterval: "15s"
EOF
# 配置 Dashboard 自动加载
cat > /etc/grafana/provisioning/dashboards/ceph.yml << 'EOF'
apiVersion: 1
providers:
– name: 'Ceph Dashboards'
orgId: 1
folder: 'Ceph'
type: file
disableDeletion: false
updateIntervalSeconds: 30
options:
path: /var/lib/grafana/dashboards/ceph
EOF
# 下载官方 Ceph Grafana Dashboard 模板
mkdir -p /var/lib/grafana/dashboards/ceph
# Ceph 官方提供两个推荐模板:
# – Dashboard ID 2842: Ceph 集群整体概览
# – Dashboard ID 7056: Ceph 单 Pool 详细监控
# 可在 Grafana UI 中 Import,或通过 API 自动导入
Grafana 启动后,在 Web UI 中通过 Import Dashboard 功能导入模板 ID 2842(Ceph Cluster Overview),即可获得包含集群健康、OSD 状态、PG 分布、Pool 容量、IOPS 趋势的专业监控大屏。

2.6 验证监控全链路
部署完成后,验证从 Ceph 到 Grafana 的完整数据链路是否畅通:
# 1. 验证 MGR prometheus 端点
curl -s http://ceph-mgr-01:9283/metrics | grep ceph_health_status
# ceph_health_status 0
# 2. 验证 Prometheus 抓取状态
curl -s 'http://localhost:9090/api/v1/query?query=ceph_health_status' | python3 -c "
import sys, json
data = json.load(sys.stdin)
for r in data['data']['result']:
print(f"metric: {r['metric']} value: {r['value'][1]}")
"
# 3. 验证告警规则已加载
curl -s 'http://localhost:9090/api/v1/rules' | python3 -c "
import sys, json
data = json.load(sys.stdin)
for g in data['data']['groups']:
for r in g['rules']:
print(f"alert: {r['name']} state: {r['state']}")
"
# 4. 在 Ceph 端查看被 Prometheus 抓取的频率
ceph tell mgr prometheus scrape_status
三、关键监控指标详解
| 指标名称 | 含义 | 正常范围 | 告警阈值 |
|---|---|---|---|
ceph_health_status |
集群整体健康 | 0 (OK) | >0 持续 5min |
ceph_osd_up |
在线 OSD 数 | 等于 OSD 总数 | <总数持续 2min |
ceph_osd_in |
加入集群的 OSD 数 | 等于 OSD 总数 | <总数需人工确认 |
ceph_pg_active |
活跃 PG 数 | 等于 PG 总数 | <总数持续 5min |
ceph_pg_degraded |
降级 PG 数 | 0 | >0 持续 5min |
ceph_pool_bytes_used |
Pool 已用字节 | 持续监控 | >85% 可用容量 |
ceph_pool_max_avail |
Pool 最大可用字节 | 持续监控 | <总量 15% 告警 |
ceph_osd_numpg |
单 OSD 承载 PG 数 | <250 | >500 需调优 |
ceph_mgr_status |
MGR 活跃状态 | 1 | 0 持续 1min |
ceph_rgw_req |
RGW 请求速率 | 业务相关 | 突降 50% 告警 |
关键解读:ceph_pg_degraded 和 ceph_pg_recovering 是最需要关注的预警指标。前者表示有 PG 的副本数未达到期望值(通常因 OSD down 触发),后者表示集群正在自动修复。如果 degraded 长期不为 0 且 recovering 也为 0,说明恢复卡住了,需要人工介入。
四、生产环境注意事项与踩坑提示
4.1 Prometheus 抓取间隔不要设太短
初学者常把 scrape_interval 设为 5 秒甚至更短,以为越快越好。实际上 Ceph 的很多指标(如 PG 状态、容量统计)更新频率本就在 15-30 秒,过快的抓取只会增加 MGR 负载。生产环境推荐 15 秒抓取间隔,配合 15 秒评估间隔。如果确实需要更细粒度的延迟监控,建议在客户端侧单独部署 ceph exporter 做秒级采集。
4.2 MGR failover 时监控指标会中断
Ceph 的 standby MGR 虽然也开启了 prometheus 模块,但 只有 active MGR 才会暴露完整指标。当 MGR 发生 failover(主节点宕机、手动切换)时,指标会有 10-30 秒的空窗期。在 Prometheus 配置中同时配置所有 MGR 节点的地址可以缩短空窗,但不能完全消除。对于极度敏感的告警,建议配置 for: 2m 以上的持续时间,避免 failover 瞬间触发误报。
4.3 Dashboard SSL 证书不能用 IP 访问
自签名证书是按 hostname 签发的,通过 IP 直接访问 https://10.0.1.10:8443 会被浏览器拦截。生产环境有两种解法:一是在内部 DNS 中为 MGR 节点配置 hostname 解析;二是配置正式 CA 证书(如 Let’s Encrypt 或企业内部 CA):
# 导入正式证书替换自签名证书
ceph dashboard set-ssl-certificate -i /tmp/ceph-mgr.crt
ceph dashboard set-ssl-certificate-key -i /tmp/ceph-mgr.key
# 如果有多个 MGR,需要为每个节点单独设置
ceph dashboard set-ssl-certificate ceph-mgr-01 -i /tmp/ceph-mgr-01.crt
ceph dashboard set-ssl-certificate-key ceph-mgr-01 -i /tmp/ceph-mgr-01.key
4.4 Grafana Dashboard 模板版本兼容性
社区提供的 Ceph Grafana Dashboard 模板(如 ID 2842)是基于特定版本 Ceph 的指标名制作的。Ceph 从 Octopus 到 Squid,部分指标名称有变化。如果导入模板后大量面板显示 “No Data”,需要检查指标名是否匹配。可用以下命令导出当前集群所有可用指标:
# 导出所有 Ceph 指标名,用于比对 Dashboard 模板
curl -s http://ceph-mgr-01:9283/metrics | grep '^# HELP' | awk '{print $3}' | sort > /tmp/ceph_metrics_list.txt
wc -l /tmp/ceph_metrics_list.txt
# Squid 版本通常有 250+ 个指标
4.5 Prometheus 数据存储容量规划
Prometheus 默认保留 15 天数据,生产环境建议延长到 90 天用于趋势分析。以一个 6 OSD 的小集群为例,每 15 秒抓取约 250 个指标,90 天数据约占用 5-10 GB。大规模集群(100+ OSD)可能需要 50 GB 以上。务必为 Prometheus 的 --storage.tsdb.retention.time 参数设置合理值,并监控 Prometheus 自身的磁盘使用,避免”监控系统的磁盘满了导致监控系统挂掉”这种黑色幽默。
五、常见问题 FAQ
Q1:启用 dashboard 模块后报错 “module ‘dashboard’ is not available” 怎么办?
A:这通常是因为 MGR 节点缺少依赖包。Dashboard 模块依赖 python3-routes、python3-cherrypy 等包。在 cephadm 部署模式下,这些依赖应该被打包在 MGR 容器镜像中。如果是裸机部署,需要手动安装:apt install python3-routes python3-cherrypy3 python3-bcrypt python3-pyopenssl。安装后重启 MGR 服务再重试。
Q2:Prometheus 抓取 Ceph 指标报 “context deadline exceeded” 怎么办?
A:这是抓取超时,通常发生在集群规模较大(100+ OSD)时,MGR 在 15 秒内无法完成指标采集。解决方法有两个:一是增大 Prometheus 的 scrape_timeout(默认 10 秒,可调到 14 秒,但不要超过 scrape_interval);二是在 MGR 上限制采集范围,通过 ceph config set mgr mgr/prometheus/scrape_interval 30 降低 MGR 内部的指标刷新频率。如果仍超时,考虑拆分抓取目标——在不同 MGR 上分别抓取不同类型的指标。
Q3:Grafana 面板显示的 OSD 数量与 ceph -s 不一致?
A:这是因为 Prometheus 和 Ceph 的数据刷新周期不同步。ceph -s 是实时查询 MON,而 Prometheus 面板展示的是最近一次抓取(最多 15 秒前)的数据。如果 OSD 刚刚 down 又 up,面板上可能有短暂的不一致。这不是 bug,是 pull 模式的固有特性。在告警规则中设置 for: 2m 可以消除这种瞬时抖动导致的误报。
六、总结
今天我们完成了 Ceph 生产环境监控体系的全栈搭建。核心要点回顾:
- Ceph MGR 自带 prometheus、dashboard、alerting 三个监控模块,是监控体系的基座
- Prometheus 以 Pull 模式从 MGR 的 9283 端点采集 250+ 个集群指标
- Dashboard 内置 Web UI 提供 SSL 加密的管理界面,可集成 RGW 管理功能
- Grafana 通过 Prometheus 数据源实现长期趋势可视化和自定义大屏
- 告警规则覆盖集群健康、OSD 状态、容量预警、PG 降级、MGR 可用性五大场景
- 生产环境注意抓取间隔(15s)、MGR failover 空窗、SSL 证书和存储容量规划
监控不是部署完就结束的——它是一个需要持续调优的过程。建议在运行一周后回头审查告警规则,关闭高频误报项,增加遗漏的检测维度,让监控体系越用越精准。
七、下期预告
第 16 天:Ceph 性能调优:OSD 参数与缓存分层
明天我们将深入 Ceph 性能优化的内核层面,从 BlueStore 的 RocksDB 调优、OSD 线程数配置、读写缓存参数,到 PG 分裂策略与客户端队列优化,全方位提升集群的 IOPS 和延迟表现。
八、系列目录
- ✅ 第 1 天:架构概述与生产环境选型指南
- ✅ 第 2 天:Ubuntu 系统准备:内核调优与磁盘规划
- ✅ 第 3 天:Cephadm 部署工具详解与集群引导初始化
- ✅ 第 4 天:Monitor 节点部署与高可用配置
- ✅ 第 5 天:Manager 节点部署与模块启用
- ✅ 第 6 天:OSD 存储节点部署:BlueStore 配置与磁盘管理
- ✅ 第 7 天:CRUSH Map 架构解析与故障域规划
- ✅ 第 8 天:存储池(Pool)创建与 PG 数量规划
- ✅ 第 9 天:副本与纠删码存储池策略对比实战
- ✅ 第 10 天:Ceph 块存储 RBD 配置与生产实践
- ✅ 第 11 天:Ceph 对象存储 RGW 网关部署与 S3 兼容
- ✅ 第 12 天:CephFS 分布式文件系统部署与挂载
- ✅ 第 13 天:Ceph 网络架构:集群网络与公共网络分离
- ✅ 第 14 天:Ceph 认证体系 cephx 与用户权限管理
- 🔵 第 15 天:Ceph 集群监控:Prometheus + Grafana + 内置仪表盘(本文)
- 📅 第 16 天:Ceph 性能调优:OSD 参数与缓存分层(即将发布)
- 📅 第 17 天:Ceph 集群扩容实战:OSD 动态添加与 CRUSH 重平衡(即将发布)
- 📅 第 18 天:Ceph 高可用与容灾设计:多副本、跨机房与异地灾备(即将发布)
- 📅 第 19 天:Ceph 故障排查与数据恢复实战(即将发布)
- 📅 第 20 天:Ceph 生产环境升级维护与版本迭代策略(即将发布)

















暂无评论内容