易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 123|回复: 2
收起左侧

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

[复制链接]
发表于 2025-3-28 10:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
一、纠删码原理
8 k7 Q9 c; ]. K+ j+ P1 e9 ]纠删码(Erasure Coding,EC)是一种编码容错技术,最早是在通信行业解决部分数据在传输中的损耗问题。其基本原理就是把传输的信号分段,加入一定的校验再让各段间发生相互关联,即使在传输过程中丢失部分信号,接收端仍然能通过算法将完整的信息计算出来。在数据存储中,纠删码将数据分割成片段,把冗余数据块扩展和编码,并将其存储在不同的位置,比如磁盘、存储节点或者其他地理位置。如果需要严格区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删3种类型。
0 |1 {1 M( k8 O5 c( [; d8 H# V·检错码仅具备识别错码功能而无纠正错码功能。
# D' a4 J: o4 Q& ~·纠错码不仅具备识别错码功能,同时具备纠正错码功能。( U/ }. c1 H2 b& X- t
·纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除。
1 h* |* O: |+ z4 J1 N: E4 D从纠删码基本的形态看,它是k个数据块+m个校验块的结构,其中k和m值可以按照一定的规则设定,可以用公式:n=k+m来表示。变量k代表原始数据或符号的值。变量m代表故障后添加的提供保护的额外或冗余符号的值。变量n代表纠删码过程后创建的符号的总值。当小于m个存储块(数据块或校验块)损坏的情况下,整体数据块可以通过计算剩余存储块上的数据得到,整体数据不会丢失。
  j- z/ y; V. D" G1 k下面以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上面,完成对这个对象的存储操作。如图所示。
% J2 O2 c4 G8 Y* k* @/ K下面再看一下如何使用纠删码读取数据,同样还是以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),最终将该结果返回给客户端。整个过程如图所示。) F6 F9 W2 @8 s3 I
虽然纠删码能够提供和副本相近的数据可靠性,并降低冗余数据的开销,整体上能提高存储设备的可用空间。但是,纠删码所带来的额外开销主要是大量计算和网络高负载,优点同时伴随缺点。特别是在一个硬盘出现故障的情况下,重建数据非常耗费CPU资源,而且计算一个数据块时需要读出大量数据并通过网络传输。相比副本数据恢复,纠删码数据恢复时给网络带来巨大的负担。因此,使用纠删码对硬件的设备性能是一个较大的考验,这点需要注意。另外,需要注意的是,使用纠删码所建立的存储资源池无法新建RBD块设备。
$ @5 [9 a9 g% NCeph安装后默认有Default Rule,这个Rule默认是在Host层级进行三副本读写。副本技术带来的优点是高可靠性、优异的读写性能和快速的副本恢复。然而,副本技术带来的成本压力是较高的,特别是三副本数据情景下,每TB数据的成本是硬盘裸容量3倍以上(包括节点CPU和内存均摊开销)。纠删码具备与副本相近的高可用特性,而且降低了冗余数据的开销,同时带来了大量计算和网络高负载。
$ V" s0 p! j3 T5 [# H
- N) O7 ~5 i% \5 P2 v
4 O  ]/ C2 ?3 L) x/ v# b二、纠删码实践
. ^& S( |1 H: H& ]; M纠删码是通过创建erasure类型的Ceph池实现的。这些池是基于一个纠删码配置文件进行创建的,在这个配置文件中定义了纠删码的特征值。现在我们将创建一个纠删码配置文件,并根据这个配置文件创建纠删码池。下面的命令将创建一个名为Ecprofile的纠删码配置文件,它定义的特征值是:k=3和m=2,两者分别表示数据块和校验块的数量。所以,每一个存储在纠删码池中的对象都将分为3(即k)个数据块,和2(即m)个额外添加的校验块,一共有5个块(k+m)。最后,这5(即k+m)个块将分布在不同故障区域中的OSD上。& z  l' P" g; |$ i6 b
1、创建纠删码配置文件:
  S5 ~% c6 h( a& {+ Z8 F* H# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2( [7 N+ R2 G4 I6 b5 ?
2、查看配置文件
! e2 S- W# J8 T6 T. A# ceph osd erasure-code-profile ls
# m3 u4 S5 P2 U, r1 g/ |/ cEcprofile
2 `) \# h. x! O8 t7 m+ l3 zdefault
  i( p# v7 L1 P" F" F. \# ceph osd erasure-code-profile get Ecprofile! _' P! c+ b  P/ k3 v
crush-device-class=: F; W/ e8 S6 F9 U2 |9 a2 i* }
crush-failure-domain=osd
0 Q3 K7 [$ C' y8 v, _crush-root=default
# V% @: w( E/ L2 e" k/ gjerasure-per-chunk-alignment=false
2 L- m! l& t$ C; o5 Zk=3$ P) r% F" c7 T9 P
m=2
) o3 U* q2 m$ t. Xplugin=jerasure
, n, ]0 ?) [: F* N! p6 `# Ttechnique=reed_sol_van. E6 T1 @8 ]* @1 Z1 o+ n' ^
w=8
. p/ s5 G2 l2 F8 C0 e7 n我们顺便也看Ceph默认的配置文件
+ {2 ~) A6 C) |# ceph osd erasure-code-profile get default( U6 l9 r& @9 `& ]/ l
k=25 R: B5 p2 q  M9 W0 S0 r- {1 v
m=10 N' h- k# [+ u% z0 p# o9 a
plugin=jerasure2 p4 D$ k# e- ]5 [# A6 L% i
technique=reed_sol_van
' t0 [& N. |3 b/ Z" ~$ c3、基于上一步生成的纠删码配置文件新建一个erasure类型的Ceph池:
" V3 I, l7 b2 c5 o2 _! ?9 v# ceph osd pool create testcpool 16 16 erasureEcprofile8 f8 O& z) W6 c* K$ j, c
pool 'testcpool' created
! R: r4 d8 ?" F; F4、检查新创建的池的状态,你会发现池的大小是5(k+m),也就是说,erasure大小是5。因此,数据将被写入五个不同的OSD中:! U8 c. I+ p' [( I( Z% B7 _
# ceph osd dump | grep testcpool
4 ]# Y2 N$ U+ A6 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 122882 j, [7 Z% ?6 E) n% X
5、现在我们创建个文件放到纠删码池中。
8 p- T( V( J8 V8 q1 f7 A  v/ @# R, R# echo test > test
3 U  T! [" t; b- l# ceph osd pool ls0 m  a# y2 F9 d% \2 F9 Z
testcpool( H1 S% ]: b0 F6 U6 B
# rados put -p testcpool object1 test
+ n0 W, L' u5 n9 ~. T& \# rados -p testcpool ls
! Y' J# b( K! T9 `/ a: v: wobject1
$ ^# t/ ]8 d: ?. Y6、检查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。
2 _  E& C- u" _7 J8 T' R# ceph osd map testcpool object1
: V. S& Q# Q, W" ?  d& Josdmap 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)9 P: q! I1 l+ d. z, F

9 g+ |8 F; @% t+ j三、纠删码测试1 a+ t5 m- X- l$ l, `3 ~
1、我们先来关闭一个osd
# p8 w* l4 {7 `1 g- T4 i" {# systemctl stop ceph-osd@3. o) h, g  k9 }
停止osd.3,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.3变成NONE了,这意味着osd.3在这个池是不可用的:8 y1 M1 o* U: Q
# ceph osd map testcpool object1$ l! D, C+ W; H
osdmap 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)7 P% x4 i/ y; z% {5 S; D* f) \
2、我们再来关闭一个osd2 W. k6 K' ]5 j9 s+ L# T5 ~
# systemctl stop ceph-osd@5$ D1 W2 u" P5 c/ k; N
停止osd.5,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.5变成NONE了,这意味着osd.5在这个池是不可用的:3 z. t" E( `% R0 }0 h  @
# ceph osd map testcpool object1
- F8 W* x0 `# F# q/ N9 P, n( ^4 Cosdmap 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)
" @  M6 r1 u6 [! \9 k3、我们从纠删码池中下载文件
0 X, g& c8 q: L## rados get -p testcpool object1 /tmp/devops1 F. ~9 F3 o0 @5 s' n8 {5 B
( V$ C  b& E# C0 p5 P. A" U: j
! R4 `* L- G4 I+ ]) i

. p2 P, ]. o/ j* I% @7 W4 Z& O
 楼主| 发表于 2025-3-28 10:00:01 | 显示全部楼层
19 纠删码存储池+ o( I* j7 e+ s5 q; u9 I
' C3 a0 m( j' ^+ q; R

6 Y5 M" n9 E% c' wCeph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。
* s, J+ i  {( `3 @; ]; G
! ?  C7 N2 P, i5 m/ C有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code
3 T- C. M# i" Q" i* Y! Z6 m+ W6 \2 H2 {1 D
有关 EC 存储池相关的存储池值列表,请参考纠删码存储池值。
! k6 V; f; @' N- N6 H+ N. l19.1 纠删码存储池的先决条件. T+ _5 P- x; t' V
# G6 I/ P- d: `  d2 Q
2 B6 A9 S' D7 ]4 [& O: J1 t
要使用纠删码,您需要:3 ?, l0 {& o& e$ S) J
; |+ ~+ C6 v) q- t. F
    在 CRUSH 索引中定义纠删码规则。
* U+ a4 s, C* i3 M
% s+ }# K7 T+ c1 p1 s    定义指定要使用的编码算法的纠删码配置。
& f  K7 U! v6 K
4 H  G# p3 |$ ~; J3 d' ~5 w# ]    创建使用上述规则和配置的存储池。 % v( a/ V5 T/ R! u7 t2 Z

$ t/ p* Q/ H2 T; ^; x% u) j: h请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。
7 \8 Z% o1 v1 v1 C0 l3 A6 {# }+ ^/ e* Y1 f
确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 17.3.2 节 “firstn 和 indep”。/ q8 I( x; R' u6 \7 b  K0 d
19.2 创建示例纠删码存储池
  }1 {$ O4 o: I
) ]2 p. K/ G( U4 H) A& I7 v; ~' h. d# A8 b+ j
最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。' H, o# l/ \5 f( U' ^  T9 m

4 K* p# N, l4 h) c0 {1 e    命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。
3 `- P  e: ^9 o, U
( V( k& m  [! Q    cephuser@adm > ceph osd pool create ecpool 12 12 erasure: F. W- {$ k& u' h# v' ?
    pool 'ecpool' created9 i3 O& G# w7 r/ f# a
5 p& \5 H* {( o7 P4 ^% H  [" ^
字符串 ABCDEFGHI 将写入名为 NYAN 的对象。: e# w* H( H2 Y* j

3 F5 t7 L) H: v5 H6 ?! S9 x  vcephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -$ [2 }# j2 k% Y! w7 z5 d
6 t# R& }! f" C
为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。
' f5 K" w0 E, }# }# a$ k0 l+ k% _
要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。$ M2 C7 W3 q3 d- z

# i: P$ |8 _6 wcephuser@adm > rados --pool ecpool get NYAN -
# ^! ]* H8 U1 G. [9 p* o9 @# sABCDEFGHI, a$ a# N1 i3 e) X0 K; V
3 A! Q5 }. O2 d" k: f* T
19.3 纠删码配置
0 }2 A; I; z! r
' W% P/ ~1 G$ x- S$ U9 J* i6 C6 T
7 }7 N( m$ U1 P" E  F+ V5 Q. M调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。
4 g) r# ^% w  ^! r7 f- b5 e2 f
- D2 ]3 u; j8 U/ f4 V$ B5 O4 z7 d" ~纠删池配置所需的定义:
5 ^# H% f5 ]7 I
; a9 y/ @  S6 A7 x3 Z1 @chunk
. t: v% L& \; j$ B! I) T" m! v! @6 D9 X) A9 W. R1 U* D
    如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。 " [+ g8 n) S' R( L* m7 g
k
4 R6 \* p" t% r; M9 N. A4 _8 [9 d( F3 W
    数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。 5 p/ t' }/ d6 `
m
& y* _& ?( k& ~7 W: [2 D2 j  Y2 ^# j/ H4 b
    编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。 0 ?# c/ [+ D8 k6 u$ C$ l9 f
crush-failure-domain
$ F. Y5 q2 K  ?; @, h3 n, o
/ {0 Y2 i9 r1 x- Z    定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 17.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。
' r3 d4 g; ~$ y! g
8 K9 c# m9 f; U3 T1 I使用第 19.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。; K6 K5 Y2 r  c# r/ p7 `! M
7 k2 ]3 [6 Z% v( t. P
可使用以下命令显示默认配置的设置:! d+ O2 R. X! U9 b' E
- H3 r2 b. r2 q# K  K% S+ w4 Y
cephuser@adm > ceph osd erasure-code-profile get default$ D  n% b6 t) n/ [' V1 u! ^
directory=.libs
6 Q: ]* C. D3 [- sk=2
% ?8 T* a( g* R* Pm=1
) B# t+ [2 Y" M; x& gplugin=jerasure( ^1 v" ~; X* S
crush-failure-domain=host- o- r& f0 a7 B) T# t+ j
technique=reed_sol_van1 O# o! V; ~0 s
  T& u0 Q! m8 g4 y/ h4 K3 L
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 18.6 节 “存储池迁移”)。9 p, Y* c! @# a3 ]# r8 d( |" d
- s0 @4 j8 Z& S7 d' x3 Y+ G* U. @
最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:: E" e" O' V3 J' e8 b) [

: s( g' `0 Y: q9 P6 n3 }cephuser@adm > ceph osd erasure-code-profile set myprofile \
( E3 Q6 H) x# r6 @   k=3 \. }! X  Z- K7 p5 M7 }7 r
   m=2 \+ f& B& D& f" s( p9 v  t" n: @8 T
   crush-failure-domain=rack
8 _% s% j& {/ n
: L, ]4 }8 V( [# q* t对于此新配置,可以重复第 19.2 节 “创建示例纠删码存储池”中的示例:
3 B, s( Y& O. {  l5 u* e
  p/ J, u# ]8 y( hcephuser@adm > ceph osd pool create ecpool 12 12 erasure myprofile! @+ Z+ t. p& Z3 B' g
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
! M" O7 [. L* \7 F  ucephuser@adm > rados --pool ecpool get NYAN -  a5 m( A/ \" H" a( e9 Q
ABCDEFGHI  F9 [' S! W7 n% @
8 Z  B0 x6 M& i* K  R4 h5 I0 z
NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。
; ], l# s% k7 W6 W#1: 纠删码配置1 c6 V- s9 R" x; f7 @, I
19.3.1 创建新纠删码配置
. p- @, `8 t1 V
+ v$ E+ J1 z! b0 ~# w) v. D- D/ H2 S9 a% o; A9 m: `
以下命令可创建新纠删码配置:& ]( O% M0 V2 e: A  I

2 r: k% S% E2 `, l8 C/ a" Y" croot # ceph osd erasure-code-profile set NAME \" ~( O  B! @  k( J4 v& }. t
directory=DIRECTORY \; \, T9 o* W$ q8 @0 s
plugin=PLUGIN \
; g4 m* B# _& z/ b5 {( g+ P stripe_unit=STRIPE_UNIT \
2 c5 [& p+ c8 N1 c8 e1 m KEY=VALUE ... \
6 [* T" m2 V/ r; N, e) w) S3 B --force
/ o* s  d6 Q% t7 V( P
, ?: f6 p$ s6 b, ]6 e( CDIRECTORY7 q5 k1 w5 B% P$ J$ Z  A+ l; z

( V0 A" E3 H8 |) F7 B, q3 _    可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。
, r6 K9 O' w7 Z/ X: aPLUGIN: G. b' l4 f6 h6 D/ ?' ]$ t) j
2 t( r$ G5 A3 L- O$ H
    可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。 ( `& d& {1 q0 {
STRIPE_UNIT
  f$ n4 \5 G0 u/ o
  {+ A4 ]) P+ {# y    可选。数据块中每个条带的数据量。例如,如果配置拥有 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”。
7 |3 J' e* e& zKEY=VALUE. e- c3 `$ k" o3 W

: r4 V6 c4 n. A7 K. A    专用于选定纠删码插件的选项键/值对。
  `6 z- Z5 h1 H$ c5 {. {) Z. p  a$ e--force
+ r1 P# p5 `- Z' j" V
! G( }3 r" O8 Q$ B$ q; ~/ J4 S    可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。
0 N' y# o* P* i) Z& j3 X$ P
. h3 |" n# g  v19.3.2 删除纠删码配置
4 a- L4 B/ I, H8 x + U$ g% i3 j1 B. D, U- t, _# m
  M$ H7 N+ `" O6 g
以下命令可按 NAME 所标识的纠删码配置删除相应配置:( r- H4 L, L8 ]7 _/ y

9 G* B/ U% O: @root # ceph osd erasure-code-profile rm NAME
# \% r! m3 ~! t% V4 D$ x- \) X1 y
9 O* |" F- w/ @" j1 v1 e; x重要重要
9 {. p1 ?0 W) g. U' a$ D6 L$ D
. n1 T0 L) D" v  a. e0 U: M如果某个存储池引用了该配置,则删除将会失败。% a# {* c: z2 j* p, l  x
19.3.3 显示纠删码配置的详细信息. `# q0 P, h1 r$ c4 X. Z: j( l
2 J8 g2 I+ w: D. U

3 I  U- ], k' |7 i* }$ P# I4 o以下命令可按 NAME 所标识的纠删码配置显示其详细信息:; {, g) }% [+ Y5 Q8 C

* h: r9 z$ Q0 P! v5 ?root # ceph osd erasure-code-profile get NAME
) t# M% ^- I4 X; G3 c7 X: T9 }0 D) F! J4 q
19.3.4 列出纠删码配置
9 o% N; n  p) G3 |
* ~% N' O% H, w  u3 Q7 J0 Q8 \( _( y3 w( p: B
以下命令可列出所有纠删码配置的名称:& V/ L* V/ q5 [1 J" X0 V
( `" U, B. e! k+ ^$ ?" u4 c1 `
root # ceph osd erasure-code-profile ls  E2 e. V& {+ n/ Q8 s& {6 e' K- J5 I6 J

& r$ t' n/ N( _/ r6 T19.4 标记含 RADOS 块设备的纠删码存储池: U% v: V# @" ], l( F  X
9 L2 V, S! x8 J/ ]) G$ q' M- U3 z
/ S" L  f$ v/ }
要将 EC 池标记为 RBD 池,请对其进行相应标记:
* o$ A( c3 U  O; k2 u3 e/ f
) j5 Q  ~' I! X6 f- Dcephuser@adm > ceph osd pool application enable rbd ec_pool_name* }  v2 \4 ~) c$ j3 o3 w! a

( K5 N7 e* d4 A6 ], oRBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:
7 [; c! z  y& ?. ?+ J# t# `' e0 P+ m* k* {. R! ?' _) ?
cephuser@adm > rbd create rbd/image_name --size 1T --data-pool ec_pool_name
: f0 _! a. r1 b
' b9 f; F. G- a6 c5 p您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。
 楼主| 发表于 2025-3-28 10:00:02 | 显示全部楼层
在 OpenStack 中使用 Ceph 纠删码(Erasure Coding, EC)池,通常涉及到以下几个步骤:
, ]* ]( B& O- m9 ^" E' U1. 配置 Ceph 集群以支持纠删码
3 a! \2 |3 `$ X+ u
  g: x$ }( ^. S首先,确保你的 Ceph 集群已经配置并支持纠删码。这通常涉及到以下几个步骤:) ^# d. Q' y- {; ?
a. 创建纠删码池
' h* S2 w+ P9 x: r# e6 i4 \: \0 m' f/ G/ H: F- z& t
在 Ceph 中,你可以创建一个使用纠删码的池。例如,使用 jerasure 和 reed_sol_van 算法创建一个纠删码池:% L* I  l" n) H% m
4 t7 a, Z/ a2 H: t
ceph osd pool create ec_pool 64 64 erasure code_profile ec_profile8 q- i* L+ ?( U+ k+ k
ceph osd erasure-code-profile set ec_profile jerasure yel error_domain=1 k=8 m=2 ruleset-failure-domain=host crush-root=default$ u( X* n! Q9 Z5 {* n6 l
2 J# f. m( |% }3 S5 [5 @
这里,k=8 表示数据块数量,m=2 表示校验块数量,error_domain=1 表示每个主机最多有一个故障域。
! {# Z/ g3 ?& g$ z. c) I5 wb. 验证池配置
( H8 O8 w/ L. v* n+ x4 s; ?6 D+ n) r; H4 ~4 b
确认池已正确配置为纠删码:
. c& a% J6 Q! B1 M8 h7 l" @; @
7 ~- j! q3 P/ \) Y+ Dceph osd pool get ec_pool erasure_code_profile1 \: B" N8 l8 `. u
# l+ Q% a; J! N
2. 在 OpenStack 中配置 Ceph 和使用纠删码池
  ?9 \, K9 u4 z8 B: r' F4 d
) I8 r$ m  v2 U/ z8 Y3 ~" N在 OpenStack 中使用 Ceph 纠删码池,你需要在 Cinder 和 Nova 中配置 Ceph 以使用这个新的池。
: C' `( f# z, @+ c  e- la. 修改 Cinder 配置文件9 Q/ X5 Z" `, K. H0 S

3 d. `9 j) h" I, w' f( H* |编辑 Cinder 的配置文件(通常是 /etc/cinder/cinder.conf),并添加或修改以下设置:2 K  Q; h: q! A5 u5 v. m" S1 a

' l+ P: S0 A# m" O* M2 `[cinder]. k* x. n0 k3 J
volume_driver = cinder.volume.drivers.rbd.RBDDriver$ y4 N( @8 V) G1 c6 `4 w
rbd_pool = ec_pool6 g+ W# o% e8 ]: J$ d2 ^
rbd_user = cinder-user
% G# [4 L/ I1 n3 a" zrbd_secret_uuid = <secret-uuid>$ h1 J6 }. t( G2 c0 z' y

/ i9 }- U) {0 T3 G& z& Q8 l确保 rbd_secret_uuid 是你的 Ceph 认证密钥的 UUID。你可以使用以下命令生成 UUID:" n/ `) K) [; z4 P! U3 D
9 R4 E* ~9 L. W4 Z  ^4 e
uuidgen% d& ?8 m2 k8 c2 W3 f

- y7 C- `  `6 E8 [2 Eb. 配置 Ceph 认证密钥
( l# s( K. h$ f# B* q' e1 t$ b, e" q5 G' e7 J: h  R
生成 Ceph 认证密钥并将其添加到 Cinder 和 Nova 的配置中:
, P* U( r' K" v
5 u2 d) m5 x- M& B# d& g% f9 z1 }ceph auth get-key client.cinder-user | base649 X4 J! M6 `1 S7 ]& u) O

  ^! w0 _; t: O% E将输出添加到 Cinder 和 Nova 的配置文件中:
' t" x6 M4 @3 V( |7 G; l, y3 Z
5 F% \' `+ g  g2 V; o9 ][DEFAULT]( C5 N+ a7 N0 n- d
rbd_secret_uuid = <secret-uuid> from uuidgen
+ t4 |" F: b% G4 g7 D6 Q& T7 arbd_user = cinder-user" E1 d- M$ N2 I  \! ~
rbd_ceph_conf = /etc/ceph/ceph.conf
+ i( d" Y5 K/ t- g! E; h& I7 g" a! [* f5 J
c. 重启 Cinder 服务以应用更改
% L5 t9 L/ m6 R
& n- ?; x0 j% F) B7 E7 Y% Gsystemctl restart openstack-cinder-api openstack-cinder-volume openstack-cinder-scheduler
8 h6 l5 ?- N; i- @/ ^- G
7 y! ?. c/ H0 N3 h, U% |+ B# K3. 验证配置
& d9 o* \# n: I  V% t) @/ @  Z4 \6 T" R; H' |% G
确认 Cinder 可以正常使用纠删码池:" Z- q$ Y4 @/ b5 r+ H2 _! b
; ^* L" }# e7 H3 u6 Z) W7 G% C
openstack volume create --image <image-id> --size 10 <volume-name>
% r; j, F( K( V: P' I) y. @5 O0 ^# K
检查卷是否正确创建在 EC 池中:
$ Q4 s0 c- ]0 L0 u/ @; Z9 k( {+ c
2 t# m% ^4 L+ [$ q# J) mrbd ls -p ec_pool --id cinder-user --keyfile=/etc/ceph/ceph.client.cinder-user.keyring | grep <volume-name>
1 r( \) C: I+ |4 w3 S
& f- T) P1 M# q" y4. 在 Nova 中使用 Ceph 块存储(可选)
/ ]% V! E2 C) @( O$ c# w8 S! G! R, k. e6 N, R/ U. @
如果需要在 Nova 中使用 Ceph 块存储,确保 Nova 的配置也指向正确的 Ceph 用户和密钥。这通常涉及到编辑 /etc/nova/nova.conf 并添加类似的 RBD 设置。
  D8 v& }; Y* \2 W5. 重启相关服务(如果需要)
+ V2 V. y, Y  e  `4 o; p6 c: f  n% C6 E# ?
根据需要重启 Nova 服务:
! ~/ p, b  y* E" b* r
  |2 T+ X, N# h) V0 O' m4 Usystemctl restart openstack-nova-compute openstack-nova-api openstack-nova-scheduler openstack-nova-conductor
# N& y* Z5 z" J9 A4 x7 n
$ W% e& [0 r" ^- ?% |通过以上步骤,你应该能够在 OpenStack 中成功配置和使用 Ceph 的纠删码池
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:26 , Processed in 0.044540 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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