1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

什么是Ceph存储池?

在 Ceph 里,“池”就好像是一个大大的存储容器,专门用来存放各种数据。想象一下,你家里的衣柜,里面有好多隔层,每个隔层专门放不同类型的衣服,这样找东西的时候就方便多了。Ceph 的池也是类似的,它把数据分门别类地存起来,方便管理和使用。
比如说,你现在有个公司,公司里有各种各样的文件,像财务报表、客户资料、产品设计图等等。你可以创建一个叫“财务池”的池,专门用来存财务报表相关的文件;再创建一个“客户池”,把客户资料都放进去;还有个“设计池”,专门存产品设计图。这样,当你要找某个文件的时候,就直接去对应的池里找就行啦,不用在一大堆乱七八糟的文件里翻来翻去。
而且,Ceph 的池还很智能呢。你可以给每个池设置不同的参数,比如数据的副本数量。假设你特别看重财务报表的安全性,就可以把“财务池”的副本数量设置得高一些,比如 3 份。这样一来,就算其中一份数据不小心丢了或者坏了,还有另外两份可以顶上,保证你的财务报表不会出问题。

池是存储对象的逻辑分区,Ceph客户端将对象写入池,池为集群提供了一层弹性,因为池定义了可以出现故障而不会丢失数据的 OSD 数量。

池类型

可用的池类型有Replicated poolsErasure pools

默认池类型为 replicated,通过将各个对象复制到多个 OSD 来发挥作用。此池类型需要较多存储空间,但提供更好的性能

纠删代码池需要较少的存储空间和网络带宽,但因为要进行奇偶校验计算,所以会占用较多的 CPU 处理时间

  • 对于不需要频繁访问不需要低延迟的数据,推荐使用纠删代码池

  • 对于需要频繁访问并且要具备快速读取性能的数据,推荐使用复制池

一旦完成池创建,池类型便无法更改

复制池

Ceph 通过创建每个对象的多个副本来保护复制池中的数据,这称为副本 (replica)。Ceph 使用 CRUSH 故障域来确定存储数据的操作集的主要 OSD。然后,主要 OSD 会查找池的当前副本大小,并计算要写入对象的次要 OSD。在主要 OSD 收到写入确认并完成数据写入后,主要 OSD 会向 Ceph 客户端确认写入操作已成功。如果一个或多个 OSD 出现故障,这一过程可保护对象中的数据。

使用以下命令来创建复制池。

1
[root@serverc ~]# ceph osd pool create pool-name  pg-num  pgp-num  replicated crush-rule-name

其中:

  • pool_name 是新池的名称。

  • pg_num 是为这个池配置的放置组 (PG) 总数。

  • pgp_num 是这个池的有效放置组数量。将它设置为与 pg_num 相等。

  • replicated 指定这是复制池;如果命令中未包含此参数,这是默认值。

  • crush-rule-name 是您想要用于这个池的 CRUSH 规则集的名称。osd_pool_default_crush_replicated_ruleset 配置参数设置其默认值。

创建一个名为lxhpool,且pg和pgp都是32的复制池,默认就是复制池,所以最后的replicated并不需要指定,而且在Ceph 5之后的集群中,也不需要指定PG参数,会自动平衡

1
2
[root@serverc ~]# ceph osd pool create lxhpool 32 32 replicated
pool 'lxhpool' created

查看数据库中定义的副本数是3,osd_pool_default_min_size 参数可设置必须提供多少个对象副本才能接受 I/O 请求。默认值为 2。

1
2
[root@serverc ~]# ceph config get mon osd_pool_default_size
3

查看池详细属性

可以看到lxhpool的副本数量为3,也就3副本存储

1
2
[root@serverc ~]# ceph osd pool ls detail | grep lxhpool
pool 6 'lxhpool' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on

修改池的副本数

1
2
3
4
5
[root@serverc ~]# ceph osd pool set lxhpool size 4
set pool 6 size to 4

[root@serverc ~]# ceph osd pool ls detail | grep lxhpool
pool 6 'lxhpool' replicated size 4 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on

配置池的应用程序类型

Ceph 池的应用程序类型主要有以下几种:

  1. RBD(Ceph Block Device):用于块设备存储,类似于传统的SAN或RAID设备,支持高性能随机读写的需求,通常用于数据库、虚拟机等需要快速磁盘访问的应用场景

  2. CephFS:提供分布式文件系统服务,支持POSIX语义,并提供高性能的文件读写操作,适用于需要文件系统服务的场景

  3. RGW(RADOS Gateway):提供基于对象的存储服务,类似于Amazon S3或OpenStack Swift等云存储服务,支持RESTful API的访问方式,适用于存储大量非结构化数据,如图片、视频、日志等

将lxhpool类型设置为rbd

1
2
3
4
5
6
[root@serverc ~]# ceph osd pool application enable lxhpool rbd
enabled application 'rbd' on pool 'lxhpool'
[root@serverc ~]# ceph osd pool application get lxhpool
{
"rbd": {}
}

修改池名称

lxhpool没有体现出IT用途,我们修改一下

1
2
3
4
5
[root@serverc ~]# ceph osd pool rename lxhpool ftpserver
pool 'lxhpool' renamed to 'ftpserver'
[root@serverc ~]# ceph osd pool ls
...
ftpserver

是否允许删除池

一般来说,如果全局允许删除池,你可以用下面的方法来修改池的删除开关

设置为true,就是不允许删除

1
2
3
4
5
[root@serverc ~]# ceph config set mon mon_allow_pool_delete true
[root@serverc ~]# ceph osd pool set ftpserver nodelete true
set pool 6 nodelete to true
[root@serverc ~]# ceph osd pool rm ftpserver ftpserver --yes-i-really-really-mean-it
Error EPERM: pool deletion is disabled; you must unset nodelete flag for the pool first

纠删代码池

在纠删代码池中存储的对象分割为多个数据区块,这些数据区块存储在不同的 OSD 中。编码块的数量是根据数据块计算的,并存储在不同的 OSD 中。当 OSD 出现故障时,可利用编码块来重构对象数据

与复制池不同,纠删代码池不依赖于存储每个对象的多个副本

以下概括了纠删代码池的工作方式:

  • 每个对象的数据分割为 k 个数据区块。

  • 计算出 m 个编码区块。

  • 编码区块大小与数据区块大小相同。

  • 对象存储在总共 k + m 个 OSD 中。

与复制池相比,纠删代码使用存储容量的效率更高。复制池维护对象的 n 个副本,而纠删代码仅维护 k + m 个区块。例如,具有 3 个副本的复制池要使用 3 倍存储空间。而 k=4 和 m=2 的纠删代码池仅要使用 1.5 倍存储空间。

假设我们有一个原始数据文件,大小为1GB

1
2
3
4
5
6
7
8
9
复制池:1*3=3G

纠删码池:k=4, m=2

每个数据块=1G/4=250M

总的编码块=250M*2=500M

总大小等于=250M*4个数据块+编码块500M=1500M

综上所述,在Ceph分布式存储中,如果用复制池,需要3G空间,而纠删码池只需要1.5G,所以更省空间

与复制池相比,纠删代码池只需较少的存储空间就能实现相似程度的数据保护,由此可以降低成本和存储集群的大小。不过,计算编码块会增加纠删代码池的 CPU 处理和内存开销,因而会降低整体性能

创建纠删代码池

命令格式如下:

1
ceph osd pool create pool-name pg-num pgp-num erasure erasure-code-profile crush-rule-name

其中:

  • pool-name 是新池的名称。

  • pg-num 是这个池的放置组 (PG) 总数。

  • pgp-num 是这个池的有效放置组数量。通常而言,这应当与 PG 总数相等。

  • erasure 指定这是纠删代码池。

  • erasure-code-profile 要使用的配置文件的名称。您可使用 ceph osd erasure-code-profile set 命令创建新的配置文件。配置文件定义 k 和 m 值,以及要使用的纠删代码池插件。默认情况下,Ceph 使用 default 配置文件。

  • crush-rule-name 是要用于这个池的 CRUSH 规则集的名称。如果不设置,Ceph 将使用纠删代码池配置文件中定义的规则集。

使用以下命令创建Erasure编码池

1
2
3
4
[root@serverc ~]# ceph osd pool create ecpool erasure default
pool 'ecpool' created
[root@serverc ~]# ceph osd pool ls detail | grep ecpool
pool 7 'ecpool' erasure profile default size 4 min_size 3 crush_rule 1

纠删代码配置文件概述

纠删代码配置文件可配置纠删代码池用于存储对象的数据区块和编码区块的数量,以及要使用的纠删代码插件和算法。

创建配置文件来定义一组不同的纠删代码参数。Ceph 会在安装期间创建 default 配置文件。这个配置文件已配置为将对象分割为两个数据区块和一个编码区块。

使用以下命令来创建新配置文件。

1
ceph osd erasure-code-profile set profile-name arguments

可用的参数如下:

k

在不同 OSD 之间拆分的数据区块数量。默认值为 2。

m

数据变得不可用之前可以出现故障的 OSD 数量。默认值为 1。

directory

此可选参数是插件库的位置。默认值为 /usr/lib64/ceph/erasure-code

plugin

此可选参数定义要使用的纠删代码算法。

crush-failure-domain

此可选参数定义 CRUSH 故障域,它控制区块放置。默认设置为 host,这样可确保对象的区块放置到不同主机的 OSD 上。如果设置为 osd,则对象的区块可以放置到同一主机的 OSD 上。如果将故障域设置为 osd,则会缺乏一定的灵活性,因为如果主机出现故障,则该主机上的所有 OSD 都会出现故障。故障域可定义,并可用于确保将区块放置到不同数据中心机架或其他定制的主机上的 OSD 上。

crush-device-class

此可选参数选择仅将这一类别设备支持的 OSD 用于池。典型的类别可能包括 hddssd 或 nvme

crush-root

此可选参数设置 CRUSH 规则集的根节点。

key=value

插件可以具有对该插件唯一的键值参数。

technique

每个插件提供一组不同的技术来实施不同的算法。

不能修改已存在存储池的erasure code配置文件

使用 ceph osd erasure-code-profile ls 命令可列出现有的配置文件。

使用 ceph osd erasure-code-profile get 命令可查看现有配置文件的详细信息。

使用 ceph osd erasure-code-profile rm 命令可移除现有的配置文件。

管理和应用纠删配置文件

列出所有配置文件

1
2
[root@serverc ~]# ceph osd erasure-code-profile ls
default

查看default配置文件详情

1
2
3
4
5
[root@serverc ~]# ceph osd erasure-code-profile get default
k=2
m=2
plugin=jerasure
technique=reed_sol_van

使用以下命令创建一个新的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@serverc ~]# ceph osd erasure-code-profile set lxhecprofile \
crush-device-class=hdd \
crush-failure-domain=host \
crush-root=default \
k=4 m=2

[root@serverc ~]# ceph osd erasure-code-profile get lxhecprofile
crush-device-class=hdd
crush-failure-domain=host
crush-root=default
jerasure-per-chunk-alignment=false
k=4
m=2
plugin=jerasure
technique=reed_sol_van
w=8

修改池现有的配置文件是不支持的,必须要创建新的池

1
2
3
4
[root@serverc ~]# ceph osd pool create ecpool2 erasure lxhecprofile
pool 'ecpool2' created
[root@serverc ~]# ceph osd pool ls detail | grep lxhecprofile
pool 8 'ecpool2' erasure profile lxhecprofile size 6 min_size 5

池命名空间

命名空间是池中对象的逻辑组。可以限制池的访问权限,使得用户只能存储或检索特定命名空间内的对象。命名空间的一个优点是可以将用户访问权限限制到池的某一部分。

若要在命名空间内存储对象,客户端应用必须提供池和命名空间的名称。默认情况下,每个池包含一个具有空名称的命名空间,称为默认命名空间。

1
2
3
4
5
6
7
[root@serverc ~]# rados -p ecpool put hosts /etc/hosts
[root@serverc ~]# rados -p ecpool -N lixiaohui put hosts /etc/hosts
[root@serverc ~]# rados -p ecpool -N lixiaohui put inittab /etc/inittab
[root@serverc ~]# rados -p ecpool ls --all
lixiaohui inittab
hosts
lixiaohui hosts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@serverc ~]# rados -p ecpool ls --all --format=json-pretty
[
{
"namespace": "lixiaohui",
"name": "inittab"
},
{
"namespace": "",
"name": "hosts"
},
{
"namespace": "lixiaohui",
"name": "hosts"
}
]