Ceph 生产环境搭建 | 第 15 天:Ceph 集群监控:Prometheus + Grafana + 内置仪表盘

第 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,则实现了更强大的长期存储、聚合查询和自定义可视化能力。

K8s Logo

二、部署实战:从 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 趋势的专业监控大屏。

K8s Logo

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 和延迟表现。

八、系列目录

微信公众号二维码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像 - 恒星
欢迎您留下宝贵的见解!
提交
头像 - 恒星

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容