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 章(容器化 + 排障 + 最佳实践)
扩展阅读
- Ceph 官方文档
- Ceph 架构详解
- Red Hat Ceph Storage 指南
- Ceph 性能调优
- 《Ceph 分布式存储实战》— 李志云 等著
- 《Learning Ceph, 2nd Edition》— Karan Singh 著
🎉 恭喜你完成了 Ceph 存储运维完全指南的全部 16 章学习!
建议在实际环境中反复练习,并结合官方文档深入理解每个主题。
如有问题,欢迎在社区中交流:Ceph Community