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

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

16 - 运维最佳实践

16.1 硬件选型指南

存储节点

组件推荐配置说明
CPU2× 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 BondOSD 复制/恢复网络
电源冗余电源避免单电源故障

Monitor 节点

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

磁盘类型选择

场景OSD 磁盘WAL/DB预期 IOPS
高性能数据库NVMe SSD同盘50,000-200,000
通用虚拟化SATA SSD同盘或 NVMe20,000-80,000
对象存储/备份SAS HDDNVMe 分离500-2,000
归档/冷存储SATA HDDNVMe 分离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 TB40 TB20 TB75%
50 TB200 TB100 TB75%
100 TB400 TB200 TB75%
500 TB2,000 TB1,000 TB75%
1 PB4 PB2 PB75%

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 Mapceph 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 -sHEALTH_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/DBNVMe 分离 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基础设施即代码云环境部署
VeleroK8s 备份ROOK 环境
S3 Browser / CyberDuckRGW 客户端图形化管理

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