找回密码
 注册
查看: 136|回复: 2

ceph分布式存储的正确玩法之Ceph纠删码实践

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2025-3-28 10:00:00 | 显示全部楼层 |阅读模式
一、纠删码原理# y/ b& u/ f6 F% v0 G
纠删码(Erasure Coding,EC)是一种编码容错技术,最早是在通信行业解决部分数据在传输中的损耗问题。其基本原理就是把传输的信号分段,加入一定的校验再让各段间发生相互关联,即使在传输过程中丢失部分信号,接收端仍然能通过算法将完整的信息计算出来。在数据存储中,纠删码将数据分割成片段,把冗余数据块扩展和编码,并将其存储在不同的位置,比如磁盘、存储节点或者其他地理位置。如果需要严格区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删3种类型。% D% L/ T: J4 ]5 y
·检错码仅具备识别错码功能而无纠正错码功能。- A' W% G# M7 B7 d0 I5 J( s' |
·纠错码不仅具备识别错码功能,同时具备纠正错码功能。1 k" ]- [; ~& A
·纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除。9 @0 b2 [6 A5 V
从纠删码基本的形态看,它是k个数据块+m个校验块的结构,其中k和m值可以按照一定的规则设定,可以用公式:n=k+m来表示。变量k代表原始数据或符号的值。变量m代表故障后添加的提供保护的额外或冗余符号的值。变量n代表纠删码过程后创建的符号的总值。当小于m个存储块(数据块或校验块)损坏的情况下,整体数据块可以通过计算剩余存储块上的数据得到,整体数据不会丢失。, W, ~' p6 R* M# G! ?
下面以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上面,完成对这个对象的存储操作。如图所示。" N( i7 g" S3 q3 ]6 \, R, T
下面再看一下如何使用纠删码读取数据,同样还是以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),最终将该结果返回给客户端。整个过程如图所示。! e( z: U8 U, a7 I: }
虽然纠删码能够提供和副本相近的数据可靠性,并降低冗余数据的开销,整体上能提高存储设备的可用空间。但是,纠删码所带来的额外开销主要是大量计算和网络高负载,优点同时伴随缺点。特别是在一个硬盘出现故障的情况下,重建数据非常耗费CPU资源,而且计算一个数据块时需要读出大量数据并通过网络传输。相比副本数据恢复,纠删码数据恢复时给网络带来巨大的负担。因此,使用纠删码对硬件的设备性能是一个较大的考验,这点需要注意。另外,需要注意的是,使用纠删码所建立的存储资源池无法新建RBD块设备。8 E1 A6 p+ d2 W: B1 d( r; G
Ceph安装后默认有Default Rule,这个Rule默认是在Host层级进行三副本读写。副本技术带来的优点是高可靠性、优异的读写性能和快速的副本恢复。然而,副本技术带来的成本压力是较高的,特别是三副本数据情景下,每TB数据的成本是硬盘裸容量3倍以上(包括节点CPU和内存均摊开销)。纠删码具备与副本相近的高可用特性,而且降低了冗余数据的开销,同时带来了大量计算和网络高负载。
" w' i) k- X: h/ a" G
( D& E# W+ k( A, c1 ]: i7 \4 [3 O2 F
二、纠删码实践  q$ @  T+ @4 p: [) F* q6 I
纠删码是通过创建erasure类型的Ceph池实现的。这些池是基于一个纠删码配置文件进行创建的,在这个配置文件中定义了纠删码的特征值。现在我们将创建一个纠删码配置文件,并根据这个配置文件创建纠删码池。下面的命令将创建一个名为Ecprofile的纠删码配置文件,它定义的特征值是:k=3和m=2,两者分别表示数据块和校验块的数量。所以,每一个存储在纠删码池中的对象都将分为3(即k)个数据块,和2(即m)个额外添加的校验块,一共有5个块(k+m)。最后,这5(即k+m)个块将分布在不同故障区域中的OSD上。
. H* M6 `% Z1 S- l+ w, E0 j1、创建纠删码配置文件:
/ t/ u# G7 m- n: ^# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2
. [! w' S  ]' q: z2、查看配置文件' a  M! p* @* o4 _' p
# ceph osd erasure-code-profile ls
/ x. S7 m& a" x7 [. f/ R+ zEcprofile' H/ C, `7 ~( W6 Y+ a6 n! N
default# ^# Z# e' x2 [
# ceph osd erasure-code-profile get Ecprofile* K, r3 ~; y+ T& C6 a1 e
crush-device-class=
' K+ ~" v$ T% |- m5 T: z9 lcrush-failure-domain=osd/ y' D& m8 j- h8 B  {# ?
crush-root=default
$ O. g9 k; y! c7 E' F. x- \; |jerasure-per-chunk-alignment=false
1 d1 B& {& G$ U- C. W. ck=3, }9 S. N1 o& v$ R, F" D* k, x7 e
m=2
" r; n8 z! R9 p, cplugin=jerasure
8 h9 k9 @. h! T8 Atechnique=reed_sol_van
4 x4 |4 k. u& aw=80 x3 i- K, ~9 _, T. b( q
我们顺便也看Ceph默认的配置文件
2 e7 G4 m3 `, O2 H* H# ceph osd erasure-code-profile get default
: X+ ~  b5 q! v* c$ M- W$ kk=2
4 @" ~7 R; C0 Z  C) n/ lm=1
. t4 p5 w0 `: G# E* C1 aplugin=jerasure& f: f/ W4 b$ l1 m8 C: J
technique=reed_sol_van. @% ?5 b6 s1 H& [# e
3、基于上一步生成的纠删码配置文件新建一个erasure类型的Ceph池:  H% q0 x* R4 M$ y, ^
# ceph osd pool create testcpool 16 16 erasureEcprofile
' Q; E, Z* Y" H) N) lpool 'testcpool' created9 A% U4 r( p, p5 `' H) n! a
4、检查新创建的池的状态,你会发现池的大小是5(k+m),也就是说,erasure大小是5。因此,数据将被写入五个不同的OSD中:' t% h) }, U1 ?4 g
# ceph osd dump | grep testcpool
* h& G" u2 T7 ?1 `3 Hpool 8 'testcpool' erasure size 5 min_size 4crush_rule 3 object_hash rjenkins pg_num 16 pgp_num 16 last_change 231 flagshashpspool stripe_width 12288! ^: V  l) |- b% H% u
5、现在我们创建个文件放到纠删码池中。
7 Q- S: d; {7 i! y# echo test > test
2 v" @& s" ^2 ?# ceph osd pool ls- O8 O4 P, M0 k' ?% a
testcpool2 S* Q( D# j# J: f6 d2 t
# rados put -p testcpool object1 test+ h5 y2 |1 z) k! M. f: ~
# rados -p testcpool ls
8 b/ X' h3 z$ y- d- K0 Nobject13 J6 e8 }( d$ z" G3 G/ e, n; i
6、检查testcpool池中和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。" n( G; a9 _5 C0 d
# ceph osd map testcpool object1% Y& o$ p) x0 \" c- W" w6 W7 v, T
osdmap e233 pool 'testcpool' (8) object'object1' -> pg 8.bac5debc (8.c) -> up ([5,1,3,2,4], p5) acting([5,1,3,2,4], p5)
) \! Y# f: O, g, Y9 {8 ^8 F* R0 \- l2 V( w& n& `1 Z
三、纠删码测试# x( W3 t+ ?2 y9 ^! n
1、我们先来关闭一个osd' |2 n- j; ~# m( T
# systemctl stop ceph-osd@3
7 w( o8 N6 k. c9 a2 a: J% Q& y停止osd.3,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.3变成NONE了,这意味着osd.3在这个池是不可用的:
5 f  a3 @. N# e9 ~7 d: Q# ceph osd map testcpool object1
: R) W* p2 T4 B' A5 E0 W# Y9 u' Dosdmap e235 pool 'testcpool' (8) object'object1' -> pg 8.bac5debc (8.c) -> up ([5,1,NONE,2,4], p5) acting ([5,1,NONE,2,4],p5)
6 d- |% t, z$ Q0 ?8 j' ~6 E$ g1 V2、我们再来关闭一个osd; U  W# s8 h4 P" g( Z
# systemctl stop ceph-osd@5
- T' r* B1 {8 g! n停止osd.5,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.5变成NONE了,这意味着osd.5在这个池是不可用的:
7 O( V* n* a% Q5 t# ceph osd map testcpool object1  s2 R! f3 Z- j( E
osdmap e237 pool 'testcpool' (8) object'object1' -> pg 8.bac5debc (8.c) -> up ([NONE,1,NONE,2,4], p1) acting([NONE,1,NONE,2,4], p1). N$ h) U; A6 B- B
3、我们从纠删码池中下载文件( z+ f5 Z8 B, J% r& g
## rados get -p testcpool object1 /tmp/devops
$ n' r& c7 M! N3 ]2 z4 X
4 F+ a* `$ E- t" b) l+ _% L' _3 X  E* `2 N, u+ Q: _3 O" Z

. r* f- i7 j& _# o" m7 M

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:01 | 显示全部楼层
19 纠删码存储池/ j5 W' O. y/ {/ S5 l) O

9 Y7 K7 ?1 X1 `0 T; x8 N, A1 k& r  d+ H0 K
Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。# W3 q( V# i) e

- N9 Y# _0 O0 e. v! @有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code# `* E7 R5 m! q

' w' d. a7 T" Q' `5 T有关 EC 存储池相关的存储池值列表,请参考纠删码存储池值。
6 Y1 B7 ]8 V1 w  T5 I7 L' X19.1 纠删码存储池的先决条件
# p2 y! L, t8 f+ q& v! V # r0 a9 ^& v0 s: [3 \) u
7 l/ `3 x6 M1 J  h# {3 O
要使用纠删码,您需要:
( ?  c! W, e; o! ?6 S7 o9 E' F; q3 F! A( B3 K+ U# D8 C1 E# B
    在 CRUSH 索引中定义纠删码规则。& N# n3 Q1 V& o8 u+ \

! N" Q+ @4 T" o# n4 K    定义指定要使用的编码算法的纠删码配置。
. ?7 G  {9 {! M& v1 E% U  h3 n; i7 P) Q$ A
    创建使用上述规则和配置的存储池。 ; v* v+ t: P2 ^$ J
' H4 r' G( Z4 L8 M
请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。
& o: F2 q, M* D* J! x# ~. A4 O  ^+ j
4 b2 K/ w( V3 A* C) r确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 17.3.2 节 “firstn 和 indep”。
/ z. W$ C5 S0 X4 m- o19.2 创建示例纠删码存储池
# C# \( b  w; |* f5 I
( r; i7 {0 d! |# c% }. M3 X
* a9 Q7 p  N+ V- s3 {* Y最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。* c; @) A5 Y( n* X- h  X% z

5 H. g! e2 Z  y* v4 p- ~& k7 b$ b    命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。) F0 r! W3 f: n4 y) S, x- a# j

9 ?! @; b2 ]2 B; K) B' h3 Z    cephuser@adm > ceph osd pool create ecpool 12 12 erasure
  J' E% |* F+ s: T: X0 V' q    pool 'ecpool' created) X0 L7 v3 C4 a5 E+ V) m

4 Q% U5 F- D0 F/ S5 [字符串 ABCDEFGHI 将写入名为 NYAN 的对象。
0 R$ [& r4 ?6 A+ Z1 Z  k( A' h( i$ O9 D9 A- m* @; g. P1 c7 g
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -; m* \: r) p5 _, U, b

) U- i) ~0 B% f4 a" G; v+ X) A为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。
' T* s4 c' e" r8 M/ S* W7 N, W, K6 w; j- P6 e
要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。
. G) w) m2 Z' T4 J$ M& {% {4 b' ]3 o# `
cephuser@adm > rados --pool ecpool get NYAN -
2 M% s% f' N' t. c6 ~" Z4 VABCDEFGHI
, g. L- q7 j3 B/ C* _5 u6 Y% p2 H6 O0 o+ l7 u3 f9 E6 h. i
19.3 纠删码配置
8 K' W6 \# P( a3 U " d3 e0 P5 g, w% p# V, e. R
( T2 N: u: A+ r; L: F: A# X
调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。8 ^# w  u4 Y" W# O

7 u- ]- }( Y/ m4 m: |8 {/ L: T7 U) W纠删池配置所需的定义:
$ C+ q) k; V5 z0 Z. [. p3 w
$ @3 |* x' q! |6 H8 mchunk
. \$ ?  N2 r* @
7 ^8 M: r1 l' s# F3 @    如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。 $ h6 U- }$ C/ B/ B2 {1 e
k
! Y- ^, ]1 L$ U; t: |; j1 w% q% {3 D0 T( j" K: _+ O0 N& J
    数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。 % l$ A% s% l+ R) n# Z8 G
m
+ N  e7 `5 t$ T. |( ~" N
9 s1 a0 x, P2 ^$ N  P& V    编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。 , E+ S& P! I: k6 M( q& |
crush-failure-domain
8 ~/ _% T7 Q( r! _8 ]6 C% t9 C3 U* }+ z% w8 ?5 `( k
    定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 17.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。
2 S$ [/ L6 R' K+ O, o% }+ l# H( @4 ^2 [: d
使用第 19.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。/ Q5 O2 c1 W# N! C% r* R- t

6 }. P+ [! _( w+ G2 ^3 w# P可使用以下命令显示默认配置的设置:
; N6 q8 U0 Y) A. U  E4 j1 Z, x0 K& @3 B% q8 j1 q; i* @
cephuser@adm > ceph osd erasure-code-profile get default' ?6 T5 }1 q# _% b! c* _
directory=.libs. s$ w" B. [; ^2 d6 C. I
k=2
; @# f+ }* E- S3 H5 a" I' xm=1
# T6 \- n# z" U' O6 `3 Y; |plugin=jerasure
' X% L9 i1 F  n# u. w4 C% `2 Pcrush-failure-domain=host( y' C7 {* F# O5 g, M
technique=reed_sol_van# G8 h' M0 \/ @# j) {/ V1 k
+ }% B3 {0 f* k8 a
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 18.6 节 “存储池迁移”)。( |4 A- T5 Q9 S' B4 k

- r, g  a$ L* `2 q) v" X9 e- m最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:
0 Q* ~& Q5 Q7 J, d, N7 w  X2 Y( e9 U% V. @3 a& Z' K$ A
cephuser@adm > ceph osd erasure-code-profile set myprofile \, h- Q+ u. v- v  u  a' t
   k=3 \
( W& c: z7 A7 {3 Q/ p" X   m=2 \
5 Z7 j1 a+ Q* ~4 w6 @% x   crush-failure-domain=rack/ F  S! X" u  G! x  n
* \( ~5 P+ Z7 v! z( B
对于此新配置,可以重复第 19.2 节 “创建示例纠删码存储池”中的示例:0 h% F% Z, S* ~( Z
$ S% |2 L$ j: {% P5 g' t% r) K
cephuser@adm > ceph osd pool create ecpool 12 12 erasure myprofile& i/ o/ {/ L8 P& F. F- C
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -5 z- C7 }7 n+ `$ [# {- Y
cephuser@adm > rados --pool ecpool get NYAN -# }- E" k9 P+ Z
ABCDEFGHI& F! a; L, X- Z1 G# j6 h: @* E5 k
1 H) |3 @/ b/ W( ~# g% C% r7 U
NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。4 z5 h- k: @6 N: w" u( \
#1: 纠删码配置
6 [9 o' M$ a. g' |19.3.1 创建新纠删码配置
8 k' c$ _2 C* O: k
  v; C; J$ d! z" i$ ]
+ G9 o' Y9 D# y4 [2 N5 {" s* S以下命令可创建新纠删码配置:
8 \5 M( w7 t( h1 M# {0 c* e3 l6 X$ H
root # ceph osd erasure-code-profile set NAME \/ t6 D" U: T+ |3 m5 }3 v
directory=DIRECTORY \! y" j% l/ v1 D7 _* L
plugin=PLUGIN \( {  y, K) u8 |" ]2 Q, o
stripe_unit=STRIPE_UNIT \
" {* P4 g7 ^* c KEY=VALUE ... \
- Y6 P4 H3 x0 X. b: r1 p --force- T" N$ I- J0 d
* g* T( M9 ?7 Z5 m3 V
DIRECTORY6 _% ?( |. }" x  k  {5 w

7 r) W, H8 o+ |/ g! o    可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。 + {8 Q0 v- o- B# e; I" p4 A
PLUGIN
9 P4 X; ^6 G7 b1 T' D3 R1 ^
$ K. c8 S' H+ j# r' {) V; m# X    可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。
1 p/ J- a/ I* p' iSTRIPE_UNIT: T, ?# s$ L0 n& I

8 E9 Z3 V  \9 d& P$ {. v    可选。数据块中每个条带的数据量。例如,如果配置拥有 2 个数据块且 stripe_unit 等于 4K,则会将范围 0-4K 的数据置于块 0 中,将 4K-8K 置于块 1 中,然后再将 8K-12K 置于块 0 中。需要有多个 4K 才能实现最佳性能。默认值取自创建存储池时的 Monitor 配置选项 osd_pool_erasure_code_stripe_unit。使用此配置的存储池的“stripe_width”等于数据块的数量乘以此“stripe_unit”。 * G$ f7 y# a, P* T1 \0 x* W: i
KEY=VALUE$ M/ v0 ]) b: N
3 Q' h9 l0 o+ b* k$ ]
    专用于选定纠删码插件的选项键/值对。 0 A( q' ?3 S7 y
--force- w) Z4 ?: l' \0 y2 V

; Z7 w4 A- x8 j    可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。 , m) r1 s$ P1 P

6 q" T2 L( v. j# `  ~6 H19.3.2 删除纠删码配置7 w( k4 w4 }& y# A
6 f% {& L" N% C! D4 ]2 y' ~
% }% ]7 c- y) ^; z5 H
以下命令可按 NAME 所标识的纠删码配置删除相应配置:# h, `" s* D% ~9 f  M" H4 _

" G6 K9 w5 z7 }! H% xroot # ceph osd erasure-code-profile rm NAME. {4 Y9 ~0 y+ C7 _& l

7 m- l! m, L0 F- d7 g重要重要
) L2 ~8 g8 }1 W- J2 E, @7 F3 E0 l) F$ l  O2 {' J" o. |4 `, [3 z, _
如果某个存储池引用了该配置,则删除将会失败。
6 ?& m3 ]4 ^) z, y2 V19.3.3 显示纠删码配置的详细信息
9 d0 v  m  |! Q! f8 W) A: g
0 V9 D* M9 F6 U
# ^: q* X% j9 k! j6 [以下命令可按 NAME 所标识的纠删码配置显示其详细信息:
: t) r: o$ A. j7 a
1 l+ x4 D- Q- ]root # ceph osd erasure-code-profile get NAME  V( Q- k' r, y. ?) w; v* U, m/ i

$ F8 c& X4 |* d19.3.4 列出纠删码配置
  M' ?) e$ ?8 A8 }6 ~% j 6 z6 G* Q  \' n: ]/ z

6 W% G+ @( I" X! C" u) C以下命令可列出所有纠删码配置的名称:. t& g& S$ A* ~( }# A, m6 w2 e0 _
, a2 ^) B: M4 q; s
root # ceph osd erasure-code-profile ls
9 R9 u( u) w2 r& r' A
" f: b. v" t' z7 f& H$ C8 ~- [7 T19.4 标记含 RADOS 块设备的纠删码存储池
) U' r. \0 A8 J& A3 D# _ 5 `% J, s& ?# o2 }) o
) c% d) S4 A! ~9 h9 U- E4 S
要将 EC 池标记为 RBD 池,请对其进行相应标记:
" T5 A% p# D7 w8 O* [, Y. q6 }1 w# j' ]/ c: N' x, [
cephuser@adm > ceph osd pool application enable rbd ec_pool_name& t- {6 c3 h( w; v0 ^( ^/ X1 l- Z

6 O# W/ E" s1 c( w0 F1 \0 ^2 ARBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:
; R, D. N- X4 Y; A5 [  [, n( n  _, \, A
cephuser@adm > rbd create rbd/image_name --size 1T --data-pool ec_pool_name
+ s" ~/ s" B# x0 _9 D9 `
6 T6 Z* N9 K. P% y% N1 N2 v; b您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:02 | 显示全部楼层
在 OpenStack 中使用 Ceph 纠删码(Erasure Coding, EC)池,通常涉及到以下几个步骤:
% `9 E* C$ ]4 D! L6 ^  k1. 配置 Ceph 集群以支持纠删码
& x/ d4 d, `% \6 }; h+ S* V# m
) x$ o8 y! e2 [* j首先,确保你的 Ceph 集群已经配置并支持纠删码。这通常涉及到以下几个步骤:2 }* g: S% ]- V/ h7 u
a. 创建纠删码池
' h  x' {) B. {9 f6 C% Z' u( ~9 V+ `! X! E  G+ a, g
在 Ceph 中,你可以创建一个使用纠删码的池。例如,使用 jerasure 和 reed_sol_van 算法创建一个纠删码池:4 O8 |! N% P, G' \& s" s8 Q

! [* ^1 }8 a3 s# `8 x6 h( S2 }: ~5 fceph osd pool create ec_pool 64 64 erasure code_profile ec_profile6 w7 E+ o- C4 K" T4 O* w- B9 ~* I
ceph osd erasure-code-profile set ec_profile jerasure yel error_domain=1 k=8 m=2 ruleset-failure-domain=host crush-root=default! G. j/ i9 z5 ?" Z4 i! N- Y
  `' [" y8 O4 O& L1 }6 t
这里,k=8 表示数据块数量,m=2 表示校验块数量,error_domain=1 表示每个主机最多有一个故障域。% N! S6 v2 Z2 M4 k' n3 |% e& d3 q: k
b. 验证池配置7 x0 w: Q% V5 r. O2 K% ?
4 g+ n7 G0 y5 x  y& V) L
确认池已正确配置为纠删码:
' G3 D% a+ |5 X+ h4 K/ h: K6 L' |4 M  t  z
ceph osd pool get ec_pool erasure_code_profile# X5 Q% i. A3 f& I8 X9 ]
& w( x& H2 P! A) U( i" [# g: L
2. 在 OpenStack 中配置 Ceph 和使用纠删码池
! w: V- p6 n  F" x. D) S$ T9 s# K4 v7 R$ I. m$ w1 x, t6 J) ]9 ~, n+ g
在 OpenStack 中使用 Ceph 纠删码池,你需要在 Cinder 和 Nova 中配置 Ceph 以使用这个新的池。
; H4 k& V+ G* v. xa. 修改 Cinder 配置文件7 U0 ]8 E5 b( j/ d! C
% h) ?$ G9 Y  t  Z2 R$ W5 ]' _) @
编辑 Cinder 的配置文件(通常是 /etc/cinder/cinder.conf),并添加或修改以下设置:
5 r2 g" E! Z# H% d9 n
+ Q5 o) O5 z1 g6 i( T4 R3 w5 v, L[cinder]
; j& \, [, {9 g. tvolume_driver = cinder.volume.drivers.rbd.RBDDriver; o+ |: x# t+ x$ v& k4 ?  F* t
rbd_pool = ec_pool
" y0 T: k5 z- |1 N% }* t/ s, G1 E# Urbd_user = cinder-user
- N$ n, x& b) t. v# m. t" ~) k, ?rbd_secret_uuid = <secret-uuid>
  R" |  p' p$ Y* `+ B; y$ _& e5 ?& Q- q; {0 i
确保 rbd_secret_uuid 是你的 Ceph 认证密钥的 UUID。你可以使用以下命令生成 UUID:; z; C8 z4 I" S9 g* h
0 V9 k" Q" {, l0 f
uuidgen* E4 l) v# _- C! j- v5 R( W  C  e
7 U4 s4 ?) A% }
b. 配置 Ceph 认证密钥
" W% Q2 s& f! I* X0 C0 X
) S& x1 H* u) F0 V, U生成 Ceph 认证密钥并将其添加到 Cinder 和 Nova 的配置中:4 N  n, M: t1 [( S

# Y) s+ o8 ]* C) r# [5 p/ o3 eceph auth get-key client.cinder-user | base64
8 R) K# @6 p( B1 [, m" |* W8 P0 C
将输出添加到 Cinder 和 Nova 的配置文件中:
- L4 H- a6 |. r7 U. E
, k4 ~) S: C  l! K- b+ U[DEFAULT], W. [. U5 ~4 o' H- b1 F
rbd_secret_uuid = <secret-uuid> from uuidgen
" |; P, ^6 S9 q# V& a! J0 Y6 E. orbd_user = cinder-user
2 h* x: W9 }' t" X1 Rrbd_ceph_conf = /etc/ceph/ceph.conf: {4 [! j3 k- f+ C! s& c

8 B5 i/ }$ S7 H  P3 zc. 重启 Cinder 服务以应用更改8 J9 w+ F! r( ?- Q4 _. D

9 d9 R* V/ C; x' s$ Rsystemctl restart openstack-cinder-api openstack-cinder-volume openstack-cinder-scheduler4 t$ t( B6 w1 ]9 T' D4 M2 \& @8 q; b3 {

, W. s6 G" Y. \, _5 C3. 验证配置) I% M/ \9 A! S3 R/ j
; K  Y5 \2 G7 d4 B
确认 Cinder 可以正常使用纠删码池:8 ~# s8 k( A! g: R2 j0 q: S
: X5 x% j, T7 I) m# s) V
openstack volume create --image <image-id> --size 10 <volume-name>
5 j9 F: J/ G8 @: S% [" M) v
1 n) X3 K1 [5 d* h: Z! P检查卷是否正确创建在 EC 池中:
* D: H$ [* M/ e) G" C5 T/ b; q0 Q! h4 s; G6 o9 A
rbd ls -p ec_pool --id cinder-user --keyfile=/etc/ceph/ceph.client.cinder-user.keyring | grep <volume-name>
0 C( a8 t$ H" [: n1 G. f5 z0 \7 h6 o, {3 o& k, O' @
4. 在 Nova 中使用 Ceph 块存储(可选)
4 N: @9 `" z- ?
# B/ Q9 I8 \0 S& w: b9 ]如果需要在 Nova 中使用 Ceph 块存储,确保 Nova 的配置也指向正确的 Ceph 用户和密钥。这通常涉及到编辑 /etc/nova/nova.conf 并添加类似的 RBD 设置。
- l9 `/ M, @: D/ Y+ R! d% Q5. 重启相关服务(如果需要)
# D7 z& |& b- D, |) F5 I1 {' h( z
根据需要重启 Nova 服务:# f! U: ~: K( ]3 l4 V' a, u
! ~. O/ Z, S/ ~8 w# @
systemctl restart openstack-nova-compute openstack-nova-api openstack-nova-scheduler openstack-nova-conductor% \5 Z4 O- _2 d6 j: w. R
- [; ^& v* [2 _! S& J9 a( ~
通过以上步骤,你应该能够在 OpenStack 中成功配置和使用 Ceph 的纠删码池
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-11 22:02 , Processed in 0.019305 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表