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

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

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2025-3-28 10:00:00 | 显示全部楼层 |阅读模式
一、纠删码原理3 `. P+ [& V1 p% }, s
纠删码(Erasure Coding,EC)是一种编码容错技术,最早是在通信行业解决部分数据在传输中的损耗问题。其基本原理就是把传输的信号分段,加入一定的校验再让各段间发生相互关联,即使在传输过程中丢失部分信号,接收端仍然能通过算法将完整的信息计算出来。在数据存储中,纠删码将数据分割成片段,把冗余数据块扩展和编码,并将其存储在不同的位置,比如磁盘、存储节点或者其他地理位置。如果需要严格区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删3种类型。
  k" }/ ?& n$ G/ ~! E3 }·检错码仅具备识别错码功能而无纠正错码功能。
$ n+ O: S7 k( B1 T/ Y+ w) A5 Y# U, T·纠错码不仅具备识别错码功能,同时具备纠正错码功能。
6 m0 t) s8 s5 |% k" d/ h5 p·纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除。- |* a; z* d: r3 \, P3 g
从纠删码基本的形态看,它是k个数据块+m个校验块的结构,其中k和m值可以按照一定的规则设定,可以用公式:n=k+m来表示。变量k代表原始数据或符号的值。变量m代表故障后添加的提供保护的额外或冗余符号的值。变量n代表纠删码过程后创建的符号的总值。当小于m个存储块(数据块或校验块)损坏的情况下,整体数据块可以通过计算剩余存储块上的数据得到,整体数据不会丢失。
' T+ w; J0 z/ C" F5 W下面以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上面,完成对这个对象的存储操作。如图所示。6 R( n+ f4 I) R- b
下面再看一下如何使用纠删码读取数据,同样还是以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),最终将该结果返回给客户端。整个过程如图所示。
1 z9 |5 w/ g# ?8 g0 Q虽然纠删码能够提供和副本相近的数据可靠性,并降低冗余数据的开销,整体上能提高存储设备的可用空间。但是,纠删码所带来的额外开销主要是大量计算和网络高负载,优点同时伴随缺点。特别是在一个硬盘出现故障的情况下,重建数据非常耗费CPU资源,而且计算一个数据块时需要读出大量数据并通过网络传输。相比副本数据恢复,纠删码数据恢复时给网络带来巨大的负担。因此,使用纠删码对硬件的设备性能是一个较大的考验,这点需要注意。另外,需要注意的是,使用纠删码所建立的存储资源池无法新建RBD块设备。+ W  q! X$ |* n2 y0 F
Ceph安装后默认有Default Rule,这个Rule默认是在Host层级进行三副本读写。副本技术带来的优点是高可靠性、优异的读写性能和快速的副本恢复。然而,副本技术带来的成本压力是较高的,特别是三副本数据情景下,每TB数据的成本是硬盘裸容量3倍以上(包括节点CPU和内存均摊开销)。纠删码具备与副本相近的高可用特性,而且降低了冗余数据的开销,同时带来了大量计算和网络高负载。3 x6 R3 C9 N8 X3 c7 ]/ u. I; R) g+ T
  Z8 n9 J8 a* H
& P1 X% |3 H2 I$ }2 d0 y; c
二、纠删码实践, g3 K2 o$ k# z; T
纠删码是通过创建erasure类型的Ceph池实现的。这些池是基于一个纠删码配置文件进行创建的,在这个配置文件中定义了纠删码的特征值。现在我们将创建一个纠删码配置文件,并根据这个配置文件创建纠删码池。下面的命令将创建一个名为Ecprofile的纠删码配置文件,它定义的特征值是:k=3和m=2,两者分别表示数据块和校验块的数量。所以,每一个存储在纠删码池中的对象都将分为3(即k)个数据块,和2(即m)个额外添加的校验块,一共有5个块(k+m)。最后,这5(即k+m)个块将分布在不同故障区域中的OSD上。9 G) r) U- ], ~- N6 Z; H
1、创建纠删码配置文件:
6 |. Z+ y0 }; T; [: }9 @. h' F# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2
& z: X" P- m2 O, [9 x' Y2 f, }2、查看配置文件: Z6 B0 d$ o" `& Y
# ceph osd erasure-code-profile ls
0 m! s; m/ W; z) Q% KEcprofile
  ~4 B! k& p) D4 Pdefault
$ v3 I6 o# V! M* b# ceph osd erasure-code-profile get Ecprofile
0 Y/ B. h% m' ~$ ~! F9 scrush-device-class=
( d# S  u; P& n) l, B. j" y& Hcrush-failure-domain=osd
$ e0 B, r" Q* l6 d0 M6 Acrush-root=default( x0 a1 A: q6 G) x* m
jerasure-per-chunk-alignment=false
" N$ g8 Q8 U9 F$ T& G. S& ?+ Dk=3/ J7 T- @9 f  R
m=21 p  g1 Q. k" o( i/ |
plugin=jerasure3 K2 F5 v: I3 C6 t8 W0 x
technique=reed_sol_van
! w1 H3 M7 d: w3 q" g# n  lw=81 V) _5 Z2 O2 \  {9 z
我们顺便也看Ceph默认的配置文件1 v2 s* h* [. K# c: Y. X4 b
# ceph osd erasure-code-profile get default5 U- k( y% |) Z2 k) h" O
k=2
2 v" {" B3 h' P1 }4 t* e( gm=1" p- s% V! H# h. ~4 F: J2 s: Y
plugin=jerasure" P3 s: N: h; t( i
technique=reed_sol_van$ Y# D2 m8 ?' N+ X% l& ^$ Q
3、基于上一步生成的纠删码配置文件新建一个erasure类型的Ceph池:( g% k% q( s8 R: N& \( v8 j* \, p1 l
# ceph osd pool create testcpool 16 16 erasureEcprofile0 ~6 Q5 S3 F& q9 Q: R
pool 'testcpool' created# ^/ ^, C- F$ Z$ b
4、检查新创建的池的状态,你会发现池的大小是5(k+m),也就是说,erasure大小是5。因此,数据将被写入五个不同的OSD中:
  o/ b8 ]. b1 ?1 L+ G4 f8 M6 R# ceph osd dump | grep testcpool' F' O0 @, f, u/ ~/ P5 C
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 12288( ]7 B2 ]5 X( h# ]1 f5 g& W/ I
5、现在我们创建个文件放到纠删码池中。$ E# n' z' Z# w7 R
# echo test > test
) p  }& n/ t) `9 j/ n& `' N# ceph osd pool ls
6 F8 h" S* f$ O5 m$ `. @$ ~testcpool9 K5 U! \+ h" M3 u$ R: l/ p5 J( p
# rados put -p testcpool object1 test3 i7 n( _3 t% g' K
# rados -p testcpool ls
; R0 `: F& [7 T! `9 Aobject1. F0 s- }3 y" d" R
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。
, C/ B6 i# u6 T) l# ceph osd map testcpool object1; E. q. W. |% G- V# F
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)0 ^; v1 `0 G. K3 m) q/ P. O" l
: l, l! m4 Y1 K- f* k
三、纠删码测试
; _8 D8 q! A8 z  d7 @* r7 z0 W1、我们先来关闭一个osd
$ e) F* M8 }/ n  n# r. J# systemctl stop ceph-osd@3( j5 {) K; l7 K9 Z) }: ]8 T2 X3 m* V
停止osd.3,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.3变成NONE了,这意味着osd.3在这个池是不可用的:: {) D- p0 N8 ^5 V" U
# ceph osd map testcpool object1- b5 C" A  N9 S0 K7 s6 r
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)
% m( D# J6 d( J3 F: B/ E+ h2、我们再来关闭一个osd1 Z- [) L1 i( [: q
# systemctl stop ceph-osd@5
# i& U+ |& r, q5 E停止osd.5,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.5变成NONE了,这意味着osd.5在这个池是不可用的:
$ d7 K/ X# Z) r5 B2 d- R  _7 O# ceph osd map testcpool object1
. U$ U# x: x4 t, o$ ]( d, ~" Wosdmap 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)) t- r  T# s: a, w6 a
3、我们从纠删码池中下载文件
& T# K3 f- }: V% q5 E2 m## rados get -p testcpool object1 /tmp/devops
6 O+ U9 o1 m5 ]
; g& D! F- j: g$ U0 ^5 f6 V* u) s( `. K/ b. B
' g+ J# F5 @; f- b9 Y% z, t4 |

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:01 | 显示全部楼层
19 纠删码存储池
* N+ f! O. U) s1 e2 P
. d) w/ z  o7 I# A: G' e  S4 s9 H! [, V* p1 T
Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。* z: T, X: S* W3 @, f6 v& ]% h2 H

. a8 i# Q. I% @0 z有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code/ e) t& O! ]* d& t6 L

. v) V  p; T+ s) t. J. D' z- e有关 EC 存储池相关的存储池值列表,请参考纠删码存储池值。$ J; ?2 A# R7 L: d9 U6 d% j
19.1 纠删码存储池的先决条件
0 X& b! u$ ]+ ~/ ~* z3 r 1 F3 V% V+ S5 Z" Q- N
8 t/ j8 G( U: D
要使用纠删码,您需要:( K) z6 H$ b+ R* _7 _
, o, X$ p1 G1 [6 S0 N
    在 CRUSH 索引中定义纠删码规则。
5 x3 J3 D0 _2 M& c0 T# u  Z* t* L6 p$ Z1 L" l( v! L6 `
    定义指定要使用的编码算法的纠删码配置。
* ^  l8 A/ W8 Q" T1 w" U8 M) v* T/ C0 e. F" b, H& _
    创建使用上述规则和配置的存储池。 $ h0 l9 L) _+ ^- _" X8 G+ S
  N3 S7 V) ]" Q* ?0 p: ~% |: Z
请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。8 y" Z1 G/ c4 U% q2 Q% T4 b

" h* ~3 f* v0 j- q2 z2 _确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 17.3.2 节 “firstn 和 indep”。& c# I: y! n4 H; ~  Q- h
19.2 创建示例纠删码存储池: A1 X3 ^- g* s+ w" @2 W8 M

/ f  Q) l  h6 |4 z' _, C! f
+ j9 C5 Q+ Q& J3 U# `" H+ C最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。
2 U* d) t+ Y8 R* v
/ e$ F2 ?' u) E. I% Y    命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。  z- Y# Q" f8 L" Y. I: w
4 L) `6 C0 x9 K4 u2 n# S
    cephuser@adm > ceph osd pool create ecpool 12 12 erasure* s5 S8 L" I" z# \! k" Y
    pool 'ecpool' created
" Y3 h. G, l; R: v7 r9 @$ [4 X
& z5 K3 E2 s# z; p1 [" X字符串 ABCDEFGHI 将写入名为 NYAN 的对象。8 z9 F5 ~+ [0 e' L6 h3 R, b

6 `/ q# P7 T% R7 M+ h0 r) Ocephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
" {" q* b6 m+ x! B+ z$ v7 C" w7 u: o  s, R; z5 ]6 {
为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。' Z: S, k" V& ]5 o# q
1 j0 r% h! B' ]
要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。- W2 m+ l" v) u* s" I

1 t; H# b7 P* k2 {cephuser@adm > rados --pool ecpool get NYAN -9 }$ n6 P; ~1 I) h& X
ABCDEFGHI
* Y8 q6 a4 L" A* B( R! j
2 G( E" U5 _" V3 k* I( v3 E19.3 纠删码配置) J1 q. y9 P5 b4 [6 G# i5 }) y% u

; x+ X8 \7 q8 X3 A! a! ?* m% S0 m2 h* y6 w7 a2 p, y: F4 j/ k$ e
调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。9 {% Z. n  d( ~8 m0 \( c
/ g1 |. h/ H$ p. P$ H
纠删池配置所需的定义:
6 r+ I( A  f1 N) G# O, t( z" u, f6 T$ A8 ^1 P1 f- a
chunk& e& p1 I4 x: ~  Z" X

! }3 n% v4 M0 a4 B4 t/ Y9 G; k    如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。 0 i0 q4 t1 N1 ^" W  p
k
$ Q' r; [7 ^( O: M( K
$ _; Y  N) h$ b" @1 T    数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。 & e* n! ?! X* D, Z. W
m
  e# n: c: ^& N; g: N
) F* @" `& d3 J* g" n4 u    编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。 * i9 N/ T1 B1 m
crush-failure-domain- V' t( x* a/ ^7 U9 M4 c

% J# K( A& F( ?4 d  w. n    定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 17.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。 5 S6 x8 R  G6 ~$ I+ P* H1 D! }
2 e: X1 ?. }" J5 z& Y% E
使用第 19.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。
2 {4 [% S( g" N/ u3 s* V1 d* B
( {+ _8 Z" J% v' i. O+ W0 y4 O可使用以下命令显示默认配置的设置:
' F! a9 N; g  ?; i
8 l7 X8 I* c  O- s5 J4 k  qcephuser@adm > ceph osd erasure-code-profile get default
. ~; j: r8 V, w* ?9 Edirectory=.libs
  U$ z# \  S* k% gk=2
& U$ T; T$ p. z8 N! ^/ `m=1. Z  a! R* o/ k' J
plugin=jerasure- k- A' V. U+ ^/ D/ U
crush-failure-domain=host# L) R8 ]' {7 s7 D
technique=reed_sol_van5 K4 H0 Y. N9 U' R
. q; z$ B6 F0 a$ c$ R
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 18.6 节 “存储池迁移”)。
+ N1 m0 v5 @$ B1 w0 O7 S
. T' q6 b# @& o- e/ I# J# r5 @& a/ `最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:
& p3 Z( V$ a$ T* X7 ]; Y: i4 v: M5 @2 M
cephuser@adm > ceph osd erasure-code-profile set myprofile \  f0 y/ r2 X; H. s1 Q4 Y/ V
   k=3 \9 |& R1 K& j! f: a8 A; i
   m=2 \  L# s$ P8 ^  e4 R( ~3 ?
   crush-failure-domain=rack# e5 V3 m1 T, G# p3 g0 d

; _! ]) V3 n5 W对于此新配置,可以重复第 19.2 节 “创建示例纠删码存储池”中的示例:. F8 n: {2 F; r) y! u: S0 E2 I

' J5 @7 k1 d* k% o& tcephuser@adm > ceph osd pool create ecpool 12 12 erasure myprofile+ d8 y& N8 q" h5 R; a; [1 L1 y8 h) H* E
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
$ _, [1 _1 U$ A( M9 Ncephuser@adm > rados --pool ecpool get NYAN -# s! r, n2 u) ^5 U6 i  J- b
ABCDEFGHI
$ ?* E& \8 [8 i8 d- N9 O
) G9 X+ S: F. V* H% ]1 @' A3 XNYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。% C  e8 Z9 i. ?( q/ Z
#1: 纠删码配置
5 ^" y7 Z3 Q" V9 S% F19.3.1 创建新纠删码配置
: p5 E" l4 @: N/ U! U9 g
6 G- l2 c- G2 O7 I3 M
# r+ e2 P, f+ o以下命令可创建新纠删码配置:
! S& N9 a  }  F5 q* k* ]1 y: D8 i6 o$ g, x( ~
root # ceph osd erasure-code-profile set NAME \
6 r) R+ ]( Z& U2 @. c directory=DIRECTORY \
. V9 b. E8 {- y3 x- f plugin=PLUGIN \
" a8 L1 x' S5 a, A% d stripe_unit=STRIPE_UNIT \% X+ F& X! @9 N( N) \' m
KEY=VALUE ... \+ H) T+ v. A; D) ~" D  {
--force
- K# L; F- @3 a2 h  k+ S
" p7 v0 E! v+ i7 WDIRECTORY
* A: M" ^% t" I- _
+ a% z0 e0 x: ]! @2 m    可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。
3 C/ B/ X& h) p+ t& w# gPLUGIN6 D) Q0 b) b, l. Y, }1 r! J

: L4 t0 ?3 M/ Q, ^& C" p    可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。 8 ^. b4 k# d6 d8 P) h( I5 A
STRIPE_UNIT+ k+ f' E; I% B6 M/ \/ g

* g1 q& f9 c- n- u# c2 G    可选。数据块中每个条带的数据量。例如,如果配置拥有 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”。
- R) N5 w0 s- m6 T* HKEY=VALUE! E5 P: O& H. x/ k
/ ]  ^; `* F; u! `% x, [5 j
    专用于选定纠删码插件的选项键/值对。
2 q' p6 w; c: m" \, h5 x# X% u; I--force1 A6 `% w% U2 K7 `' x
8 a& U  F  g; |/ ^
    可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。 4 g1 Z/ A0 v9 B; t- O

5 ~5 I; W' n$ s& T) g! r: w: Q19.3.2 删除纠删码配置
$ S0 d: ^6 [; G, p" M5 c " x) ?8 b3 n1 L6 r. P0 Z- `1 A

! ^2 u  J7 b1 I/ @  i7 t6 U" l以下命令可按 NAME 所标识的纠删码配置删除相应配置:
. T* {' \" b# O- b! b. V, L# E; I$ H) V
root # ceph osd erasure-code-profile rm NAME
* Y, B) b8 V0 }  i! d1 k3 o0 |& q0 {9 k+ l- u  q
重要重要3 ^  ^& Y3 n3 L. E# Q7 u

1 @# Z! O) I2 E* ]如果某个存储池引用了该配置,则删除将会失败。* }; i$ K3 D8 T0 z0 v: p
19.3.3 显示纠删码配置的详细信息
: @2 }  W$ T; L- Q7 X* @& `6 p1 @ 4 a$ X  _! c0 S* S' t
5 P8 G8 m9 ^) W. T, s
以下命令可按 NAME 所标识的纠删码配置显示其详细信息:$ P" u9 t0 G$ J! U

: I9 O, A& `. Q. v6 F) Q7 ~root # ceph osd erasure-code-profile get NAME
. C  x0 K, N! S' N: q+ u% z+ H! s2 {" q/ Q
19.3.4 列出纠删码配置- |% e  Z! p& C" X
2 o- i" W' S5 U8 M* E5 g4 B3 k
- i- @0 B! X+ v3 P5 F, i  z9 n  j8 Q
以下命令可列出所有纠删码配置的名称:' N* x# y9 e* I# N
: {, Y% L: N& V- ]( Q  C
root # ceph osd erasure-code-profile ls5 y5 t) J  x: f8 }/ r& Z6 l
  N1 ~0 p+ i9 b( \! O, y+ v1 b7 C
19.4 标记含 RADOS 块设备的纠删码存储池
9 A( b' X9 P6 d5 e ) N0 o& n' k- ]: m6 b, G

' q8 W8 Q3 O  f% ~% F要将 EC 池标记为 RBD 池,请对其进行相应标记:
( P$ D% W; g* H. C4 z1 _4 V# x& E3 O2 g; T
cephuser@adm > ceph osd pool application enable rbd ec_pool_name& ?' `8 {, S& ^9 z

" }! w3 f& d! x- xRBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:
! O0 `0 |& p, e/ c, M& s
, a+ x8 d$ }# ?' }6 @5 Kcephuser@adm > rbd create rbd/image_name --size 1T --data-pool ec_pool_name
3 p) F* G7 ~+ u* o0 n2 D) j) a  c1 z* I% U6 O9 j
您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:02 | 显示全部楼层
在 OpenStack 中使用 Ceph 纠删码(Erasure Coding, EC)池,通常涉及到以下几个步骤:
5 W4 ^$ O9 \, J: M1. 配置 Ceph 集群以支持纠删码
7 J0 X  v/ B& a# `: K& g8 }6 w, |! ]$ j$ e5 ]$ u7 ^! Y" W. w
首先,确保你的 Ceph 集群已经配置并支持纠删码。这通常涉及到以下几个步骤:- O3 N% C# K8 E- e
a. 创建纠删码池) B+ y- L( w  m7 {3 r$ ?- M: E
2 f' J- w0 I& ]* p+ k
在 Ceph 中,你可以创建一个使用纠删码的池。例如,使用 jerasure 和 reed_sol_van 算法创建一个纠删码池:
. e- {$ w, S) ]6 a
0 v/ |7 ^8 A% L1 L2 E. j1 fceph osd pool create ec_pool 64 64 erasure code_profile ec_profile: T. q" a& d( d: d; j- s" ~6 F
ceph osd erasure-code-profile set ec_profile jerasure yel error_domain=1 k=8 m=2 ruleset-failure-domain=host crush-root=default  y1 q8 x3 c8 u1 ?3 @" d
. O6 {, s4 ^5 H) I. l1 t/ O- j% b: v
这里,k=8 表示数据块数量,m=2 表示校验块数量,error_domain=1 表示每个主机最多有一个故障域。7 E, V' \  z! X; n, c2 U% B
b. 验证池配置: h5 i& Y! p( W' _) I+ Z

' i: ^8 i5 `# O% m" O9 Q确认池已正确配置为纠删码:
! }* F: D% r& `7 A, K; U* ^5 k, i
ceph osd pool get ec_pool erasure_code_profile
9 C  u+ e2 F- i! o* O/ R. M
: e" y2 v' l" I4 j2. 在 OpenStack 中配置 Ceph 和使用纠删码池
+ p3 I' g7 l0 p3 ^' }  x% k) W
! |/ m( o# ~3 j7 a4 H. [在 OpenStack 中使用 Ceph 纠删码池,你需要在 Cinder 和 Nova 中配置 Ceph 以使用这个新的池。  `, i8 |# C% \1 q9 |/ o/ F# o6 g
a. 修改 Cinder 配置文件3 x6 x( ^' W/ i1 x! M8 i' s6 C2 F
' a0 F8 \1 l6 a5 Q4 u! T9 V+ \+ c6 i
编辑 Cinder 的配置文件(通常是 /etc/cinder/cinder.conf),并添加或修改以下设置:
& y& k# N- K8 x; z* a* s: o: t; I0 P4 O# c% G
[cinder]
0 ?8 H& U4 P! R  X$ x6 ~volume_driver = cinder.volume.drivers.rbd.RBDDriver- u$ A4 N7 J4 H  h* B1 P
rbd_pool = ec_pool
" Y9 w& @, s) ?# y; orbd_user = cinder-user
+ m2 F6 l# Z+ l0 F" P/ M2 vrbd_secret_uuid = <secret-uuid>
# H2 b  U9 q6 ?* t/ S$ P
4 T& \; X5 B" C& O7 b/ Q* V& d: ]% M确保 rbd_secret_uuid 是你的 Ceph 认证密钥的 UUID。你可以使用以下命令生成 UUID:/ ~) v, f4 _( l- \$ D+ W8 t
- e6 F& d* Z2 y% r, h
uuidgen
" k0 g8 D' Q: G+ q' f
0 t# u' c$ T( P( n, ?3 u" Kb. 配置 Ceph 认证密钥) S! d0 I6 w5 K/ a
3 B2 ~6 Q8 P" C; }- x
生成 Ceph 认证密钥并将其添加到 Cinder 和 Nova 的配置中:" T3 G& i. `9 N' p

% {0 ?5 B  V& D  O$ P/ h# Eceph auth get-key client.cinder-user | base645 H% a' ?9 t4 o' \, c8 P4 j3 R% ^
% ?. z' j, y) C2 {1 g
将输出添加到 Cinder 和 Nova 的配置文件中:
- {8 A1 J* p, n, i. ~' D7 g, x4 Y5 S; Y% e; C
[DEFAULT]7 X" V6 S, n& O7 ]0 b& _
rbd_secret_uuid = <secret-uuid> from uuidgen" f  C# K3 \, [8 Y1 y0 Z, V4 F
rbd_user = cinder-user
3 |2 ^5 }% ~( ?' P) i- Wrbd_ceph_conf = /etc/ceph/ceph.conf
) k1 V3 o' u8 o( y& \; L1 s: G$ W# E0 |
c. 重启 Cinder 服务以应用更改+ N. I* D& S% E- g" ~8 ^2 e
3 X- U/ j3 s7 J3 R3 E8 I0 @/ V
systemctl restart openstack-cinder-api openstack-cinder-volume openstack-cinder-scheduler
1 W# ]! k- g" T. C% I
1 z2 l) Z# S# h  V6 C3. 验证配置# i; M6 c: J( Q$ X

- j+ H1 p) |* P2 o确认 Cinder 可以正常使用纠删码池:! R: Z" {5 S9 X
% P7 g8 U* y# ]) p' |+ I7 y
openstack volume create --image <image-id> --size 10 <volume-name>; o$ m' A9 k' W( G& j

- X. p. F4 u# y6 {检查卷是否正确创建在 EC 池中:1 T+ b- d; f+ U, O% x; c& s

3 t$ Q8 L& g* p- l9 drbd ls -p ec_pool --id cinder-user --keyfile=/etc/ceph/ceph.client.cinder-user.keyring | grep <volume-name>
/ G+ k0 ]  H9 @8 }: ^( S
* Q& Y1 n% A  S5 n6 t* L2 g& I6 Q4. 在 Nova 中使用 Ceph 块存储(可选)- P3 a! ]/ _' Y- z! I
6 b2 \2 a  Y( u1 c. a3 t+ f2 B
如果需要在 Nova 中使用 Ceph 块存储,确保 Nova 的配置也指向正确的 Ceph 用户和密钥。这通常涉及到编辑 /etc/nova/nova.conf 并添加类似的 RBD 设置。! U' W0 S8 q/ n3 X
5. 重启相关服务(如果需要)7 _7 G  A8 x# _, c  ?

0 }& t% B9 ^" Q/ L: i. v' w' y9 G根据需要重启 Nova 服务:7 c0 \$ Q9 c' v% w- B* `

0 F" m* y" T4 Csystemctl restart openstack-nova-compute openstack-nova-api openstack-nova-scheduler openstack-nova-conductor- R% {* p2 p9 C$ B! q) [7 Y

1 e: {5 O2 h8 q7 f2 e通过以上步骤,你应该能够在 OpenStack 中成功配置和使用 Ceph 的纠删码池
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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