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

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

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2025-3-28 10:00:00 | 显示全部楼层 |阅读模式
一、纠删码原理
7 @) J6 T# _# [/ H" |纠删码(Erasure Coding,EC)是一种编码容错技术,最早是在通信行业解决部分数据在传输中的损耗问题。其基本原理就是把传输的信号分段,加入一定的校验再让各段间发生相互关联,即使在传输过程中丢失部分信号,接收端仍然能通过算法将完整的信息计算出来。在数据存储中,纠删码将数据分割成片段,把冗余数据块扩展和编码,并将其存储在不同的位置,比如磁盘、存储节点或者其他地理位置。如果需要严格区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删3种类型。
' K+ y4 P; Y! A·检错码仅具备识别错码功能而无纠正错码功能。0 ~1 w  O( d8 n) y& l
·纠错码不仅具备识别错码功能,同时具备纠正错码功能。: D4 X% I, u0 D& t1 B3 J8 D5 C
·纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除。
! j+ T/ H- C- [. t% k从纠删码基本的形态看,它是k个数据块+m个校验块的结构,其中k和m值可以按照一定的规则设定,可以用公式:n=k+m来表示。变量k代表原始数据或符号的值。变量m代表故障后添加的提供保护的额外或冗余符号的值。变量n代表纠删码过程后创建的符号的总值。当小于m个存储块(数据块或校验块)损坏的情况下,整体数据块可以通过计算剩余存储块上的数据得到,整体数据不会丢失。
% E: e: F8 O) u6 X8 q下面以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上面,完成对这个对象的存储操作。如图所示。
$ b  v+ t. c2 _& n8 ?9 P下面再看一下如何使用纠删码读取数据,同样还是以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),最终将该结果返回给客户端。整个过程如图所示。0 g, i+ Y% M; a1 P+ _
虽然纠删码能够提供和副本相近的数据可靠性,并降低冗余数据的开销,整体上能提高存储设备的可用空间。但是,纠删码所带来的额外开销主要是大量计算和网络高负载,优点同时伴随缺点。特别是在一个硬盘出现故障的情况下,重建数据非常耗费CPU资源,而且计算一个数据块时需要读出大量数据并通过网络传输。相比副本数据恢复,纠删码数据恢复时给网络带来巨大的负担。因此,使用纠删码对硬件的设备性能是一个较大的考验,这点需要注意。另外,需要注意的是,使用纠删码所建立的存储资源池无法新建RBD块设备。
0 J7 ~7 N/ s9 K+ ]Ceph安装后默认有Default Rule,这个Rule默认是在Host层级进行三副本读写。副本技术带来的优点是高可靠性、优异的读写性能和快速的副本恢复。然而,副本技术带来的成本压力是较高的,特别是三副本数据情景下,每TB数据的成本是硬盘裸容量3倍以上(包括节点CPU和内存均摊开销)。纠删码具备与副本相近的高可用特性,而且降低了冗余数据的开销,同时带来了大量计算和网络高负载。
6 j  Z( r0 l: ~; u" \  `4 m+ Q$ _7 f- \' a! c2 k6 V

# a; h4 s% J5 }; Q  T二、纠删码实践3 d0 s' b: m1 f  O+ J' l
纠删码是通过创建erasure类型的Ceph池实现的。这些池是基于一个纠删码配置文件进行创建的,在这个配置文件中定义了纠删码的特征值。现在我们将创建一个纠删码配置文件,并根据这个配置文件创建纠删码池。下面的命令将创建一个名为Ecprofile的纠删码配置文件,它定义的特征值是:k=3和m=2,两者分别表示数据块和校验块的数量。所以,每一个存储在纠删码池中的对象都将分为3(即k)个数据块,和2(即m)个额外添加的校验块,一共有5个块(k+m)。最后,这5(即k+m)个块将分布在不同故障区域中的OSD上。; k$ [4 z  y0 F0 l6 L8 M
1、创建纠删码配置文件:- K$ \5 O, v% {$ Q7 j8 |: e
# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2
' F# r' d, D8 @+ q9 _  H' e" n& D9 R9 l2、查看配置文件7 T- Y" R& \$ s( N/ L2 e
# ceph osd erasure-code-profile ls  K) T; R, K4 u) C) e
Ecprofile1 E/ O- Y& b3 _& C/ X4 O1 n
default3 g9 w: O' j5 g1 i, V
# ceph osd erasure-code-profile get Ecprofile
! ]- Z) y" M6 s  O4 B6 {crush-device-class=
# @* s9 i/ F( N9 h% s% `1 _0 ^, dcrush-failure-domain=osd
2 w; @3 o6 Z3 M7 M1 }4 k- Hcrush-root=default
+ j) @4 E( J  r2 `3 vjerasure-per-chunk-alignment=false1 N$ N$ |7 c8 Z4 K1 N
k=3
0 y. C7 v  R4 y! B4 \) Km=2
! K: [# \8 B' J, F/ Y4 Z7 S* m- A* pplugin=jerasure
5 F# b+ E$ y) `; qtechnique=reed_sol_van! I0 R1 p5 y2 ~2 D, |
w=8
) a) D  t4 F% h+ }+ s我们顺便也看Ceph默认的配置文件2 n( e' @( A3 O/ H5 S7 b1 o) y" Y' Q2 Z
# ceph osd erasure-code-profile get default$ n! b3 L" S+ P2 `" J4 V
k=2
' [9 J3 {. O3 E6 N9 a& x; Rm=1' s; ^; f! B- i# i7 t- ^( ~
plugin=jerasure# |$ ^' Q, c1 v8 h0 g
technique=reed_sol_van
- Q0 f9 s* k, z  t( \# H, X# E3、基于上一步生成的纠删码配置文件新建一个erasure类型的Ceph池:
8 h: u9 V/ Y. Q; d# ceph osd pool create testcpool 16 16 erasureEcprofile; [: X+ j, I% l- |7 c
pool 'testcpool' created
/ o" L! h" q; x# f/ J4、检查新创建的池的状态,你会发现池的大小是5(k+m),也就是说,erasure大小是5。因此,数据将被写入五个不同的OSD中:; @8 y0 K; b) j# d2 J
# ceph osd dump | grep testcpool. P: f  ?- v+ ^+ C, S
pool 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 122883 ?- Y) {  i: w, k3 H
5、现在我们创建个文件放到纠删码池中。8 }' u1 g9 L% z. g3 p2 n$ w3 _
# echo test > test
# q5 H3 K: w3 f+ \3 Y2 h9 o# ceph osd pool ls
5 q9 `3 \+ \1 z+ itestcpool
7 R# @$ z# m" _6 A7 ~  g! l# rados put -p testcpool object1 test2 z' x& r  {4 y! I8 h* A
# rados -p testcpool ls) ~' ^' A' W+ S  d) G: Q
object1
1 L  Z( H& n* ]7 j. f  ~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。9 n( f6 Z7 S3 v. g1 U
# ceph osd map testcpool object1
% r  D7 c3 L+ Sosdmap 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)
& G( T+ [/ z& R! C7 e. W1 u, A
3 X: _) ?4 t1 C三、纠删码测试
/ T& Z0 q7 V4 y$ H& u1、我们先来关闭一个osd
. }" n1 R6 `# \* d9 |! j5 p# systemctl stop ceph-osd@3  m& n7 y& F% I4 e4 r% Q: d
停止osd.3,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.3变成NONE了,这意味着osd.3在这个池是不可用的:' S  V) N+ _0 O6 `" c% C
# ceph osd map testcpool object19 N5 [9 U5 Z' l9 j$ W. n9 I7 T
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)
. k+ b1 r8 T- j2、我们再来关闭一个osd
/ z# n% d  r$ k4 r; M# systemctl stop ceph-osd@5
4 |- a' O4 H+ P1 G0 v* P8 H停止osd.5,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.5变成NONE了,这意味着osd.5在这个池是不可用的:
) o) P8 z) o# J6 v# V  j# ceph osd map testcpool object12 n" m) \2 q. z, N
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)
( w6 T, F4 {7 C$ E5 w0 m3、我们从纠删码池中下载文件8 P- m3 f4 k/ ]1 y7 A: _
## rados get -p testcpool object1 /tmp/devops5 T$ ]' [* Y! e/ v2 b, l
7 N+ r* ^( Z0 t) s1 z
$ ]" w5 j' l; L  j) u9 z- |* P" V
/ T7 A7 v0 ]/ z3 U

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:01 | 显示全部楼层
19 纠删码存储池
, |; c; v, @' F8 s/ w( L
' }5 B: Y! K8 P) _, C$ s% e1 n! u, ^$ z/ w/ S
Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。8 ^( J9 @/ D$ `6 H

5 k' L2 L2 A) r" j5 z有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code1 p' ]# q7 ]# d4 j
- ?5 o- X' G" |7 A2 ]/ [  z
有关 EC 存储池相关的存储池值列表,请参考纠删码存储池值。9 v7 C5 w3 _, ^. }( J
19.1 纠删码存储池的先决条件' L5 N2 Z" s9 {# {* k) D6 S

3 W' q* C6 X6 O, x3 \# E. W( O% E# B" V; @% A
要使用纠删码,您需要:
" s4 L0 B) v+ k2 B1 U0 c9 n# V" _. G1 u  A
    在 CRUSH 索引中定义纠删码规则。
3 I+ \# U+ d( b/ [
1 `# m* x2 D8 q' O+ ~4 U5 z    定义指定要使用的编码算法的纠删码配置。& G3 ]' z/ ^0 I2 q- r
0 S, g- a' p% A9 k+ p" I! w) V
    创建使用上述规则和配置的存储池。 : A, v# O' w1 O( }% r! r
% U" p) i1 h( ]% X0 v
请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。5 x% N9 g1 n8 z3 e

9 e3 Q7 x1 K( Q  f/ b+ F确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 17.3.2 节 “firstn 和 indep”。0 m; {4 Z$ J; O9 j3 S
19.2 创建示例纠删码存储池
2 E' k) b5 N5 e: ^9 f
' [& L0 e# G/ X% T, _8 c: @
  J5 r; p$ G% `' c最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。
) w/ D  S, s$ t: d& k4 n$ }2 m+ h& F7 C# i. e1 L
    命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。
  y4 s" W$ f! o+ F7 [$ S0 h# V- y+ q' _
    cephuser@adm > ceph osd pool create ecpool 12 12 erasure
  G, {3 {8 o) p3 H    pool 'ecpool' created. q" g' o6 i+ U0 \7 J
3 p4 \& T7 a; Q
字符串 ABCDEFGHI 将写入名为 NYAN 的对象。
8 M- S& B, F8 J. \. ~8 z8 ^+ E8 G* f
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
' k) z, T, z; ~7 _+ m4 }- i. `1 u1 i' A* b; B, G( j% @
为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。
( n& E9 [" X. t; m2 v. ^7 @# H8 a, D  }1 S; q
要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。
9 @5 F" k# D% W% B
% Y( Q% u3 |# tcephuser@adm > rados --pool ecpool get NYAN -
7 b7 {  o; s% x2 C3 UABCDEFGHI
- ~  s* q4 p. }5 t" S
: A: c9 Z2 F5 i" W+ B" d) z19.3 纠删码配置; d. S0 p- e) {( W' [! S: T3 H/ q
; _' o8 L5 E% L, V) y- l

, ?, X  d7 m  y: R1 Z; L4 n调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。
2 z5 O! u: W, P
3 F! `2 V/ r: P+ ?, R纠删池配置所需的定义:7 D' [& _8 Q. k% x* Y7 r5 `

3 D  T7 j8 g  t- k2 d$ k: l' }chunk
" V) a0 u$ [5 A% N- `: J( A
& A! Y/ M6 U5 C' b/ C5 l    如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。 + q+ k7 V+ ~! Q8 r+ U
k% C4 _0 P- o) r" w

7 i/ v3 F5 {9 I( M  ?( h    数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。 ' ~( d6 p) s' H  B6 B
m
$ ]6 T- _( v) u; p' o( {* W2 U- Y+ z# u
2 V. t1 p1 A0 e- }    编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。
0 o* W& _8 ^9 o" i; H1 wcrush-failure-domain
. J/ R$ X0 N3 w4 T; k- g7 o* `1 C2 a6 \/ ?5 n+ V8 }3 `: Y3 R
    定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 17.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。
- O; j7 }& ^: l: X; O+ @% Y
$ Y) [# _$ W1 z" A使用第 19.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。  Q) T/ f. ^4 A. m! z. y( C

: ?. ^( o2 y4 I' r可使用以下命令显示默认配置的设置:% w! h5 _4 f: `  p! D

( `( k' E" P- w& F, T: w6 e) u1 ccephuser@adm > ceph osd erasure-code-profile get default" E! ~  W  D2 E3 A& @9 T
directory=.libs! B' `1 m' Y9 u3 _
k=2" q& Y1 r. F' X
m=1
- C, e) z9 \5 a; |4 e7 fplugin=jerasure
1 k. |2 s3 e' h6 V* Dcrush-failure-domain=host
, [! l1 h3 A8 Q0 w5 @- rtechnique=reed_sol_van5 O- V6 @4 O: M. ]
( ?6 g3 x* ?) U4 j5 H6 S
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 18.6 节 “存储池迁移”)。# _" E! d. V+ n, h- `2 A5 E
2 o5 U3 O0 c. }' s% }. ], y' V9 q
最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:. w' z( b% D# W$ a

, A, u# M, d8 @7 Jcephuser@adm > ceph osd erasure-code-profile set myprofile \$ x* U& e) q. N
   k=3 \( P9 S4 v8 ^0 c& C5 S( P/ Y
   m=2 \/ s9 [. w/ p' {1 K# }* ?2 |1 J
   crush-failure-domain=rack
' g# ^. M6 D6 Z; N- x/ t* K7 F* i( O2 z4 i4 f: {
对于此新配置,可以重复第 19.2 节 “创建示例纠删码存储池”中的示例:
7 X$ X* R- G* E! n+ `( q0 B* r6 Z0 t. }4 ~) y
cephuser@adm > ceph osd pool create ecpool 12 12 erasure myprofile$ @! m% J; F3 u
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -+ ]+ t+ G) g1 ?. I6 m
cephuser@adm > rados --pool ecpool get NYAN -
- D$ r. _4 `& v- `6 T5 KABCDEFGHI5 a& F; k. `) o: F
" d0 W3 [$ }" H4 c2 f
NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。+ P5 |, K( W. h/ H0 a% q6 i
#1: 纠删码配置: U, j6 E. d8 m2 o: ~0 ?
19.3.1 创建新纠删码配置" x- {: R6 S) c0 t
8 E  r7 S7 Q% G( P1 D2 ]7 y

0 u7 |1 {/ t- t- x+ B. N, k7 W+ t以下命令可创建新纠删码配置:
$ I) m* B) ]2 f1 a& d% ]# Z
* D# H2 T2 z- R9 froot # ceph osd erasure-code-profile set NAME \
8 K1 h; F, S' F0 D! d; l' D directory=DIRECTORY \
7 v) d, e+ C: u0 U! I/ k plugin=PLUGIN \
2 ?6 Y; s1 P) f6 E9 Q, f3 u; F stripe_unit=STRIPE_UNIT \8 M2 {4 o! A+ O0 m) q# f% a6 \
KEY=VALUE ... \
5 [0 B7 w+ d5 Y( M$ u/ B  I# [ --force
- u( F8 h: r8 D! y3 B0 S
3 i2 o/ `3 y5 H  \& lDIRECTORY
+ t, V" k5 Z# f; B$ C! _, @  E8 Z2 q
    可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。 4 R. K0 Q; i' Q% B
PLUGIN
3 {( X7 n$ T' K+ N1 H; L3 k( ^$ O2 t0 }
    可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。 0 k$ i; I( B& \: ~5 w
STRIPE_UNIT- q) S% X; T( ~

+ k: g# G3 f  m" N    可选。数据块中每个条带的数据量。例如,如果配置拥有 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”。
# q2 U9 c0 n* b# T5 C) y9 _KEY=VALUE) M8 B: ^( s3 Q9 J$ K- o+ p

8 |1 M7 P: I5 {4 U% K- C) z    专用于选定纠删码插件的选项键/值对。
% S1 I5 D9 T" Q( x% Y--force2 y9 D$ D( U" R% @
# R( t4 n; u5 H' W7 I
    可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。 2 D8 a# j1 \1 p

! K. a6 D+ F3 F( N( T- J19.3.2 删除纠删码配置# h1 E2 U$ J' v

4 j" B/ H# N: a5 m* N: Z4 K- A7 Y% K6 ?- |8 P4 G. V7 G3 J7 X
以下命令可按 NAME 所标识的纠删码配置删除相应配置:
% ^4 E( s+ l; v3 L1 t7 U% W* C2 q5 |
% D& l# V  m, Q; S1 q1 P, Troot # ceph osd erasure-code-profile rm NAME
7 X% L1 E1 D, w4 C* k
& L  j' @2 l0 w- [2 X重要重要
) T& Y. H. ]% J  A5 I" w% H7 n/ _- l7 K
如果某个存储池引用了该配置,则删除将会失败。, ?- O! o$ w! o2 n* s* ^
19.3.3 显示纠删码配置的详细信息
/ U5 m8 a; a" L+ a; ^' a( s
4 n" T- F# T' M( s6 o$ Y
. u  L2 D# c7 d以下命令可按 NAME 所标识的纠删码配置显示其详细信息:. o4 z( _) ~5 Z

3 D; h  Q$ {! \root # ceph osd erasure-code-profile get NAME
! n; b& s3 ]+ }* F% _4 n; d. s0 O, [" A, a& Y; v. H5 m
19.3.4 列出纠删码配置% g7 [6 G/ ^4 [  D

% N" A- I7 Z3 |( K" c. X2 ^& A3 ^& ~
以下命令可列出所有纠删码配置的名称:
8 ~7 C; O; w8 O3 r; p/ n1 \' h( Z: f! y# {
root # ceph osd erasure-code-profile ls
3 [$ d4 ]7 b* F( k4 A' C; I' E$ K9 b( _" t* s% ]
19.4 标记含 RADOS 块设备的纠删码存储池7 O5 ]# D! z7 Q

9 u; E6 J1 F" R' |% c+ [( e# |5 b* I1 y0 g: k) g! m4 J
要将 EC 池标记为 RBD 池,请对其进行相应标记:( H- u( \; w, R2 u& L

1 }% k9 V: G& w1 f8 T, E- hcephuser@adm > ceph osd pool application enable rbd ec_pool_name
( O/ D6 L( x: ~& ~  X- a7 ~9 ^& ], y9 ?
( U3 O7 Q( n; r- J* e0 x5 K( y2 O, R, ZRBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:6 g6 l2 m2 E" W+ e3 Q9 S$ i( N

3 J% l" G0 p3 L  l  w  l+ Hcephuser@adm > rbd create rbd/image_name --size 1T --data-pool ec_pool_name
6 t$ D8 ^3 U' A0 a& u1 c
# B6 \2 H" @; t您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:02 | 显示全部楼层
在 OpenStack 中使用 Ceph 纠删码(Erasure Coding, EC)池,通常涉及到以下几个步骤:
0 ^/ Y( ~9 _) Q# a" u2 ^1. 配置 Ceph 集群以支持纠删码
2 O# s: h7 \/ w3 C. S! j
$ g. T, A( g- z/ B9 D首先,确保你的 Ceph 集群已经配置并支持纠删码。这通常涉及到以下几个步骤:$ j0 {  E# a1 X8 S' \& v2 Q% m/ h
a. 创建纠删码池6 V8 E7 h, V2 b9 {' y

) z, q0 S0 r; C5 V在 Ceph 中,你可以创建一个使用纠删码的池。例如,使用 jerasure 和 reed_sol_van 算法创建一个纠删码池:2 {0 _* f8 Q' q  G
3 j4 X" w0 Z& R1 e, ~* d0 u- e
ceph osd pool create ec_pool 64 64 erasure code_profile ec_profile
- S! k; j6 E* J: E9 oceph osd erasure-code-profile set ec_profile jerasure yel error_domain=1 k=8 m=2 ruleset-failure-domain=host crush-root=default
7 D) C, f4 L( Y3 y& W
( `* q# A4 t* R; P) l这里,k=8 表示数据块数量,m=2 表示校验块数量,error_domain=1 表示每个主机最多有一个故障域。
/ H+ |2 |/ }" ib. 验证池配置0 Z7 M: I0 {3 i8 M0 h

- M" a- B; i& R5 x1 e% W确认池已正确配置为纠删码:) I9 T9 ^$ _7 Q4 [9 z  ]& T' R
2 H( m* t6 @3 E: d
ceph osd pool get ec_pool erasure_code_profile+ d6 e% a2 N5 l: ~
! Q* N0 j, R1 d/ Z  \1 }% g
2. 在 OpenStack 中配置 Ceph 和使用纠删码池$ {3 x" T  b. I" ^8 z8 ]7 ]

% `+ @1 F+ M% V, f* z8 d( p在 OpenStack 中使用 Ceph 纠删码池,你需要在 Cinder 和 Nova 中配置 Ceph 以使用这个新的池。
, z2 C1 K, X; D6 M4 c# H) G" Na. 修改 Cinder 配置文件
( r( `/ R2 z! Q; n
+ D. o6 c, v5 M8 G编辑 Cinder 的配置文件(通常是 /etc/cinder/cinder.conf),并添加或修改以下设置:1 E# U4 }; }5 ?7 g8 o3 d9 g
' ]) u0 p& i' A( j: a9 k3 G6 h
[cinder]4 J' W- z4 D* k1 [. D$ }
volume_driver = cinder.volume.drivers.rbd.RBDDriver
/ z1 P  a# N, f4 Orbd_pool = ec_pool
1 ]0 y7 V& ?1 c3 N0 @% ~; U0 {* u8 Jrbd_user = cinder-user
% b3 d  E7 K& s( m3 |1 g1 c0 X, ]+ erbd_secret_uuid = <secret-uuid>4 J- G/ w4 q1 h
; N3 V" H" S* A9 H( I
确保 rbd_secret_uuid 是你的 Ceph 认证密钥的 UUID。你可以使用以下命令生成 UUID:
9 }4 N+ _: T0 j7 ~# f/ }+ E7 Z& E& p% [: C0 S
uuidgen, S/ Y) F% |! c3 q  x0 x

" q$ W) e! w0 ~/ m, n% H- g3 V0 Nb. 配置 Ceph 认证密钥* w; M* X( r$ _
* \4 {! u& ^- L9 C
生成 Ceph 认证密钥并将其添加到 Cinder 和 Nova 的配置中:2 p% |" B1 b& W9 I: r) A
+ n# l- Y! j% n, d( c
ceph auth get-key client.cinder-user | base64' |5 l$ {+ E# s: A

3 ~- p$ S/ `; H6 J4 s& T将输出添加到 Cinder 和 Nova 的配置文件中:
5 D' K) u0 Z! {) P' S
  m+ o% {5 M3 {, M1 w[DEFAULT]; C7 c4 T4 ^) k1 h" \% L
rbd_secret_uuid = <secret-uuid> from uuidgen
  @0 h; j/ I* l  D. g: z9 `' |rbd_user = cinder-user7 A3 W7 T) U! i4 p
rbd_ceph_conf = /etc/ceph/ceph.conf) T0 B( G* R5 c! S
; |3 \3 X! _+ a$ \
c. 重启 Cinder 服务以应用更改
! V6 r- J6 a( J8 W$ `. \; |* [8 M) H1 b5 e8 ~" ^+ w/ T! e6 B
systemctl restart openstack-cinder-api openstack-cinder-volume openstack-cinder-scheduler
6 `( F$ b: G2 C
4 ~( v" R% N7 G7 L: D  W) W3. 验证配置
' v8 ]0 K# o* T+ }% N$ B  y( g% ?3 C& `* }9 G. B$ `
确认 Cinder 可以正常使用纠删码池:" `, [( h% r6 M+ I0 n( l

) J* m+ k( Q- k: C! k+ nopenstack volume create --image <image-id> --size 10 <volume-name>
. I3 b9 ]) E; q2 m( D+ B5 D8 b7 i9 E  q5 N3 D
检查卷是否正确创建在 EC 池中:
* a' Z% s  K6 {' C$ ~( `1 ?) h& I7 ^4 a- m
rbd ls -p ec_pool --id cinder-user --keyfile=/etc/ceph/ceph.client.cinder-user.keyring | grep <volume-name>5 k3 P2 [: ~6 M* @4 O

4 I- u6 ?+ c( ~% s: j, p4. 在 Nova 中使用 Ceph 块存储(可选)& N% \# j! F. F. D

  O. H0 c. r6 Y8 s2 A  m# S) Z9 ^如果需要在 Nova 中使用 Ceph 块存储,确保 Nova 的配置也指向正确的 Ceph 用户和密钥。这通常涉及到编辑 /etc/nova/nova.conf 并添加类似的 RBD 设置。2 p2 e7 U7 a" h- O
5. 重启相关服务(如果需要)  A- y: w% K+ ]9 X1 x2 V3 h' o+ E
6 b' A' \) X  E5 T6 K7 I/ |* I
根据需要重启 Nova 服务:
+ s; k  I5 z0 g" W7 N% ?- B  m9 ~6 u# }
systemctl restart openstack-nova-compute openstack-nova-api openstack-nova-scheduler openstack-nova-conductor
" f; c4 l9 t' r$ o7 y+ g9 e/ F' G# a. \, B) W+ j( a
通过以上步骤,你应该能够在 OpenStack 中成功配置和使用 Ceph 的纠删码池
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 21:58 , Processed in 0.021301 second(s), 21 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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