强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Ceph 存储运维完全指南 / 16 - 运维最佳实践

16 - 运维最佳实践

16.1 硬件选型指南

存储节点

组件 推荐配置 说明
CPU 2× Intel Xeon Silver 4314 (16C) 或同级 每 OSD 至少 1 个核心
内存 128-256 GB ECC DDR4 每 OSD 4-8GB + 系统开销
OSD 盘 NVMe SSD / SATA SSD / SAS HDD 根据性能需求选择
WAL/DB 盘 NVMe SSD(如与 OSD 盘分离) 提升 BlueStore 写入性能
系统盘 2× SSD RAID1 操作系统 + Ceph 配置
网卡(公共) 2× 10GbE / 25GbE Bond 客户端访问网络
网卡(集群) 2× 25GbE / 100GbE Bond OSD 复制/恢复网络
电源 冗余电源 避免单电源故障

Monitor 节点

组件 推荐配置 说明
CPU 4-8 核 MON 负载较低
内存 16-64 GB 随集群规模增长
磁盘 2× NVMe SSD RAID1 MON 数据库需要高 IOPS
网络 1GbE 即可 管理网络
数量 3 或 5 奇数节点,5 节点适合 1000+ OSD

磁盘类型选择

场景 OSD 磁盘 WAL/DB 预期 IOPS
高性能数据库 NVMe SSD 同盘 50,000-200,000
通用虚拟化 SATA SSD 同盘或 NVMe 20,000-80,000
对象存储/备份 SAS HDD NVMe 分离 500-2,000
归档/冷存储 SATA HDD NVMe 分离 100-500
混合存储 HDD + NVMe 缓存 NVMe 按分层策略

容量计算

裸容量 = OSD 数量 × 单盘容量
可用容量 = 裸容量 × (1 / 副本数) × 利用率目标

示例:
  30 块 4TB HDD,3 副本,目标使用率 75%
  裸容量 = 30 × 4TB = 120TB
  可用容量 = 120TB / 3 × 0.75 = 30TB

EC 4+2 示例:
  30 块 4TB HDD,EC 4+2(存储效率 67%),目标 75%
  裸容量 = 120TB
  可用容量 = 120TB × 0.67 × 0.75 = 60TB

16.2 容量规划

容量规划公式

物理容量需求 = 逻辑容量需求 × 副本系数 × (1 + 膨胀系数) / 目标利用率

参数说明:
  副本系数: 3 副本 = 3, EC 4+2 = 1.5
  膨胀系数: 考虑元数据、日志等额外开销,一般 1.1-1.2
  目标利用率: 建议 60-75%,不超过 80%

容量规划表

逻辑容量 3 副本物理需求 EC 4+2 物理需求 目标利用率
10 TB 40 TB 20 TB 75%
50 TB 200 TB 100 TB 75%
100 TB 400 TB 200 TB 75%
500 TB 2,000 TB 1,000 TB 75%
1 PB 4 PB 2 PB 75%

PG 数量规划

# 启用 PG 自动伸缩(强烈推荐)
ceph mgr module enable pg_autoscaler

# 所有池启用自动伸缩
for pool in $(ceph osd pool ls); do
    ceph osd pool set $pool pg_autoscale_mode on
done

# 手动计算参考
# 总 PG 数 ≈ OSD 数 × 100 / 副本数
# 例: 30 OSD,3 副本 → 30 × 100 / 3 = 1000 → 取 1024

扩容触发条件

指标 黄色预警 红色预警 建议行动
容量使用率 > 65% > 80% 规划扩容
OSD 使用率标准差 > 15% > 25% 调整权重/PG
单 OSD IOPS > 70% > 90% 增加 OSD 或升级 SSD
网络带宽使用 > 60% > 80% 升级网络

16.3 运维规范

日常巡检

#!/bin/bash
# ceph_daily_check.sh - 每日巡检脚本

echo "=================== Ceph Daily Report $(date) ===================="

echo "--- Cluster Status ---"
ceph -s 2>&1

echo ""
echo "--- OSD Status ---"
ceph osd stat
ceph osd tree | grep -E "down|out"

echo ""
echo "--- Capacity ---"
ceph df

echo ""
echo "--- PG Status ---"
ceph pg stat
ceph pg dump_stuck unclean 2>/dev/null | wc -l
ceph pg dump_stuck inactive 2>/dev/null | wc -l
ceph pg dump_stuck stale 2>/dev/null | wc -l

echo ""
echo "--- Slow OSDs ---"
ceph osd perf | sort -k3 -rn | head -5

echo ""
echo "--- Crashes ---"
ceph crash ls-new 2>/dev/null | wc -l

echo ""
echo "--- MON Quorum ---"
ceph mon stat

echo ""
echo "--- MDS Status ---"
ceph mds stat 2>/dev/null

echo ""
echo "--- RGW Status ---"
ceph orch ps | grep rgw

echo ""
echo "=================== End of Report ===================="

配置管理规范

# 查看当前生效的配置
ceph config dump

# 查看特定组件的配置
ceph config show osd.0
ceph config show-with-defaults osd.0

# 查看配置差异
ceph config diff

# 配置修改记录
# 所有配置修改应记录在变更管理系统中
# 生产环境修改前先在测试环境验证

变更管理流程

变更申请
    ↓
影响评估(性能/可用性/数据安全)
    ↓
测试环境验证
    ↓
制定回滚方案
    ↓
维护窗口执行
    ↓
验证确认
    ↓
变更记录归档

16.4 备份策略

备份方案

备份对象 备份方式 频率 保留时间
CRUSH Map ceph osd getcrushmap 每次变更 长期
Monitor 数据 文件系统备份 每日 30 天
密钥/配置 ceph auth export 每次变更 长期
RBD 镜像 快照 + rbd export 按需 按策略
CephFS 快照 + rsync 每日 30 天
RGW 数据 跨站点复制 / S3 备份 持续 按策略

备份脚本

#!/bin/bash
# ceph_backup.sh - Ceph 配置和密钥备份

BACKUP_DIR="/backup/ceph/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 1. 备份 CRUSH Map
ceph osd getcrushmap -o $BACKUP_DIR/crushmap.bin
crushtool -d $BACKUP_DIR/crushmap.bin -o $BACKUP_DIR/crushmap.txt

# 2. 备份所有认证密钥
ceph auth export -o $BACKUP_DIR/ceph.client.admin.keyring
for user in $(ceph auth ls 2>/dev/null | grep -oP 'client\.\w+'); do
    ceph auth get $user -o $BACKUP_DIR/ceph.${user}.keyring
done

# 3. 备份配置文件
cp /etc/ceph/ceph.conf $BACKUP_DIR/ceph.conf

# 4. 备份 Monitor 数据(在其中一个 MON 上执行)
ceph mon getmap -o $BACKUP_DIR/monmap

# 5. 备份 OSD 标记信息
ceph osd dump -o $BACKUP_DIR/osd_dump.txt
ceph osd tree -o $BACKUP_DIR/osd_tree.txt

# 6. 压缩
tar czf /backup/ceph/ceph-backup-$(date +%Y%m%d).tar.gz -C /backup/ceph $(date +%Y%m%d)
rm -rf $BACKUP_DIR

echo "Backup completed: /backup/ceph/ceph-backup-$(date +%Y%m%d).tar.gz"

RBD 快照备份

#!/bin/bash
# rbd_snapshot_backup.sh

POOL="rbd"
IMAGE="myimage"
SNAP="backup-$(date +%Y%m%d)"
BACKUP_DIR="/backup/rbd"

# 创建快照
rbd snap create ${POOL}/${IMAGE}@${SNAP}

# 导出增量备份(基于上一次快照)
if [ -f ${BACKUP_DIR}/${IMAGE}.last_snap ]; then
    LAST_SNAP=$(cat ${BACKUP_DIR}/${IMAGE}.last_snap)
    rbd export-diff ${POOL}/${IMAGE}@${SNAP} \
        --from-snap ${LAST_SNAP} \
        ${BACKUP_DIR}/${IMAGE}-${SNAP}.diff
else
    # 首次全量备份
    rbd export ${POOL}/${IMAGE}@${SNAP} ${BACKUP_DIR}/${IMAGE}-${SNAP}.img
fi

# 记录当前快照
echo ${SNAP} > ${BACKUP_DIR}/${IMAGE}.last_snap

16.5 升级策略

升级前检查

# 1. 确认集群健康
ceph -s  # 必须是 HEALTH_OK

# 2. 确认所有 PG 都是 active+clean
ceph pg stat

# 3. 检查当前版本
ceph versions

# 4. 阅读发行说明
# https://docs.ceph.com/en/latest/releases/

# 5. 设置 noout(防止升级期间触发数据迁移)
ceph osd set noout

cephadm 升级流程

# 1. 更新 cephadm
sudo apt update && sudo apt install -y cephadm

# 2. 查看可用版本
ceph orch upgrade check quay.io/ceph/ceph:v18.2.4

# 3. 执行升级
ceph orch upgrade start --ceph-version 18.2.4

# 4. 监控升级进度
ceph orch upgrade status

# 5. 升级完成后验证
ceph -s
ceph versions

# 6. 取消 noout
ceph osd unset noout

升级顺序

1. Monitor → Manager(控制平面)
2. OSD(数据平面,逐节点升级)
3. MDS(CephFS 服务)
4. RGW(对象存储网关)
5. 客户端工具(ceph-common)

16.6 生产环境 Checklist

部署 Checklist

项目 状态 说明
至少 3 个 MON 节点 奇数节点
至少 3 个 OSD 节点 每节点独立故障域
公共网络与集群网络分离 双网卡 Bond
NTP 时间同步 Chrony 或 NTP
防火墙规则配置 仅开放必要端口
CephX 认证启用 不使用 none
Dashboard 启用 + HTTPS 强密码
Prometheus 监控 + Grafana
日志收集 集中日志管理
备份策略 配置 + 密钥 + 数据
CRUSH 故障域设计 至少 host 级别
PG 自动伸缩启用 pg_autoscaler

运维 Checklist(每周)

项目 命令 预期
集群健康 ceph -s HEALTH_OK
OSD 状态 ceph osd tree 无 down/out
容量使用 ceph df < 75%
PG 状态 ceph pg stat 全部 active+clean
慢操作 ceph daemon osd.0 dump_ops_in_flight 无长时间等待
崩溃记录 ceph crash ls-new 无新崩溃
MON 法定人数 ceph mon stat 全部在线
日志检查 journalctl -u ceph-\* --since "7 days ago" | grep -i error 无严重错误

运维 Checklist(每月)

项目 说明
容量趋势分析 检查增长速度,预测何时需要扩容
性能基线对比 与上月基线对比,发现性能退化
安全更新 检查操作系统和 Ceph 安全补丁
备份验证 验证备份可恢复性
密钥轮换 检查密钥使用情况
CRUSH Map 审查 确认与实际拓扑一致

16.7 性能优化速查

场景 优化方向 具体措施
随机读延迟高 缓存 增加 BlueStore cache、使用 NVMe
随机写延迟高 WAL/DB NVMe 分离 WAL/DB
顺序吞吐低 网络 升级 25GbE、Jumbo Frame
恢复影响业务 恢复限速 recovery_max_active=3
Scrub 影响业务 Scrub 时间 设置 scrub 时间窗口
MDS 元数据慢 缓存/多活 增加 MDS 缓存、启用多活
RGW 吞吐低 并发/缓存 增加工作线程、启用缓存

16.8 容量告警与自动扩容

# Prometheus 告警规则
# 容量 70% 告警(黄色)
# 容量 85% 告警(红色)
# OSD 使用率偏差过大
# PG 分布不均匀

# 自动扩容脚本(示例)
#!/bin/bash
# auto_scale_check.sh

USAGE=$(ceph df --format json | jq '.stats.total_used_bytes / .stats.total_bytes * 100 | floor')

if [ $USAGE -gt 70 ]; then
    echo "ALERT: Ceph capacity at ${USAGE}%"
    # 发送告警通知
    # 触发扩容流程...
fi

16.9 运维工具推荐

工具 用途 说明
cephadm 集群部署管理 官方推荐
ceph-medic 健康检查工具 Ceph 官方
Prometheus + Grafana 监控可视化 标准方案
Ansible 自动化运维 配合 cephadm
Terraform 基础设施即代码 云环境部署
Velero K8s 备份 ROOK 环境
S3 Browser / CyberDuck RGW 客户端 图形化管理

16.10 总结

Ceph 运维核心要点

1. 架构先行:合理的拓扑设计是稳定运行的基础
2. 监控为王:完善的监控是问题发现的前提
3. 自动化:减少人为操作失误
4. 备份验证:备份不验证等于没有备份
5. 版本管理:及时跟进安全补丁
6. 容量规划:提前规划,避免临时扩容
7. 文档记录:所有变更必须记录
8. 演练恢复:定期进行灾难恢复演练

学习路径建议

入门:第 1-4 章(架构 + 安装 + 池管理)
    ↓
应用:第 5-7 章(RBD + CephFS + RGW)
    ↓
进阶:第 8-10 章(CRUSH + 监控 + 调优)
    ↓
运维:第 11-13 章(恢复 + 安全 + 扩缩容)
    ↓
高级:第 14-16 章(容器化 + 排障 + 最佳实践)

扩展阅读

  1. Ceph 官方文档
  2. Ceph 架构详解
  3. Red Hat Ceph Storage 指南
  4. Ceph 性能调优
  5. 《Ceph 分布式存储实战》— 李志云 等著
  6. 《Learning Ceph, 2nd Edition》— Karan Singh 著

🎉 恭喜你完成了 Ceph 存储运维完全指南的全部 16 章学习!

建议在实际环境中反复练习,并结合官方文档深入理解每个主题。 如有问题,欢迎在社区中交流:Ceph Community