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

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

[复制链接]

0

主题

0

回帖

9

积分

管理员

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

& r: B& T) a# V; {2 {二、纠删码实践) k- O  u( Y# r& T- i0 Q1 O
纠删码是通过创建erasure类型的Ceph池实现的。这些池是基于一个纠删码配置文件进行创建的,在这个配置文件中定义了纠删码的特征值。现在我们将创建一个纠删码配置文件,并根据这个配置文件创建纠删码池。下面的命令将创建一个名为Ecprofile的纠删码配置文件,它定义的特征值是:k=3和m=2,两者分别表示数据块和校验块的数量。所以,每一个存储在纠删码池中的对象都将分为3(即k)个数据块,和2(即m)个额外添加的校验块,一共有5个块(k+m)。最后,这5(即k+m)个块将分布在不同故障区域中的OSD上。; y4 |/ U% k2 g: O4 X  g
1、创建纠删码配置文件:
6 g! a; r; E- [: \! [# ceph osd erasure-code-profile set Ecprofilecrush-failure-domain=osd k=3 m=2
, w% A% X! H0 \1 r) z) O2、查看配置文件
% g  ]. B; L% _- L; S9 [# ceph osd erasure-code-profile ls
- O; p! ]/ `! y. q9 L! f  DEcprofile
0 o2 m7 A/ c. B2 _; z9 h: P9 ldefault; B5 b% {; \  y3 ^3 u& c$ x  }% `
# ceph osd erasure-code-profile get Ecprofile
5 e! H9 Y$ p" Z" D& C9 pcrush-device-class=
- E" @! j# C( wcrush-failure-domain=osd
, E! {' k) i) j$ H! u4 kcrush-root=default
' w3 L- |# L  D/ T. ojerasure-per-chunk-alignment=false: V; x9 f2 K% M7 y! m
k=3
1 [5 a* ~% I! ]& A9 |/ t  W- O, Um=2' e% f( N8 P! @- }1 F
plugin=jerasure
8 n7 V  ~# S  n, D0 W& `9 w) Vtechnique=reed_sol_van+ h, n; I# O- y: `9 ]
w=8
) Q4 b; `+ S2 c1 t$ R) h& f我们顺便也看Ceph默认的配置文件7 {! n$ j/ j, P. P; H; [
# ceph osd erasure-code-profile get default+ h9 }" Z0 f+ o& u* m$ m- K
k=2) p* z8 P/ }3 s' W( M6 _  x
m=1. V7 U( G: n! t3 C! k8 G+ `
plugin=jerasure
0 W3 f) k: x( k1 Ctechnique=reed_sol_van/ ~# \$ w! u# z9 h7 \2 H0 j
3、基于上一步生成的纠删码配置文件新建一个erasure类型的Ceph池:5 s- c& e( f" Q9 W& G5 w: A
# ceph osd pool create testcpool 16 16 erasureEcprofile
/ r: ?% Z6 n. k/ Opool 'testcpool' created
0 f! H5 R* ^& Z. Y4、检查新创建的池的状态,你会发现池的大小是5(k+m),也就是说,erasure大小是5。因此,数据将被写入五个不同的OSD中:6 U+ [* c9 P5 D( D2 M: W  b0 j
# ceph osd dump | grep testcpool
- E/ u% `& ?" g' G1 Zpool 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& c7 D6 t  L; w# R
5、现在我们创建个文件放到纠删码池中。, k. ~  C7 P$ d1 {( h! R+ N1 o
# echo test > test0 x& M! {& h% v, q+ T' }) d
# ceph osd pool ls
$ X1 Y8 P1 h! U, C, \0 ctestcpool! R# k- k, b. n. ]; {
# rados put -p testcpool object1 test# @' e- H) I6 J( b
# rados -p testcpool ls
) z6 v3 O3 B, f9 nobject1
# b3 B" C/ i$ z& K. r9 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。% d( n5 [0 ^% j. l0 h; m8 x
# ceph osd map testcpool object1
  r( {& o( @1 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)! B* Z7 D! k3 k2 W" a
! Q& _# S, |  k& j/ E! A- X) _6 }
三、纠删码测试
* u7 b$ j% X$ P1 T- j; E+ j. Q1、我们先来关闭一个osd
. y5 W( z$ V7 x0 X& u. }. e# systemctl stop ceph-osd@37 J! S" }  }  c* U9 [7 ?4 \
停止osd.3,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.3变成NONE了,这意味着osd.3在这个池是不可用的:- Q& ]# b) o: b- B
# ceph osd map testcpool object1
( t4 l0 p+ A* G3 l! K2 d( H4 q$ Aosdmap 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)% A( W' G% ]/ |# q+ S3 t; V: I9 \
2、我们再来关闭一个osd- {# `1 U2 Q0 q! Z/ [, N
# systemctl stop ceph-osd@5$ Y2 T! @' o9 P! R, n
停止osd.5,检查testcpool池和object1的OSDmap。你应该注意,这里的osd.5变成NONE了,这意味着osd.5在这个池是不可用的:
2 W# {% z, K  n7 o6 d# ceph osd map testcpool object1
" g/ e' U1 E; {: a8 c0 fosdmap 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)1 Y  I  ?; A9 h& U/ v4 g4 Z: V8 q
3、我们从纠删码池中下载文件+ u/ ~2 _- m) ^4 ^
## rados get -p testcpool object1 /tmp/devops
( N0 a- a* L: _/ E& h7 q; ?3 e  B8 D0 a( y

, t# j# `9 s1 l: m
7 v$ @2 ]. D" s- \. F+ A

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:01 | 显示全部楼层
19 纠删码存储池
0 Y' y: }4 z) E1 Z ! G, F7 E/ B8 r2 o( O
, r9 l7 T  l; D2 y
Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。
8 n( g; r' c9 A4 v0 w1 r- T; ?2 Z5 U6 ], t
有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code
. g6 H$ u) @& s
' x3 y/ `. l/ W$ ?- D% |% M: Z有关 EC 存储池相关的存储池值列表,请参考纠删码存储池值。
1 c0 _# Q; C; g* Z+ L- W19.1 纠删码存储池的先决条件
3 V: z' ?0 x1 q$ z/ G
% W( B1 R' A' W7 z; R
- F! U1 u* E1 n9 f要使用纠删码,您需要:
2 W4 S# j( _/ x
$ ]1 W" i3 A3 n4 i; q  P    在 CRUSH 索引中定义纠删码规则。
5 g% Z$ @' S5 Z* f/ Z% Q! T" N( y
0 v7 Z+ d) L0 f1 }6 f, Z6 a" u' [    定义指定要使用的编码算法的纠删码配置。
) M7 ]& i5 ?9 k! d) q: x7 I: k/ w# m4 h+ i
    创建使用上述规则和配置的存储池。 0 C0 P: [1 l$ [" x3 `# _: u6 O7 a0 `
( W5 @1 ^0 s( t! o" s( P; R
请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。) t  ?* V  E$ P2 m  t  [
# m, P' n4 \+ ^8 Z
确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 17.3.2 节 “firstn 和 indep”。2 N$ ~7 a: S( v0 Q0 Y' [! u
19.2 创建示例纠删码存储池  _# a$ i  U* p2 y
" u2 t. B$ l* f) w

/ U9 O8 q7 @) G7 Q1 H最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。
% ?* \  D' ]4 y' {& N* f
1 x, w- j  M" b0 N* s; a    命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。
5 r/ I  i" R2 w4 s% i8 e
* q# l3 ^+ K: K$ J- q  @4 ]    cephuser@adm > ceph osd pool create ecpool 12 12 erasure; ~' v" K4 y) P5 e; D
    pool 'ecpool' created& T1 _% h" q% c, ]
) T) Z6 l' _" _5 f1 g
字符串 ABCDEFGHI 将写入名为 NYAN 的对象。
/ L  {+ F( C- O" }6 ~1 `$ o/ k6 Z- H0 |7 Q
cephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
  S. j' L9 {, }: d5 m; f5 m  `' d
为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。
, ?# W% z9 ?1 m5 h" c+ _6 N2 W* H8 |" ^7 F- b: F  j+ ~8 g( {& [8 z
要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。
1 I7 ^. Y! z" c: r' T/ K! a+ j0 u& e1 q6 W7 G& {/ w! ~- L
cephuser@adm > rados --pool ecpool get NYAN -
( u% j0 h: R- f/ C8 ]9 ^9 O5 jABCDEFGHI
6 @# H/ H9 o% d2 Q$ P- r6 O
2 L' b* \9 T8 E" i6 k19.3 纠删码配置% N1 n" p) Y' o+ t" B" E& h  {0 l
* G6 y; J: P2 y  g/ M$ f
) E! }8 q2 j% R* C6 ?2 O
调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。
7 {% }4 ^4 I* j! ~: H" h) r4 [5 X( ?$ l3 Q4 `/ W
纠删池配置所需的定义:
' ~' {; d, s1 D. S  Y1 a1 l+ v( c" w9 \2 N
chunk9 i) M8 v5 G* X" Z
9 S" V8 w2 ]' j1 y/ ^" Z
    如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。
5 w6 ], `' k6 @# I8 B2 x$ R+ Ak2 h, }8 k; U# I9 m1 P, ?
4 c/ J- _+ W* j+ X  o! B! m
    数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。
! Q/ x/ X& u  Zm6 @  C" }, [- ]8 Z
( ]! d% d5 O$ k( M
    编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。
3 P0 m7 }! U& ~" C; Jcrush-failure-domain
6 j4 U& c% \4 z$ S9 C/ _/ W
, ~; v7 S$ E8 L    定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 17.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。 & }1 _2 x) i6 ?( n
1 y, i1 l( T2 K* H6 ]8 Y' g
使用第 19.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。
5 c* U1 ~6 z' Y1 b
: L9 Z; B5 ?2 q+ f$ U可使用以下命令显示默认配置的设置:
% J/ m1 O: p! S/ w7 N; l4 N1 n' R3 H
cephuser@adm > ceph osd erasure-code-profile get default
& @4 g& R' T# e) j7 idirectory=.libs
$ o0 E  `) C8 U3 t) e" _% Ek=2# I/ N) a! t& O5 }
m=1
/ O( @7 F& p+ i5 }" zplugin=jerasure7 e/ X4 R5 N% _, _/ i
crush-failure-domain=host
' n6 O  r) p1 qtechnique=reed_sol_van
* J0 `8 ]) m4 ]# B4 ]7 y1 `4 j" d3 r4 E* o; t  O; ]
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 18.6 节 “存储池迁移”)。) J0 a# v  |- N  e/ P0 f
, e3 K) e% r  m  f9 B+ w8 v9 Q1 i/ a
最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:
0 n7 b4 U, X4 p0 Y* S* k7 i
  o6 q9 F# b+ d( kcephuser@adm > ceph osd erasure-code-profile set myprofile \
! Q* @& d7 s/ c* \, m8 q   k=3 \
. T/ m  B$ \. x: l) l5 w   m=2 \
8 `  Q  D, S% g# i2 W& o   crush-failure-domain=rack: N3 C+ K0 F6 m8 \0 J- o

6 p: e0 l" ^  x5 K8 T" K对于此新配置,可以重复第 19.2 节 “创建示例纠删码存储池”中的示例:$ r9 h6 @% I/ ~0 Z0 N0 g
: T9 i* t$ e4 @# Y5 h+ U6 b
cephuser@adm > ceph osd pool create ecpool 12 12 erasure myprofile
3 _6 c  s( w( Q9 ~" I: ucephuser@adm > echo ABCDEFGHI | rados --pool ecpool put NYAN -
- y  ]$ {% N! {7 j' y$ h6 mcephuser@adm > rados --pool ecpool get NYAN -
' o1 l& l9 |7 ^6 I1 ~* @ABCDEFGHI
+ N3 a: y2 L0 ~+ _$ i" k1 {1 x$ a* q" ^
NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain=rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。
- \5 g2 ^9 O2 I* }2 i/ @#1: 纠删码配置
- q- N# J5 }; D2 J7 k) E5 {6 k19.3.1 创建新纠删码配置8 o6 Y) A% j! O* K4 @# O

) S# B; ^+ z# i- `! P, M+ R/ l9 M2 N5 G
以下命令可创建新纠删码配置:
7 j& E& e/ K9 q' `- ?* M$ d1 ^  t
2 q1 X6 K1 c: p7 e+ u' W. O% \root # ceph osd erasure-code-profile set NAME \0 Z: W4 r+ M; d6 E5 F
directory=DIRECTORY \& @8 V7 V  I/ P1 f3 O
plugin=PLUGIN \
) e# N1 P, ]1 G2 T# w! v/ K7 E stripe_unit=STRIPE_UNIT \
9 x' X* Y: R! p7 p# N KEY=VALUE ... \; E1 \2 {% f' S2 [
--force
& ]1 B- I- x6 K  ]
; [5 U5 U6 }' N2 M5 gDIRECTORY
/ E; K! k4 i! ]) P% s
1 b2 a& e9 N2 ]( ~: Q( \    可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。 6 P4 V7 G0 E0 x' n- T4 G
PLUGIN
" R" n" Q6 J' @" a) }( v% U! [# y# Q+ Z
    可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。 6 C7 r1 I* R* {; ]' u* h3 K
STRIPE_UNIT: B( w  n' U7 B, [
6 E7 l# |. l4 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”。 2 c; U0 C5 V+ c  I) a# }2 M
KEY=VALUE
/ D) n# c3 A: a
; \. ~1 ~0 x5 |3 T. g    专用于选定纠删码插件的选项键/值对。 ! c7 t0 |* d7 s% e9 s
--force. C, Y% }) M# w

9 a0 r+ E! E, w& k5 E- F- f: V# J    可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。
1 P- M5 b7 v8 m" g- \* A8 y+ U" e6 }- r$ U6 B. G
19.3.2 删除纠删码配置
/ T9 J$ v0 G: V7 y8 E( H3 B
! D4 |9 l. s3 J* O, r0 E
/ b4 K0 Z$ ~$ O7 k2 w) _& I5 [$ z, y以下命令可按 NAME 所标识的纠删码配置删除相应配置:
- Z7 A# e0 P2 q3 A: n0 q( k4 G, H
root # ceph osd erasure-code-profile rm NAME
: l: f! y/ \5 C# [' p9 F4 Q. Q9 @, s0 s0 O) f
重要重要
  U3 O9 \: ~2 \1 M1 N0 M  t  l: U$ J7 l" V0 b/ i
如果某个存储池引用了该配置,则删除将会失败。
4 m" f0 V3 [! C0 M$ s# Q) @% g19.3.3 显示纠删码配置的详细信息$ d0 I& A# I# T7 X

: Z0 \  g6 t; B4 g. V. k$ K0 }/ l7 S
以下命令可按 NAME 所标识的纠删码配置显示其详细信息:
* D* w& m0 [3 a5 ^3 d1 S/ e5 d5 \: H# b
root # ceph osd erasure-code-profile get NAME
7 A0 L5 \8 r) f1 c" _
/ Z* F% t$ ]# K" j/ V2 r2 `7 T19.3.4 列出纠删码配置
5 m  b6 w# |2 F! ]" b2 C
8 d8 ]: |) x; @% P
  z  J; ~. V& ?9 `# J3 _2 w1 i1 H以下命令可列出所有纠删码配置的名称:% ]: d: `8 o5 V9 X+ L
. r! k+ {; f% r1 z3 A
root # ceph osd erasure-code-profile ls9 a. P3 J- D3 A8 z1 i, r9 Q' N

" I  D4 D5 |/ a, ?' J+ w19.4 标记含 RADOS 块设备的纠删码存储池
2 Q5 C* P, G, |3 t' A3 q 6 m- k" J7 I# ?' v% k" t6 e

, ?0 D. U5 V3 x7 B要将 EC 池标记为 RBD 池,请对其进行相应标记:" ^6 y" k3 H8 S9 L$ m

9 d2 d! l7 p  N; E- H- ?cephuser@adm > ceph osd pool application enable rbd ec_pool_name
* ~- f+ a( j# Q& T* l4 G' g. f6 i/ Y$ a  ^
RBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:+ r. q8 U5 e7 l: m% y$ D+ p8 X6 j9 N
# j* I; t& N" l0 N- A
cephuser@adm > rbd create rbd/image_name --size 1T --data-pool ec_pool_name0 M* S- F- i7 @# t' ]) d
* {1 z# z" K: l5 v1 v( @* \
您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
 楼主| 发表于 2025-3-28 10:00:02 | 显示全部楼层
在 OpenStack 中使用 Ceph 纠删码(Erasure Coding, EC)池,通常涉及到以下几个步骤:
9 n; z2 k' v0 C5 u1. 配置 Ceph 集群以支持纠删码9 ~* ^8 K) w9 h6 K
- K8 w$ J" x( z1 H6 R+ S
首先,确保你的 Ceph 集群已经配置并支持纠删码。这通常涉及到以下几个步骤:+ T1 ~' X2 p& M/ i9 c
a. 创建纠删码池
. G: ~% `% ^, S# V! B9 R& J7 C6 h0 f5 [  w: ~+ X
在 Ceph 中,你可以创建一个使用纠删码的池。例如,使用 jerasure 和 reed_sol_van 算法创建一个纠删码池:6 s' k  ~, p8 A: ?6 ^

/ l. q( q$ o8 {  Yceph osd pool create ec_pool 64 64 erasure code_profile ec_profile' A8 F+ k; N' e7 {$ `4 m( n
ceph osd erasure-code-profile set ec_profile jerasure yel error_domain=1 k=8 m=2 ruleset-failure-domain=host crush-root=default% R$ t4 b3 o, |

8 o8 q3 a) A# T0 K  z这里,k=8 表示数据块数量,m=2 表示校验块数量,error_domain=1 表示每个主机最多有一个故障域。
3 ~6 l# {0 j; _: D1 rb. 验证池配置& d. L# q, B" @$ s% f3 O

4 }3 W& N/ K3 B( s* S& ^确认池已正确配置为纠删码:
: W$ m7 e& R# J) q9 N9 J* x
9 n: g- S, U1 X: O& b' lceph osd pool get ec_pool erasure_code_profile# w) A" a# b, S8 J0 @
) T+ b! V1 }* K6 a6 e5 b/ v1 _
2. 在 OpenStack 中配置 Ceph 和使用纠删码池
2 m' x  V- \$ T+ H" R) q, K7 l2 e* J
在 OpenStack 中使用 Ceph 纠删码池,你需要在 Cinder 和 Nova 中配置 Ceph 以使用这个新的池。  D) ^- @0 w) B' B: K# i) w
a. 修改 Cinder 配置文件
- f7 E, n2 @+ j) D
) W. c/ L, K+ c. G1 l编辑 Cinder 的配置文件(通常是 /etc/cinder/cinder.conf),并添加或修改以下设置:( J+ \/ f9 A' @  ^/ U3 N2 W7 w1 v

8 f3 l8 I; F& _[cinder], y! q' Z$ R# O9 M! h1 ^7 G
volume_driver = cinder.volume.drivers.rbd.RBDDriver0 @4 Y1 K3 I; n; H9 j8 X$ H) ^! p0 L
rbd_pool = ec_pool
* `1 \  X4 K; u6 grbd_user = cinder-user
' J2 G" ?1 B9 p# V: ^# Vrbd_secret_uuid = <secret-uuid>" H+ N4 C. [1 a" T: w  m) V" w
9 U# h7 l! W9 n+ |0 [) G+ K0 M
确保 rbd_secret_uuid 是你的 Ceph 认证密钥的 UUID。你可以使用以下命令生成 UUID:
' L7 g# @' T! F) L8 [% T! o
. S: X6 p# _0 ^, C) S6 z3 Fuuidgen8 ~$ k) z4 I0 N

$ C3 b( @/ E* n% G, _2 C" vb. 配置 Ceph 认证密钥$ N4 v" D7 c- w( ~, j& H8 X

+ \/ b- _' X3 K  a$ ^5 C生成 Ceph 认证密钥并将其添加到 Cinder 和 Nova 的配置中:7 U! L" `/ F# x5 g

- R  j# E- m! Q# e$ }ceph auth get-key client.cinder-user | base64% j: `3 a8 u. R3 b; m# a

9 L! X# {% i1 o& [! Q, H  D; S将输出添加到 Cinder 和 Nova 的配置文件中:+ N8 k& L$ \9 |

. V, P, g# I! B  Y[DEFAULT]
7 x; f9 ]! w6 J( Qrbd_secret_uuid = <secret-uuid> from uuidgen5 V# [$ f7 x( l. e! \; @/ z! N
rbd_user = cinder-user
' K# b" T5 V+ R+ Trbd_ceph_conf = /etc/ceph/ceph.conf4 r+ r/ c, g" `+ C: _4 |

  {2 T/ N6 q1 @4 g2 _+ Bc. 重启 Cinder 服务以应用更改
9 T; c; [% L8 d7 d7 Y, x
+ a6 R! Y% r9 ?) t0 rsystemctl restart openstack-cinder-api openstack-cinder-volume openstack-cinder-scheduler) y" L4 i( X4 c1 ]3 E

" G* i- q9 h' E6 V( a( r3. 验证配置
6 C: O5 M2 U: H& @* b( i9 H+ U# ~9 w& f3 ]
确认 Cinder 可以正常使用纠删码池:) l7 `  w: O/ T& R- C2 L$ A, y, G* L

' Z$ G( }# p4 P% v/ N5 M9 O& D+ Nopenstack volume create --image <image-id> --size 10 <volume-name>) L, ?7 L2 Q# ^# C( u5 f, B

, V9 B6 e2 g/ v检查卷是否正确创建在 EC 池中:
  V5 ]: W# \# V2 R+ _
8 y; D2 p+ r6 Z8 }' xrbd ls -p ec_pool --id cinder-user --keyfile=/etc/ceph/ceph.client.cinder-user.keyring | grep <volume-name>% R- Q9 F( ?  {! d# Q/ |  o1 l
9 h3 T) m* H4 z. i. j9 j7 A
4. 在 Nova 中使用 Ceph 块存储(可选)
% _. h# I% ?0 }* ^7 _& o1 M) u$ ?; r
如果需要在 Nova 中使用 Ceph 块存储,确保 Nova 的配置也指向正确的 Ceph 用户和密钥。这通常涉及到编辑 /etc/nova/nova.conf 并添加类似的 RBD 设置。# p  g/ o; X4 {. i/ v
5. 重启相关服务(如果需要)
) Y  R) K- {8 `
% c; N0 d; N' a8 f. o% P+ g根据需要重启 Nova 服务:
. ?: K& n2 d& l/ @: d0 G2 N$ E8 o+ Z* q1 l6 g4 ]2 f
systemctl restart openstack-nova-compute openstack-nova-api openstack-nova-scheduler openstack-nova-conductor9 }9 a* S8 c2 n' \7 T2 Z

5 @. G3 Q/ o3 {6 B( T6 E8 D通过以上步骤,你应该能够在 OpenStack 中成功配置和使用 Ceph 的纠删码池
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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