Akemi

Ceph的存储池Pool

2025/07/03

pool是ceph存储对象的逻辑分区

  • Pool 是逻辑容器:将物理存储资源划分为多个隔离的逻辑存储单元
  • 数据隔离层:不同应用/租户使用不同 Pool(如:虚拟机磁盘、文件系统、备份数据)
  • 策略定义层:每个 Pool 可独立配置存储策略

Ceph客户端访问pool的流程

**1.**从ceph配置文件中读取cluster name与ceph mon地址,来连接到集群

**2.**使用cluster map来获取被检索到的pool列表与属性,决定在哪里存放对象

3.创建一个特定pool的输入/输出上下文,Ceph集群使用CRUSH算法将这些pool映射到PG,然后将其映射到特定的OSD。

副本池创建

副本池/纠删码池

1
2
3
4
5
6
查看数据分布策略
ceph osd pool get <pool-name> crush_rule
replicated_rule/ec_rule

副本池 (Replicated Pool):默认策略,数据复制多份(通常 3 副本)
纠删码池 (Erasure Coded Pool):类似 RAID5/6,节省空间但计算开销大

pool的相关参数

参数 作用 设置命令
size 副本数量,默认3 ceph osd pool set size 3
pg_num Placement Group 数量 ceph osd pool set pg_num 128
pgp_num 用于归置的 PG 数量,一般与pg一致 ceph osd pool set pgp_num 128
compression 压缩算法 ceph osd pool set compression zstd
allow_ec_overwrites 允许纠删码池覆盖写入 ceph osd pool set ec_pool allow_ec_overwrites true

pool副本池的常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
创建 Pool
# 创建副本池(默认)
ceph osd pool create <pool-name> <pg-num> <pgp-num> [replicated] [<crush-rule>]

管理 Pool
# 列出所有 Pool
ceph osd lspools
# 查看 Pool 详情
ceph osd pool stats <pool-name>
# 重命名 Pool
ceph osd pool rename <old-name> <new-name>

# 修改对象副本数量
ceph osd pool set mypool size 3
# 设置I/O所需的最小副本数 (默认: 2)
# 当可用副本数低于此值时将拒绝写入
ceph osd pool set mypool min_size 2
# 防止意外删除存储池 (默认: false)
ceph osd pool set mypool nodelete true
# 调整pg数量
ceph ods pool set <pool-name> pg_num 128
# 防止修改PG数量 (默认: false)
ceph osd pool set mypool nopgchange true
# 防止修改副本数 (默认: false)
ceph osd pool set mypool nosizechange true

# 设置配额(最大对象数/字节数)
ceph osd pool set-quota <pool-name> max_objects 1000000
ceph osd pool set-quota <pool-name> max_bytes 1T

# 删除对象后在缓存中保留的时间(秒)
ceph osd pool set mypool cache_target_dirty_ratio 0.4 # 内存中脏数据阈值
ceph osd pool set mypool cache_target_full_ratio 0.8 # 触发刷盘的阈值

删除 Pool
# 需两步确认(防止误删)
ceph config set mon mon_allow_pool_delete true
ceph osd pool delete <pool-name> <pool-name> --yes-i-really-really-mean-it

快照管理
# 创建 Pool 快照
ceph osd pool mksnap <pool-name> <snap-name>

# 恢复快照
rados -p <pool-name> rollback <obj-name> <snap-name>

纠错码池配置与创建

仅做记录,纠错码池的利用率比副本池的高,但生产中基本不使用,了解即可,而且它的机制还比副本池复杂

1.每个对象数据被分割成k个数据chunks
2.计算生成m个coding chunks
3.coding chunk大小等于data chunk size大小
4.对象被存储在k+m个OSD中。

Red Hat支持以下k+m值:
4+2(1:1.5)
8+3(1:1.375)
8+4(1:1.5)
erasure code开销的计算公式为nOSD * k / (k+m) OSD Size
例如,如果你有64个4 TB的osd(总共256 TB), k=8, m=4,那么公式为64 * 8/(8+4)* 4 = 170.67。然后用原始存储容量除以开销就得到了这个比率。256TB/170.67TB = 1.5。

纠错码池配置文件

erasure code配置文件配置了纠错码池对于存储对象的数据块和编码快的数量,以及使用的擦除编码插件和算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
纠错码池的创建命令格式
ceph osd erasure-code-profile set <profile-name> \
[<directory=directory>] \
[<plugin=plugin>] \
[<crush-device-class>] \
[<crush-failure-domain>] \
[<key=value>...] \
[--force]

查看默认配置
ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van

常用参数
plugin:指定纠删码插件,默认为jerasure(其他可选:isa, lrc, shec等)。
k:数据块的数量。
m:编码块(校验块)的数量。
crush-device-class:指定设备类别(如hdd、ssd),将数据分布到特定类型的设备上。
crush-failure-domain:设置故障域(如host, osd, rack等),默认为host。
technique:指定编码技术(如reed_sol_van, cauchy等,取决于插件)。
w:指定jerasure插件中的编码包大小(可选)。
l:在lrc插件中指定局部组的数据块数量(用于局部恢复)。
crush-root:指定CRUSH规则中的根节点。

创建纠错码池配置文件
ceph osd erasure-code-profile set <profile-name> \
plugin=<plugin> \
k=<data-chunks> \
m=<coding-chunks> \
[其他参数...]

查看所有配置文件列表
ceph osd erasure-code-profile ls

查看特定配置文件的详细信息
ceph osd erasure-code-profile get my-ec-profile

删除纠删码配置文件(已使用的配置不能修改)
ceph osd erasure-code-profile rm my-ec-profile

管理和操作pool

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# ========================================
# 池重命名操作 (不影响池内数据)
# ========================================
# 重命名存储池(需更新相关用户的池权限)
ceph osd pool rename old-pool-name new-pool-name

# ========================================
# 池删除操作 (危险!永久删除数据)
# ========================================
# 1. 启用池删除功能(需在mon节点配置)
ceph config set mon mon_allow_pool_delete true

# 2. 删除存储池(双确认机制)
ceph osd pool delete pool-name pool-name --yes-i-really-really-mean-it

# ========================================
# 池防删除保护
# ========================================
# 启用防删除保护(安全锁)
ceph osd pool set pool-name nodelete true
# 禁用防删除保护(允许删除)
ceph osd pool set pool-name nodelete false

# ========================================
# 池配置管理
# ========================================
# 查看池配置参数
ceph osd pool get pool-name size # 查看副本数
ceph osd pool get pool-name min_size # 查看最小可用副本数

# 修改池配置参数
ceph osd pool set pool-name size 3 # 设置副本数
ceph osd pool set pool-name min_size 2 # 设置最小可用副本数

# ========================================
# 池列表与信息查询
# ========================================
# 列出所有存储池(简略信息)
ceph osd lspools

# 列出所有存储池详情
ceph osd pool ls detail

# 查看存储池使用统计
ceph df # 所有池容量统计
ceph osd pool stats # 所有池IO性能统计

# ========================================
# 应用程序关联
# ========================================
# 为存储池启用应用程序类型
ceph osd pool application enable pool-name cephfs # Ceph文件系统
ceph osd pool application enable pool-name rbd # Ceph块设备
ceph osd pool application enable pool-name rgw # RADOS网关

# ========================================
# 配额管理
# ========================================
# 设置存储容量配额(1TB限制)
ceph osd pool set-quota pool-name max_bytes 1T

# 设置对象数量配额(100万对象限制)
ceph osd pool set-quota pool-name max_objects 1000000

# 删除配额限制
ceph osd pool set-quota pool-name max_bytes 0
ceph osd pool set-quota pool-name max_objects 0

# ========================================
# 默认池保护参数 (需在ceph.conf配置)
# ========================================
[global]
osd_pool_default_flag_nodelete = true
osd_pool_default_flag_nopgchange = true
osd_pool_default_flag_nosizechange = true

Pool的命名空间

在Ceph中,池的命名空间(Namespace)是RADOS 存储系统中的一种逻辑隔离机制,它允许在同一个存储池(Pool)内创建多个独立的对象命名空间。

一般来说,会为每个应用程序配置一个专用的池,也就是不会使用命名空间

特点

  • 同一池内的不同命名空间可以有同名对象(不会冲突)
  • 支持独立的访问控制(通过用户权限管理)
  • 不影响底层数据分布(PG 映射机制不变)
场景 说明
多租户隔离 每个租户使用独立命名空间(tenant1_ns, tenant2_ns)
应用隔离 不同应用共享池但使用独立命名空间(app1_data, app2_logs)
数据生命周期 按日期/版本划分命名空间(2023Q1_data, v2_backup)
测试环境 生产/测试数据共存(production, staging)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在对象操作命令中,命名空间通过 -N 参数指定:
<pool_name>/<namespace>/<object_name>

# 创建财务部门命名空间
rados -p company_data -N finance put budget.xlsx /data/2023_budget.xlsx

# 创建研发部门命名空间
rados -p company_data -N rnd put design.pdf /blueprints/projectX.pdf

# 查看财务部门对象
rados -p company_data -N finance ls

# 设置部门专属用户
ceph auth get-or-create client.finance_user \
osd 'allow rw pool=company_data namespace=finance'

原文作者:王盛

原文链接:https://akemi.zj.cn/2025/07/03/Ceph-Pool/

发表日期:July 3rd 2025, 6:53:44 pm

更新日期:July 3rd 2025, 6:54:05 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. Ceph客户端访问pool的流程
  2. 2. 副本池创建
    1. 2.1. pool副本池的常用操作
  3. 3. 纠错码池配置与创建
    1. 3.1. 纠错码池配置文件
  4. 4. 管理和操作pool
  5. 5. Pool的命名空间