易陆发现互联网技术论坛

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

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

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

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

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

x
一、纠删码原理, P' ]" t9 }3 t6 ?4 Y
纠删码(Erasure Coding,EC)是一种编码容错技术,最早是在通信行业解决部分数据在传输中的损耗问题。其基本原理就是把传输的信号分段,加入一定的校验再让各段间发生相互关联,即使在传输过程中丢失部分信号,接收端仍然能通过算法将完整的信息计算出来。在数据存储中,纠删码将数据分割成片段,把冗余数据块扩展和编码,并将其存储在不同的位置,比如磁盘、存储节点或者其他地理位置。如果需要严格区分,实际上按照误码控制的不同功能,可分为检错、纠错和纠删3种类型。9 [+ L& Z/ h3 r  {7 l! I
·检错码仅具备识别错码功能而无纠正错码功能。" E5 B8 n/ Y( |" E. d/ }0 A
·纠错码不仅具备识别错码功能,同时具备纠正错码功能。  r6 Y$ n$ M1 b3 u
·纠删码则不仅具备识别错码和纠正错码的功能,而且当错码超过纠正范围时,还可把无法纠错的信息删除。0 x, ~" Q4 x4 E$ P
从纠删码基本的形态看,它是k个数据块+m个校验块的结构,其中k和m值可以按照一定的规则设定,可以用公式:n=k+m来表示。变量k代表原始数据或符号的值。变量m代表故障后添加的提供保护的额外或冗余符号的值。变量n代表纠删码过程后创建的符号的总值。当小于m个存储块(数据块或校验块)损坏的情况下,整体数据块可以通过计算剩余存储块上的数据得到,整体数据不会丢失。
8 r* z9 Y) A0 k( B下面以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上面,完成对这个对象的存储操作。如图所示。& e) q/ r* G0 c2 I3 Q# q
下面再看一下如何使用纠删码读取数据,同样还是以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),最终将该结果返回给客户端。整个过程如图所示。& ^9 I* b$ F7 L% {4 Y7 z9 E4 L
虽然纠删码能够提供和副本相近的数据可靠性,并降低冗余数据的开销,整体上能提高存储设备的可用空间。但是,纠删码所带来的额外开销主要是大量计算和网络高负载,优点同时伴随缺点。特别是在一个硬盘出现故障的情况下,重建数据非常耗费CPU资源,而且计算一个数据块时需要读出大量数据并通过网络传输。相比副本数据恢复,纠删码数据恢复时给网络带来巨大的负担。因此,使用纠删码对硬件的设备性能是一个较大的考验,这点需要注意。另外,需要注意的是,使用纠删码所建立的存储资源池无法新建RBD块设备。' N3 `9 g) h9 n+ d  W, O) L
Ceph安装后默认有Default Rule,这个Rule默认是在Host层级进行三副本读写。副本技术带来的优点是高可靠性、优异的读写性能和快速的副本恢复。然而,副本技术带来的成本压力是较高的,特别是三副本数据情景下,每TB数据的成本是硬盘裸容量3倍以上(包括节点CPU和内存均摊开销)。纠删码具备与副本相近的高可用特性,而且降低了冗余数据的开销,同时带来了大量计算和网络高负载。3 Y0 u3 a% Y8 G) `

9 I2 \' M- q- N0 }7 V9 Y; C2 i& n9 S9 l# s( P
二、纠删码实践( I; v# ^% ?0 h9 \7 C
纠删码是通过创建erasure类型的Ceph池实现的。这些池是基于一个纠删码配置文件进行创建的,在这个配置文件中定义了纠删码的特征值。现在我们将创建一个纠删码配置文件,并根据这个配置文件创建纠删码池。下面的命令将创建一个名为Ecprofile的纠删码配置文件,它定义的特征值是:k=3和m=2,两者分别表示数据块和校验块的数量。所以,每一个存储在纠删码池中的对象都将分为3(即k)个数据块,和2(即m)个额外添加的校验块,一共有5个块(k+m)。最后,这5(即k+m)个块将分布在不同故障区域中的OSD上。5 i# `" P# {7 C
1、创建纠删码配置文件:3 g: Y& u( ^# W, e3 n1 f
# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2' ~- @* L+ ^) ^* s8 C4 E' Y
2、查看配置文件$ `; V  \  M' v# b
# ceph osd erasure-code-profile ls
9 K" U1 |: ^5 q; M8 ]! s3 W+ `; r: [Ecprofile
6 t( z4 m, X% Z3 l: U$ |7 rdefault2 ~3 ^% k2 |, z8 p! K- }0 Q: S
# ceph osd erasure-code-profile get Ecprofile. w2 G& R% Y# X$ m  \( o: z$ s+ Q8 G
crush-device-class=, ]% M; d. B3 i. s! s% L- w0 R  J
crush-failure-domain=osd" \- i( N8 r/ W' V# @
crush-root=default
( X6 A; j0 L$ ?2 H; }8 ^jerasure-per-chunk-alignment=false
9 P5 C2 {2 c( P" I  ok=3% i4 k9 L  c- r% l' T
m=26 g/ E+ {: ~+ g# q9 J, [3 B+ P0 B
plugin=jerasure
% j. O+ x! M" ]( Ktechnique=reed_sol_van
! `) d' r8 O/ s* b2 Uw=80 }: {: T! Z+ h' E) o- ]7 j
我们顺便也看Ceph默认的配置文件3 b' v9 a" |2 I' K( |
# ceph osd erasure-code-profile get default" x! n1 S6 D* O& T6 z9 e
k=2
0 F, w4 p3 o3 a, f/ G7 M) ^m=1
% {& T8 n+ W1 J) z0 U4 bplugin=jerasure& }: q- l' b6 o5 B6 ~* E$ Y% W- i
technique=reed_sol_van9 v+ e& |0 Q) p' X
3、基于上一步生成的纠删码配置文件新建一个erasure类型的Ceph池:4 S! e; b! A1 I. L! f) \# s
# ceph osd pool create testcpool 16 16 erasureEcprofile% F$ }: T+ M/ D: N: K9 N
pool 'testcpool' created
' o5 L1 V. k9 m: g4、检查新创建的池的状态,你会发现池的大小是5(k+m),也就是说,erasure大小是5。因此,数据将被写入五个不同的OSD中:9 |( Z& {4 d; A# b' D  o1 ^1 q
# ceph osd dump | grep testcpool8 x0 y: _- Z% L; Z, B
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
4 U% n) U7 q7 P' }+ `5、现在我们创建个文件放到纠删码池中。9 j; S( r$ u) S+ m: n  q  |  V
# echo test > test
& B  [+ n* u) a) K% n# ceph osd pool ls
# E' g- a0 Y' w# t# e3 C& Etestcpool3 ~' K6 I/ I$ D) O
# rados put -p testcpool object1 test( ]: @* p( \) x+ H" W9 P
# rados -p testcpool ls1 }% F9 O6 Z* r( @8 b4 h7 B; K& E% W
object1; T5 g. z3 \4 B' B6 T+ D: z
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。
! l* k5 H) j# j- Q/ {# ceph osd map testcpool object1- \# \1 }8 t8 U0 S- Q' y% [7 L
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)
! X  D5 {6 B8 o
- x0 D+ O3 T% j三、纠删码测试
7 N" I" p; ^3 {# l1、我们先来关闭一个osd
" w* X3 f4 x, q* `+ V- J# systemctl stop ceph-osd@3
' g/ s+ \' v* [& w9 N停止osd.3,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.3变成NONE了,这意味着osd.3在这个池是不可用的:
, U) C- r- g; h# l8 F' L4 k& Q5 @# ceph osd map testcpool object1
" V$ s# y0 y& p) vosdmap 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)
$ `/ G7 O9 e+ E2 Z: N2、我们再来关闭一个osd
6 s5 z8 S4 w3 e+ P9 E6 t# systemctl stop ceph-osd@55 a5 U2 [7 Y9 [; f$ c' I6 }
停止osd.5,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.5变成NONE了,这意味着osd.5在这个池是不可用的:7 U' u# l( t( ?; K. _+ y
# ceph osd map testcpool object1+ G  D  B- r7 c) j/ ^
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)/ s. t% {; ^1 |/ E
3、我们从纠删码池中下载文件
0 Z9 s! h: \4 l4 y9 w% D- d2 r## rados get -p testcpool object1 /tmp/devops3 K& i$ o# B& u! _- l# Y

9 m0 z1 e" R' ^  }0 U3 q! W
. b0 P% r4 k( f. X# ^9 W0 g7 u6 n7 _7 K0 [
 楼主| 发表于 2025-3-28 10:00:01 | 显示全部楼层
19 纠删码存储池
6 C0 v( {0 k; u) S3 K2 i ( _4 q) f, ^1 D6 n' s$ O* v
& F) }- y. T( ?) u. ]0 o) P6 O
Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。
1 D* v/ @: v9 n" j
( o; ]( P/ K7 Q5 _, W! c有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code
* Y& R9 t2 F/ {5 x$ y8 M! w; c
/ s1 \2 m9 `% y/ }0 Z% {0 E有关 EC 存储池相关的存储池值列表,请参考纠删码存储池值。
# m; v, T! P8 M( {. f19.1 纠删码存储池的先决条件
6 t2 R2 q* d* I9 H' o9 E1 d9 L
4 x9 _% s9 O2 F1 \  s* V) ~- b2 z5 _5 i! R$ Q% O8 j& y( ]
要使用纠删码,您需要:& ]6 y, i6 g9 i+ Q# G+ i
% Q' z2 c1 w& J* s$ A+ }% h7 @
    在 CRUSH 索引中定义纠删码规则。' o6 _9 o: W( |
  t( |: R, a$ F- E6 e; s4 T
    定义指定要使用的编码算法的纠删码配置。
- P( a  k5 a1 l7 ~# K
& S& ]+ z: J$ r/ q& M, i    创建使用上述规则和配置的存储池。 $ c1 i% M: t) H

# J& H) F, ^! O+ q9 K; x$ w请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。
1 B$ X" }& v3 W# P  u3 R$ A
* ~% o; c: V" b; z6 Q( a1 o确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 17.3.2 节 “firstn 和 indep”。8 y( t5 i4 {+ I/ U: y# R
19.2 创建示例纠删码存储池
( G3 r3 w% {* F6 X8 e% P/ @
5 B+ w) U% {7 i6 @( p4 z4 ~* h2 I
最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。2 u5 u+ T2 W. j6 J0 j

5 A4 ]7 R1 Y$ P+ c' ^; Y( C$ h0 P7 h    命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。
& C* c+ I9 W1 w) u
) ^( y2 [% D; F. c. d$ d' {% X    cephuser@adm > ceph osd pool create ecpool 12 12 erasure& a/ Z* P8 @8 V/ k7 [  z3 u; a
    pool 'ecpool' created  ]* N, J9 q/ S8 l
" q) t- Z% G$ d
字符串 ABCDEFGHI 将写入名为 NYAN 的对象。+ v  z% B1 H# c. g

1 k) \' U, s8 M) f% X! ?cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -6 ~" u$ B" q# g" ~
' A! o. ~3 Q0 e! J; U& Y0 U' E0 G
为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。9 J  y- S, q6 u
( x2 a8 U* M0 c9 n# L) J. N: g
要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。
$ b# F. `3 p' y9 j* @* m2 F) s; B- _0 Q% W; q" [% S! z/ |0 N
cephuser@adm > rados --pool ecpool get NYAN -
  `2 ~& `, E+ y2 p6 NABCDEFGHI
5 P+ ^" A) y2 @8 B, ]
$ B# U  `. D* _5 \! I% Y19.3 纠删码配置
, i( Z1 u( z7 V. J# R   W* i3 g4 I6 w. Y
0 |9 [6 L2 |; s, R7 o# d, ^
调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。
0 L5 V0 K0 i( P$ o8 s) \" }7 Z* k' L. n/ t. L* [, G
纠删池配置所需的定义:! ]5 o. |- y; d. h3 k1 T

: e8 J% D1 ^# Ichunk/ |! u" O; p1 R8 u. R
7 p& S# A: F; W$ a
    如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。
8 P7 X: B. d2 w2 @1 h( Yk
! i. f) a8 H# i7 s: I8 ?3 ]. N
+ ^. D* j! m" b6 ^) @  X    数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。 6 f2 R+ u, |! Q( G
m4 d1 a! Q8 N! ?4 f% {% z- R

8 m0 a; a& g: p5 c9 y1 }    编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。 6 ~8 B3 ~0 ~! ^. }: E* a+ P
crush-failure-domain
: @5 s9 T% Q0 L4 J
9 U' w( r$ a, w0 r8 L' v9 ^. }    定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 17.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。
5 \$ [8 y" p4 o# x- |$ [) K/ a) h+ Y) K9 z$ N% a3 d# f& i
使用第 19.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。
1 n; o; w: L0 X% ?5 ]
6 K( f  x+ a! W可使用以下命令显示默认配置的设置:/ p6 S# `3 {4 {  H" e/ @

! D6 K& e, q7 P2 ?  pcephuser@adm > ceph osd erasure-code-profile get default
" X9 m+ y+ Q8 G& n0 x  Y5 ]directory=.libs6 D5 V8 F. I8 r8 f' D$ M
k=2
. d$ J- z* D1 f* N9 }m=1
# l& n9 ?. G4 j. y( Vplugin=jerasure
' \9 ]7 b$ P2 h9 H8 r4 }+ I/ ~crush-failure-domain=host3 [% n% B6 C. }  l5 ]
technique=reed_sol_van+ W) R* i5 b' x9 v/ k1 B& Z1 ]  C/ f
- R+ D# h: k5 S% `
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 18.6 节 “存储池迁移”)。
3 P$ Y2 u4 x# `) {" j; e# W1 g2 O# M  Y+ I, V9 ?% ^
最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:5 c( D; }# d2 y
0 o: @" P3 [2 N$ G$ Y' h; M& ?! b
cephuser@adm > ceph osd erasure-code-profile set myprofile \
0 k  G) s1 ~" L9 V' Q; h& P   k=3 \' e4 n7 w2 Y& g% X; N7 h2 d
   m=2 \/ O' j- m" ?# w
   crush-failure-domain=rack0 I0 e0 F8 F( D8 J" i! Z; M

) C: ]4 s- J+ F* l) U1 Y对于此新配置,可以重复第 19.2 节 “创建示例纠删码存储池”中的示例:
; A: t/ a/ R! Q0 s0 D9 J  D( n* ?) f- f2 R$ ^' l7 A0 Y! }' g
cephuser@adm > ceph osd pool create ecpool 12 12 erasure myprofile8 z& \* [- T7 M* G: H( N
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -4 w  j" |9 g, b' ]2 }2 U
cephuser@adm > rados --pool ecpool get NYAN -
: d6 U, j1 P& l6 G2 P# d3 z' }* M3 rABCDEFGHI
. }" o6 H5 ], L6 ^- V+ D; ~) Q1 H$ u
NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。
" X* k( V1 p/ g+ t2 n. O#1: 纠删码配置
& K/ j! s% S+ U/ p19.3.1 创建新纠删码配置
  P6 A5 I7 y. n% B % Z7 w8 Q( o5 c8 {5 a
0 ^3 ]* v3 a: \. m, e- D2 S% t
以下命令可创建新纠删码配置:
. x# D0 l2 a! [$ |' R) m  j) r8 y  c* U. i
root # ceph osd erasure-code-profile set NAME \0 U) P9 `6 m* i# i
directory=DIRECTORY \
, X. _7 n2 \' v% Q plugin=PLUGIN \
# @2 }' l5 a4 v% X3 W2 z stripe_unit=STRIPE_UNIT \
) p  X1 d$ S& \5 o3 u3 ` KEY=VALUE ... \
! s: @& ?. }/ V& {4 b' {$ X6 ^ --force6 J: R7 X* l6 `4 ^% C

3 X7 t- k7 R+ v/ v2 pDIRECTORY
+ i5 r) O+ U6 j
4 U! X2 I0 c9 ]& e' G    可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。 ; F  j7 E0 w$ `$ a2 q' F- V
PLUGIN
6 M' I% f+ m, B5 u+ [: B* F3 i, M* g; f8 R2 Q3 |% i) {
    可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。
6 s1 F( I, C! p5 JSTRIPE_UNIT
# W4 G+ J& `5 H& W- \! r4 f. c3 _: a; g; 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”。
& o" k8 F2 S7 Y4 f. Q" G3 DKEY=VALUE
0 U% x7 f  i  J4 q$ T$ Q7 w  x' r, s  U4 L
    专用于选定纠删码插件的选项键/值对。 ( z1 J! A. S1 O9 ^: `
--force
9 j% q/ k" g5 R8 O& A1 ]
2 Z, ^! }8 |- ]" v) L- y    可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。
8 X- ^+ S! v4 ^. }; D1 l
+ k- j; E- G/ \; ^  w0 ?) H. e19.3.2 删除纠删码配置
% y; v. i, \8 E# V9 r ) M/ ?7 D2 ~  m4 z, c
/ r7 X( p6 \: R2 I" l& G7 t, E6 `" v
以下命令可按 NAME 所标识的纠删码配置删除相应配置:8 j* Z. M) D2 u5 k4 g

3 j3 p0 W. G3 S$ w9 L* S+ ~root # ceph osd erasure-code-profile rm NAME
; I* v' D: x8 m* B" z
$ j6 L! T* j- Q5 L3 o重要重要, d+ E' G( E. Q  A

* S$ P( c6 y1 K; C* `  z. \如果某个存储池引用了该配置,则删除将会失败。. E7 W/ U0 U7 F4 K
19.3.3 显示纠删码配置的详细信息& Y+ S4 {, j+ P' Q( w
8 e$ S- i/ w9 i! C& h" X$ N4 K

1 H5 x% O0 I; F) T4 i7 Z7 g8 V以下命令可按 NAME 所标识的纠删码配置显示其详细信息:
1 h6 h3 q+ Y$ z8 q( J" _
4 {+ d# i( y4 i1 Vroot # ceph osd erasure-code-profile get NAME  s& j8 S# b; D2 |
# m/ V+ N/ {( {1 q0 E% N7 D
19.3.4 列出纠删码配置
5 S5 s/ S1 X0 k * @  s, e5 c: ^( z
4 M9 `3 H. K) k1 C$ x( Q
以下命令可列出所有纠删码配置的名称:
5 ], r* c' n% B
. x. a3 q. Z" z. P. a) Qroot # ceph osd erasure-code-profile ls( G  @( I& Q: Y0 b4 X$ A

( ~- M# r4 ~- o& b1 u7 X6 _% O  E& |19.4 标记含 RADOS 块设备的纠删码存储池
. M" o; G9 p: c9 ]* j3 V" v 5 @9 Q* l0 I) b5 h, u0 [: e* ~

  ^5 [- n* O0 n- ^% N( ]+ J要将 EC 池标记为 RBD 池,请对其进行相应标记:* b2 V- R5 G8 V" V0 [( ?6 r
  ?0 {9 k( A( r1 c9 Q* T- p* F
cephuser@adm > ceph osd pool application enable rbd ec_pool_name
) v' f% G( X% s% h/ p; S# W8 _2 {- Y6 T5 Q) {  X
RBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:/ _7 X/ c0 i! N6 W
. w  W) Z1 @2 T) U
cephuser@adm > rbd create rbd/image_name --size 1T --data-pool ec_pool_name" Z0 E5 g/ _8 T6 F7 p9 ~$ e2 y% z
9 S/ j; X; O1 P" z6 K; |; y! n
您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。
 楼主| 发表于 2025-3-28 10:00:02 | 显示全部楼层
在 OpenStack 中使用 Ceph 纠删码(Erasure Coding, EC)池,通常涉及到以下几个步骤:
" Y8 g% k  ^2 a2 j; f  y) e: B1. 配置 Ceph 集群以支持纠删码. m5 {7 I3 T7 o  E4 A& H1 p* Y

- B0 c/ Z+ n) w! Q首先,确保你的 Ceph 集群已经配置并支持纠删码。这通常涉及到以下几个步骤:: o0 S6 c/ [) ^
a. 创建纠删码池
- c5 U7 _  w3 e& A- @
" ^: e5 T5 c4 A; m3 }" m在 Ceph 中,你可以创建一个使用纠删码的池。例如,使用 jerasure 和 reed_sol_van 算法创建一个纠删码池:
/ |2 p" J6 V+ ?+ `1 A
, e9 u7 l/ L$ {# k) Y* V+ J! uceph osd pool create ec_pool 64 64 erasure code_profile ec_profile
. a$ C# f6 |2 {( @ceph osd erasure-code-profile set ec_profile jerasure yel error_domain=1 k=8 m=2 ruleset-failure-domain=host crush-root=default
- D* a' }9 [7 B4 ^4 b
& X- @8 j5 |* j' o- n这里,k=8 表示数据块数量,m=2 表示校验块数量,error_domain=1 表示每个主机最多有一个故障域。
0 h+ J" G: u0 s' s! ?b. 验证池配置
! l/ `$ w1 D+ N- h% ~; t
+ V( c5 E- h9 r$ ~确认池已正确配置为纠删码:2 `4 d5 |7 Z4 Y( ~  F

7 U/ F9 t% x0 z# g6 Zceph osd pool get ec_pool erasure_code_profile
0 _6 y: ^% e  {  n: g5 @- p
" D, q  U# c* A; |! y: D3 y( @# d2. 在 OpenStack 中配置 Ceph 和使用纠删码池% \1 M' v0 ^3 ~( m

7 I+ ^4 o" B# j5 B7 _3 i0 l在 OpenStack 中使用 Ceph 纠删码池,你需要在 Cinder 和 Nova 中配置 Ceph 以使用这个新的池。
& H6 Q8 i/ D! G. i! S3 d5 [" o7 O) na. 修改 Cinder 配置文件
# m) a" S0 f% Q% F0 M6 M, j  w0 R# K; S; Y) k8 n: O
编辑 Cinder 的配置文件(通常是 /etc/cinder/cinder.conf),并添加或修改以下设置:1 T! h- C1 Z0 `
$ S8 k0 I3 y2 Y; V8 {
[cinder]9 G/ E* l1 }, B, \1 v9 \! v, X* p& E
volume_driver = cinder.volume.drivers.rbd.RBDDriver
1 g: u& c, |2 h- {rbd_pool = ec_pool
4 F9 g# W: A7 ^- srbd_user = cinder-user2 e8 \3 L* e4 y/ |9 Y$ G
rbd_secret_uuid = <secret-uuid>" D$ V: O- M5 ^' ]( f( C8 K1 W
9 O2 ^/ ?4 l+ ^" u7 N" C
确保 rbd_secret_uuid 是你的 Ceph 认证密钥的 UUID。你可以使用以下命令生成 UUID:  V2 n) ?- F/ J% E' L# n

: t; R% _  R8 nuuidgen
+ _" @/ e0 J7 j8 f6 y' }- K& \# D" L' V
b. 配置 Ceph 认证密钥5 m4 ^3 \# Q4 x4 ~
6 {/ ~' r1 A, L* L
生成 Ceph 认证密钥并将其添加到 Cinder 和 Nova 的配置中:- J) Q! a; T8 M. }1 N
- I. I6 f7 v5 S/ {/ W. E; n" q
ceph auth get-key client.cinder-user | base64. g4 s9 e. U/ i% @3 H) z" H! x

- o- A$ U' _0 x$ v( ^( d将输出添加到 Cinder 和 Nova 的配置文件中:' k0 c$ P+ i  |. T3 D; B6 D6 d

6 r+ o- i' ?9 |0 c+ a[DEFAULT]  A! {9 Q/ J2 W7 [' T  K
rbd_secret_uuid = <secret-uuid> from uuidgen& v8 c7 F4 P6 q
rbd_user = cinder-user
2 s8 b" Y8 y1 h4 O2 L  ?6 E$ Drbd_ceph_conf = /etc/ceph/ceph.conf
) e0 l  ~, T0 h4 q9 }
  f- \/ y% v5 l. Q- N) W7 Oc. 重启 Cinder 服务以应用更改
7 m$ w9 F7 Z3 j4 p; `2 r( u; H/ @
& E$ w+ m# j1 \1 S# bsystemctl restart openstack-cinder-api openstack-cinder-volume openstack-cinder-scheduler
& ?. X# q- W$ ?3 G7 \% s- I9 Q1 K( N5 i
3. 验证配置
1 m9 e4 d  X* y9 V4 O" W8 P+ e5 Z) p' B8 F! E4 a0 D' j/ N
确认 Cinder 可以正常使用纠删码池:% Z, g4 N" j* X7 w8 W
! O; D: W0 l! }! Z; p
openstack volume create --image <image-id> --size 10 <volume-name>( d3 K8 F; v8 ^; z0 a# o- P
( U3 Z* F) ?* V1 R3 g2 A! C) L
检查卷是否正确创建在 EC 池中:
9 t& l0 b7 c8 R' e- F  E/ J4 {$ g2 }2 i+ e$ L! p" b" w
rbd ls -p ec_pool --id cinder-user --keyfile=/etc/ceph/ceph.client.cinder-user.keyring | grep <volume-name>: w. z% ], O$ |/ D

4 ^% L/ U) O! V% A9 ^/ `( @4. 在 Nova 中使用 Ceph 块存储(可选)  \- `2 n+ ?1 R4 N7 q4 e

; g5 N: y+ |) I如果需要在 Nova 中使用 Ceph 块存储,确保 Nova 的配置也指向正确的 Ceph 用户和密钥。这通常涉及到编辑 /etc/nova/nova.conf 并添加类似的 RBD 设置。3 O/ a  p  A/ x& ^" k8 i
5. 重启相关服务(如果需要)
( Y- R- }* E5 b" v+ K0 a& V) i7 f% o  R+ U& ~3 J
根据需要重启 Nova 服务:
4 w% j1 A5 I8 ~1 r/ k+ Q
! Q0 f. i' z  y$ V, h7 _+ u/ _+ Esystemctl restart openstack-nova-compute openstack-nova-api openstack-nova-scheduler openstack-nova-conductor2 J' ?. Z3 I9 \/ M  t( L5 a

; T9 K  `3 R; a通过以上步骤,你应该能够在 OpenStack 中成功配置和使用 Ceph 的纠删码池
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

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

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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