创建 Pool 的基本命令是:

(图片来源网络,侵删)
ceph osd pool create <pool_name> <pg_num> [pgp_num] [--allhosts|--nohost] [--pool-erasure-code-profile <profile_name>] [--size <size>] [--min-size <min-size>] [--pg_num_min <pg_num_min>] [--pgp_num_min <pgp_num_min>] [--force]
下面我们逐一分解这些参数。
核心必需参数
<pool_name>
- 描述: Pool 的名称,这是一个逻辑上的命名空间,用于组织你的数据。
- 要求: 必须是唯一的,且名称中不能有空格。
- 示例:
rbd,cephfs_data,my_app_pool
<pg_num>
- 描述: Placement Group (PG) 的数量,PG 是 Ceph 数据管理的基本单元,它将数据映射到具体的 OSD (Object Storage Daemon) 上。
- 重要性: 这是最重要的调优参数之一。
- 太少: 数据分布不均,某些 OSD 负载过高,导致热点和性能瓶颈。
- 太多: 会增加 Ceph Monitor 的负担(需要维护更多的 PG 状态),并可能轻微增加网络和 CPU 开销。
- 如何设置:
- 初始值: 一个常用的经验法则是
(Total OSDs * 100) / Pool Size,这里的Pool Size指的是副本数(如3)或 EC 编码的k+m中的k(数据块数)。 - Ceph 官方推荐工具: 使用
ceph osd pool default pg num的值,或者使用ceph osd pool create ... --pg-num-min ...让 Ceph 自动计算。 - 简单估算:
- 对于小集群(如 12 个 OSD 的副本池),可以从
128或256开始。 - 对于大集群(如 50+ 个 OSD),可以从
1024或更高开始。
- 对于小集群(如 12 个 OSD 的副本池),可以从
- 初始值: 一个常用的经验法则是
- 示例:
ceph osd pool create mypool 256
[pgp_num]
- 描述: Placement Group for Placement 的数量,它与
pg_num相关,但功能不同。pg_num: 控制数据如何分布到 OSD 上。pgp_num: 控制 Placement Group 本身如何分布到 OSD 上(主要影响数据的读写操作)。
- 最佳实践:
pgp_num应该等于pg_num,除非你有非常特殊的调优需求,否则保持它们一致是最简单、最安全的选择。 - 示例:
ceph osd pool create mypool 256 256
关键功能参数
这些参数决定了 Pool 的数据保护策略。
--size <size>
- 描述: 定义数据需要写入多少个 OSD 才算成功,这决定了 Pool 的副本数。
- 默认值: 通常继承自
osd pool default size配置项,默认为3。 - 选项:
1: 单副本,无冗余,性能最高,但数据丢失风险极大,仅适用于可完全重建的数据。2: 双副本,提供基本的冗余,但容忍一个 OSD 故障的能力较弱。3: 三副本,最常用的配置,提供高可靠性,可以容忍最多 2 个 OSD 同时故障。
- 与 Erasure Code 的关系: 如果你使用纠删码(Erasure Code),这个参数通常设置为
k(数据块的数量)。 - 示例:
ceph osd pool create mypool 256 --size 2
--min-size <min-size>
- 描述: 定义在集群 OSD 不足时,允许的最小副本数,这是一个安全机制,用于防止数据不可用。
- 默认值: 通常继承自
osd pool default min size配置项,默认为2(对于 size=3 的池)。 - 工作原理: 当集群中可用的 OSD 数量导致无法满足
--size的要求时,如果满足--min-size,Ceph 仍然会允许读写操作,但会标记 Pool 为undersized(容量不足),这保证了业务的可用性,但牺牲了数据冗余。 - 示例:
ceph osd pool create mypool 256 --size 3 --min-size 2
--erasure-code-profile <profile_name> (与 --size 互斥)
- 描述: 指定一个纠删码配置文件的名称,将 Pool 创建为纠删码池。
- 工作原理: 纠删码通过将数据分块并计算校验块,用更少的存储空间提供与副本相当的冗余。
k=4 m=2表示将数据分成 4 块,计算 2 个校验块,总共需要 6 个 OSD,可以容忍最多 2 个 OSD 故障,但存储开销仅为6/4 = 1.5倍。 - 如何创建 Profile:
# 创建一个名为 my_ec_profile 的配置 ceph osd erasure-code-profile set my_ec_profile k=4 m=2 algorithm=lrc
- 适用场景: 对存储成本敏感但对性能要求不高的场景,如冷数据、备份、归档等。
- 示例:
ceph osd pool create my_ec_pool 64 --erasure-code-profile my_ec_profile
高级与调优参数
--pg_num_min <pg_num_min> 和 --pgp_num_min <pgp_num_min>
- 描述: 定义 Pool 的 PG 数量的下限,这是 Ceph Luminous 及以后版本推荐的自动 PG 扩容机制的一部分。
- 工作原理: 当你通过
ceph osd pool set <pool_name> pg_num <new_num>增加 PG 数量时,如果新的数量低于pg_num_min,Ceph 会自动将数量设置为pg_num_min,这可以防止 PG 数量被意外调低。 - 最佳实践: 在创建 Pool 时就设置一个合理的
--pg_num_min,128,为未来的扩容留出空间。 - 示例:
ceph osd pool create mypool 256 --pg_num_min 128
--allhosts / --nohost
- 描述: 控制 Ceph 是否在所有主机上创建 Pool 的客户端认证信息(keyring)。
- 默认值:
--nohost,即默认只在执行命令的节点上创建。 - 用途: 在自动化部署或需要所有节点都能访问该 Pool 的环境中非常有用。
--force
- 描述: 强制执行操作,忽略一些警告或安全检查。
- 用途: 在 Pool 已经存在但你想重新创建时(会清空所有数据!),或者在集群状态不健康时创建 Pool。使用此参数需格外小心!
完整示例
示例 1:创建一个高性能的三副本 RBD Pool
假设集群有 15 个 OSD,我们为块存储创建一个高性能池。
# 计算初始 PG 数量: (15 * 100) / 3 = 500,我们取 512。 # 设置 pg_num_min 为 256,为未来扩容做准备。 ceph osd pool create rbd_pool 512 512 --pg_num_min 256 --size 3 --min-size 2
示例 2:创建一个用于归档的纠删码 Pool
假设我们想用更低的成本存储备份数据。

(图片来源网络,侵删)
# 1. 首先创建一个纠删码配置 ceph osd erasure-code-profile set archive_profile k=8 m=2 algorithm=jerasure # 2. 然后使用该配置创建 Pool # PG 数量计算: (15 * 100) / 8 = 187.5,我们取 192。 ceph osd pool create archive_pool 192 --erasure-code-profile archive_profile --pg_num_min 128
创建后的常用操作
创建完 Pool 后,通常还需要进行以下配置:
设置 Quota (限制容量)
防止某个 Pool 占用整个集群的空间。
# 设置 rbd_pool 的最大容量为 10TB ceph osd pool quota rbd_pool max_bytes 10995116277760
为 CephFS 创建 Pool
CephFS 需要至少两个 Pool:一个用于数据,一个用于元数据。
ceph osd pool create cephfs_data 512 512 --pg_num_min 256 --size 3 ceph osd pool create cephfs_metadata 128 128 --pg_num_min 64 --size 3
然后创建新的 CephFS 文件系统:
ceph fs new myfs cephfs_metadata cephfs_data
查看和修改 Pool
# 查看 Pool 列表 ceph osd pool ls # 查看 Pool 详情 ceph osd pool stats <pool_name> # 修改 PG 数量(扩容) ceph osd pool set <pool_name> pg_num 1024
| 参数类别 | 参数名 | 描述 | 关键点 |
|---|---|---|---|
| 核心 | <pool_name> |
Pool 名称 | 必须唯一 |
<pg_num> |
PG 数量(数据分布) | 最重要的调优参数,影响数据均衡和性能 | |
[pgp_num] |
PG 数量(操作分布) | 通常等于 pg_num |
|
| 功能 | --size |
副本数 | 决定冗余级别,默认为 3 |
--min-size |
最小副本数 | 安全机制,防止数据不可用 | |
--erasure-code-profile |
纠删码配置 | 用于降低存储成本,与 --size 互斥 |
|
| 高级 | --pg_num_min |
PG 数量下限 | 推荐使用,为自动扩容留空间 |
--force |
强制执行 | 谨慎使用 |
在创建 Pool 之前,请务必规划好它的用途(是高性能、高可靠还是低成本),并据此选择合适的参数组合,特别是 pg_num 的选择,对集群长期稳定运行至关重要。
