Ceph 存储运维完全指南 / 04 - 存储池管理
04 - 存储池管理
4.1 存储池(Pool)概述
存储池是 Ceph 中数据管理的逻辑单元,每个池有独立的 PG 数量、副本策略和 CRUSH 规则。
池类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| replicated(副本) | 每个对象保存 N 份副本 | 默认方式,小规模/高性能场景 |
| erasure(纠删码) | 数据分片 + 校验分片 | 大容量存储、对象存储、冷数据 |
池操作命令
# 创建副本池
ceph osd pool create mypool 128 128 replicated
# 创建 EC 池
ceph osd erasure-code-profile set myprofile k=4 m=2 crush-failure-domain=host
ceph osd pool create ecpool 128 128 erasure myprofile
# 查看所有池
ceph osd pool ls
ceph osd pool ls detail
# 重命名池
ceph osd pool rename mypool mypool-new
# 删除池(危险操作!)
ceph osd pool delete mypool mypool --yes-i-really-really-mean-it
# 设置池配额
ceph osd pool set-quota mypool max_objects 1000000
ceph osd pool set-quota mypool max_bytes 10G
4.2 PG 数量规划
PG 数量是影响 Ceph 性能和数据分布均匀性的关键参数。
PG 计算公式
推荐 PG 总数 = (OSD 总数 × 100) / 副本数
每个池的 PG 数 = OSD 总数 × 100 / 副本数 / 池数量(向上取最近的 2 的幂)
PG 参考表
| OSD 数量 | 副本数=3 时推荐 PG 数 | EC 4+2 时推荐 PG 数 |
|---|---|---|
| 3 | 128 | 128 |
| 6 | 256 | 128 |
| 10 | 512 | 256 |
| 20 | 512 | 256 |
| 50 | 1024 | 512 |
| 100 | 2048 | 1024 |
| 200 | 4096 | 2048 |
注意事项:
- PG 数量应为 2 的幂(128、256、512…)
- 单个 OSD 上的 PG 数不应超过 200
- 启用
pg_autoscaler可自动调整 PG 数量
PG 自动伸缩
# 启用 PG 自动伸缩模块
ceph mgr module enable pg_autoscaler
# 设置池的自动伸缩模式
ceph osd pool set mypool pg_autoscale_mode on # 自动调整(推荐)
ceph osd pool set mypool pg_autoscale_mode warn # 仅警告
ceph osd pool set mypool pg_autoscale_mode off # 关闭
# 查看 PG 伸缩建议
ceph osd pool autoscale-status
输出示例:
POOL SIZE TARGET SIZE RATE RAW CAPACITY RATIO TARGET RATIO PG_NUM NEW PG_NUM AUTOSCALE
mypool 100G - 3.0 3000G 0.10 - 128 - on
ecpool 200G - 1.5 3000G 0.10 - 256 - on
.rgw.root 1K - 3.0 3000G 0.00 - 32 - on
4.3 副本池(Replicated Pool)
副本数管理
# 查看当前副本数
ceph osd pool get mypool size
# output: size: 3
# 修改副本数(影响所有已存在和新建的对象)
ceph osd pool set mypool size 2 # 设置 2 副本
ceph osd pool set mypool size 3 # 恢复 3 副本
# 设置最小副本数(低于此值拒绝写入)
ceph osd pool set mypool min_size 2
# 查看最小副本数
ceph osd pool get mypool min_size
副本策略对比
| 副本数 | 可靠性 | 存储效率 | 写入延迟 | 适用场景 |
|---|---|---|---|---|
| 2 | 中 | 50% | 低 | 非关键数据、开发环境 |
| 3 | 高 | 33% | 中 | 生产环境默认 |
| 4 | 极高 | 25% | 高 | 极高可靠性要求 |
4.4 纠删码池(Erasure Code Pool)
纠删码原理
纠删码将数据分成 k 个数据块和 m 个校验块,可容忍最多 m 个块丢失。
原始数据 (1MB)
↓
┌─────┬─────┬─────┬─────┬─────┬─────┐
│ D1 │ D2 │ D3 │ D4 │ P1 │ P2 │ ← k=4, m=2 (EC 4+2)
│数据 │数据 │数据 │数据 │校验 │校验 │
└─────┴─────┴─────┴─────┴─────┴─────┘
OSD0 OSD1 OSD2 OSD3 OSD4 OSD5
存储效率: k/(k+m) = 4/6 = 67%(vs 副本 33%)
可容忍: 最多丢失任意 2 个块
创建 EC 池
# 创建 EC 配置文件
ceph osd erasure-code-profile set ec-k4m2 \
k=4 \
m=2 \
crush-failure-domain=host \
crush-device-class=hdd \
plugin=jerasure \
technique=reed_sol_van
# 查看 EC 配置
ceph osd erasure-code-profile get ec-k4m2
# 创建 EC 池
ceph osd pool create ecpool 256 256 erasure ec-k4m2
# EC 池覆盖写支持(Ceph 13.0+)
# 需要创建全局 EC 覆盖写配置
ceph osd pool set ecpool allow_ec_overwrites true
EC 配置文件参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| k | 数据块数 | 2 |
| m | 校验块数 | 1 |
| crush-failure-domain | 故障域 | host |
| crush-device-class | 设备类型 | - (任意) |
| plugin | 编码插件 | jerasure |
| technique | 编码技术 | reed_sol_van |
| stripe_unit | 条带大小 | 4096 |
常用 EC 配置方案
| 方案 | k+m | 存储效率 | 可靠性 | 最少 OSD 数 |
|---|---|---|---|---|
| EC 2+1 | 3 | 67% | 容忍 1 故障 | 3 |
| EC 4+2 | 6 | 67% | 容忍 2 故障 | 6 |
| EC 8+3 | 11 | 73% | 容忍 3 故障 | 11 |
| EC 8+4 | 12 | 67% | 容忍 4 故障 | 12 |
业务场景:
- EC 4+2:适合对象存储、备份数据,存储效率和可靠性平衡
- EC 8+4:适合 PB 级归档存储,最大化存储效率
- 副本池适合 RBD 块存储、数据库等需要低延迟的场景
4.5 CRUSH 规则(Rule)
CRUSH 规则定义了数据如何放置到 OSD 上。
# 查看现有规则
ceph osd crush rule ls
# 查看规则详情
ceph osd crush rule dump
# 创建自定义规则
# 例:SSD 专用规则
ceph osd crush rule create-replicated ssd_rule default host firstn class ssd
# 例:指定 root 的规则
ceph osd crush rule create-replicated rack_rule rack1 rack firstn
# 将规则应用到池
ceph osd pool set mypool crush_rule ssd_rule
规则结构示例
rule replicated_ssd {
id 1
type replicated
step take default class ssd # 从 SSD 设备类中选择
step chooseleaf firstn 0 type host # 在不同 host 上选择
step emit
}
4.6 池配额管理
# 设置最大对象数
ceph osd pool set-quota mypool max_objects 10000000
# 设置最大字节数
ceph osd pool set-quota mypool max_bytes 1T
# 查看配额
ceph osd pool get-quota mypool
# 移除配额
ceph osd pool set-quota mypool max_objects 0
ceph osd pool set-quota mypool max_bytes 0
4.7 池属性调优
# 查看所有池属性
ceph osd pool get mypool all
# === 关键属性 ===
# PG 自动伸缩
ceph osd pool set mypool pg_autoscale_mode on
# 调整 scrub 频率(降低对性能的影响)
ceph osd pool set mypool scrub_min_interval 604800 # 7 天
ceph osd pool set mypool scrub_max_interval 2592000 # 30 天
ceph osd pool set mypool deep_scrub_interval 2419200 # 28 天
# 快照配置
ceph osd pool set mypool snapshot_autocreate false
ceph osd pool set mypool snapshot_trim_interval 300
# 应用标签(用于识别池用途)
ceph osd pool set mypool description "RBD pool for OpenStack Nova"
4.8 池管理最佳实践
生产环境池规划示例
# 创建 OpenStack 专用池
ceph osd pool create volumes 256 256 replicated # Cinder 卷
ceph osd pool create images 128 128 replicated # Glance 镜像
ceph osd pool create backups 128 128 replicated # Cinder 备份
ceph osd pool create vms 256 256 replicated # Nova 虚拟机
# 创建 Kubernetes 专用池
ceph osd pool create k8s-rbd 256 256 replicated
# 创建 RGW 专用 EC 池
ceph osd erasure-code-profile set rgw-ec k=4 m=2 crush-failure-domain=host
ceph osd pool create rgw-data 256 256 erasure rgw-ec
# 设置最小副本数
for pool in volumes images backups vms k8s-rbd; do
ceph osd pool set $pool min_size 2
done
# 启用 PG 自动伸缩
for pool in volumes images backups vms k8s-rbd rgw-data; do
ceph osd pool set $pool pg_autoscale_mode on
done
注意事项
| 事项 | 说明 |
|---|---|
| PG 数量不可减少 | 只能增加,不能减少(除非删除池重建) |
| EC 池不支持快照创建 | 需要额外配置覆盖写支持 |
| 修改副本数会触发数据迁移 | 生产环境谨慎操作 |
| 删除池不可恢复 | 务必确认后再操作 |
| 池名不能重复 | 每个池名称全局唯一 |
扩展阅读
下一章:05 - 块存储 RBD — 学习 RBD 镜像管理、快照、克隆以及与 QEMU/Kubernetes 的集成。