共计 3544 个字符,预计需要花费 9 分钟才能阅读完成。
这篇文章给大家分享的是有关 Ceph 纠删码怎么用的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
一、纠删码原理
纠删码 (Erasure Coding,EC) 是一种编码容错技术,最早是在通信行业解决部分数据在传输中的损耗问题。其基本原理就是把传输的信号分段,加入一定的校验再让各段间发生相互关联,即使在传输过程中丢失部分信号,接收端仍然能通过算法将完整的信息计算出来。在数据存储中,纠删码将数据分割成片段,把冗余数据块扩展和编码,并将其存储在不同的位置,比如磁盘、存储节点或者其他地理位置。如果需要严格区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删 3 种类型。
·检错码仅具备识别错码功能而无纠正错码功能。
·纠错码不仅具备识别错码功能,同时具备纠正错码功能。
·纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除。
从纠删码基本的形态看,它是 k 个数据块 + m 个校验块的结构,其中 k 和 m 值可以按照一定的规则设定,可以用公式:n=k+ m 来表示。变量 k 代表原始数据或符号的值。变量 m 代表故障后添加的提供保护的额外或冗余符号的值。变量 n 代表纠删码过程后创建的符号的总值。当小于 m 个存储块 (数据块或校验块) 损坏的情况下,整体数据块可以通过计算剩余存储块上的数据得到,整体数据不会丢失。
下面以 k =2,m= 1 为例,介绍一下如何以纠删码的形式将一个名称为 cat.jpg 的对象存放在 Ceph 中,假定该对象的内容为 ABCDEFGH。客户端在将 cat.jpg 上传到 Ceph 以后,会在主 OSD 中调用相应的纠删码算法对数据进行编码计算:将原来的 ABCDEFGH 拆分成两个分片,对应图 11- 2 中的条带分片 1(内容为 ABCD)和条带分片 2(内容为 EFGH),之后再计算出另外一个校验条带分片 3(内容为 WXYZ)。按照 crushmap 所指定的规则,将这 3 个分片随机分布在 3 个不同的 OSD 上面,完成对这个对象的存储操作。如图所示。
下面再看一下如何使用纠删码读取数据,同样还是以 cat.jpg 为例。客户端在发起读取 cat.jpg 请求以后,这个对象所在 PG 的主 OSD 会向其他关联的 OSD 发起读取请求,比如主 OSD 是图中的 OSD1,当请求发送到了 OSD2 和 OSD3,此时刚好 OSD2 出现故障无法回应请求,导致最终只能获取到 OSD1(内容为 ABCD)和 OSD3(WXYZ)的条带分片,此时 OSD1 作为主 OSD 会对 OSD1 和 OSD3 的数据分片做纠删码解码操作,计算出 OSD2 上面的分片内容(即 EFGH),之后重新组合出新的 cat.jpg 内容(ABCDEFGH),最终将该结果返回给客户端。整个过程如图所示。
虽然纠删码能够提供和副本相近的数据可靠性,并降低冗余数据的开销,整体上能提高存储设备的可用空间。但是,纠删码所带来的额外开销主要是大量计算和网络高负载,优点同时伴随缺点。特别是在一个硬盘出现故障的情况下,重建数据非常耗费 CPU 资源,而且计算一个数据块时需要读出大量数据并通过网络传输。相比副本数据恢复,纠删码数据恢复时给网络带来巨大的负担。因此,使用纠删码对硬件的设备性能是一个较大的考验,这点需要注意。另外,需要注意的是,使用纠删码所建立的存储资源池无法新建 RBD 块设备。
Ceph 安装后默认有 Default Rule,这个 Rule 默认是在 Host 层级进行三副本读写。副本技术带来的优点是高可靠性、优异的读写性能和快速的副本恢复。然而,副本技术带来的成本压力是较高的,特别是三副本数据情景下,每 TB 数据的成本是硬盘裸容量 3 倍以上(包括节点 CPU 和内存均摊开销)。纠删码具备与副本相近的高可用特性,而且降低了冗余数据的开销,同时带来了大量计算和网络高负载。
二、纠删码实践
纠删码是通过创建 erasure 类型的 Ceph 池实现的。这些池是基于一个纠删码配置文件进行创建的,在这个配置文件中定义了纠删码的特征值。现在我们将创建一个纠删码配置文件,并根据这个配置文件创建纠删码池。下面的命令将创建一个名为 Ecprofile 的纠删码配置文件,它定义的特征值是:k= 3 和 m =2,两者分别表示数据块和校验块的数量。所以,每一个存储在纠删码池中的对象都将分为 3(即 k)个数据块,和 2(即 m)个额外添加的校验块,一共有 5 个块 (k+m)。最后,这 5(即 k +m) 个块将分布在不同故障区域中的 OSD 上。
1、创建纠删码配置文件:
# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2
2、查看配置文件
# ceph osd erasure-code-profile ls
Ecprofile
default
# ceph osd erasure-code-profile get Ecprofile
crush-device- >
crush-failure-domain=osd
crush-root=default
jerasure-per-chunk-alignment=false
k=3
m=2
plugin=jerasure
technique=reed_sol_van
w=8
我们顺便也看 Ceph 默认的配置文件
# ceph osd erasure-code-profile get default
k=2
m=1
plugin=jerasure
technique=reed_sol_van
3、基于上一步生成的纠删码配置文件新建一个 erasure 类型的 Ceph 池:
# ceph osd pool create Ecpool 16 16 erasureEcprofile
pool Ecpool created
4、检查新创建的池的状态,你会发现池的大小是 5(k+m),也就是说,erasure 大小是 5。因此,数据将被写入五个不同的 OSD 中:
# ceph osd dump | grep Ecpool
pool 8 Ecpool erasure size 5 min_size 4crush_rule 3 object_hash rjenkins pg_num 16 pgp_num 16 last_change 231 flagshashpspool stripe_width 12288
5、现在我们创建个文件放到纠删码池中。
# echo test test
# ceph osd pool ls
Ecpool
# rados put -p Ecpool object1 test
# rados -p Ecpool ls
object1
6、检查 EC 池中和 object1 的 OSDmap。命令的输出将清晰地显示对象的每个块所在的 OSDID。正如步骤 1)中说明的那样,object1 被分为 3(m)个数据块和 2(k)个额外的校验块,因此,5 个块分别存储在 Ceph 集群完全不同的 OSD 上。在这个演示中,object1 一直存储在这 5 个 OSD 中,它们是 osd.5、osd.1、osd.3、osd.2、osd.4。
# ceph osd map Ecpool object1
osdmap e233 pool Ecpool (8) object object1 – pg 8.bac5debc (8.c) – up ([5,1,3,2,4], p5) acting([5,1,3,2,4], p5)
三、纠删码测试
1、我们先来关闭一个 osd
# systemctl stop ceph-osd@3
停止 osd.3,检查 EC 池和 object1 的 OSDmap。你应该注意,这里的 osd.3 变成 NONE 了,这意味着 osd.3 在这个池是不可用的:
# ceph osd map Ecpool object1
osdmap e235 pool Ecpool (8) object object1 – pg 8.bac5debc (8.c) – up ([5,1,NONE,2,4], p5) acting ([5,1,NONE,2,4],p5)
2、我们再来关闭一个 osd
# systemctl stop ceph-osd@5
停止 osd.5,检查 EC 池和 object1 的 OSDmap。你应该注意,这里的 osd.5 变成 NONE 了,这意味着 osd.5 在这个池是不可用的:
# ceph osd map Ecpool object1
osdmap e237 pool Ecpool (8) object object1 – pg 8.bac5debc (8.c) – up ([NONE,1,NONE,2,4], p1) acting([NONE,1,NONE,2,4], p1)
3、我们从纠删码池中下载文件
## rados get -p Ecpool object1 /tmp/wyl
感谢各位的阅读!关于“Ceph 纠删码怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!