|
|
纠删码存储池 REPORT DOCUMENTATION BUG#EDIT SOURCE: r; t" g- q, i7 z' X& V
13.1 纠删码存储池的先决条件' j$ F* i u8 I# M. ~- X' k
13.2 创建示例纠删码存储池
1 l5 z- @! e, ?. ~9 C% y i13.3 纠删码配置( |5 ~* ]; E* N; o6 Y- X. _
13.4 含 RADOS 块设备的纠删码存储池
. b/ ^( u- t: aCeph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。9 E, d* n1 `6 o7 h( v
有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code。& P, i2 {% O4 m* }2 m
注意注意4 ^9 v; `' X: B% v
使用 FileStore 时,除非已配置缓存层,否则无法通过 RBD 接口访问纠删码存储池。请参见第 14.5 节 “纠删码存储池和缓存分层”了解更多详细信息,或使用默认 BlueStore(请参见第 1.4 节 “BlueStore”)。. {4 } j6 {# `
13.1 纠删码存储池的先决条件 REPORT DOCUMENTATION BUG#EDIT SOURCE
: ^) V/ \6 J; h' {5 o3 k- Y要使用纠删码,您需要:) X% W. [% @5 F: D: O) R+ j
在 CRUSH 索引中定义纠删码规则。 x$ L7 i5 a {) ~6 i0 L* G
定义指定要使用的编码算法的纠删码配置。
- x- t6 o( z, R创建使用上述规则和配置的存储池。
* L( F' Y# A% }5 v) E$ G# x/ b M5 A8 S请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。& ], H2 r8 M/ D' M. t+ Z' n
确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 9.3.2 节 “firstn 和 indep”。
3 {! k- Z7 F: ]13.2 创建示例纠删码存储池 REPORT DOCUMENTATION BUG#EDIT SOURCE
* C0 l, @: S) E: z, @" d5 F最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。
% H! P9 S2 d. S, F命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。/ \) @& P, G; W5 J
ceph osd pool create ecpool 12 12 erasure. ]' t' m& y Z5 q* W( g
pool 'ecpool' created3 E( N% z& } B @
COPY CODE& ~/ t8 E: R( w3 v$ S- ]0 h% q6 g
字符串 ABCDEFGHI 将写入名为 NYAN 的对象。3 z1 p5 u4 ?, G1 }% }& ^
echo ABCDEFGHI | rados --pool ecpool put NYAN -' T3 D- s* \9 O/ |9 n' M
COPY CODE h; Q; N! j4 C. [6 U# T* J
为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。
! ?* P C. h$ E, j/ `! K要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。
# w7 B* U. D0 o& jrados --pool ecpool get NYAN -( P; q2 O. P2 o: h) p
ABCDEFGHI
1 n0 T+ K; L8 Q$ `5 CCOPY CODE
$ X0 x1 A* l: }' n1 E( `( f5 H* Z13.3 纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE
1 U+ p& ]8 Z/ X( p1 w5 J调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。
; O- r) o5 t3 v" v7 R! [$ n1 ` f" y纠删池配置所需的定义:: |2 \- R2 Y G# r3 H2 ?
chunk
& Z2 u6 {) C" A) k! M3 _0 N如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。1 Z% }. {# W# D
k: m! o& |2 y" h) N5 _8 |3 `0 n+ n
数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。7 } D& Y d/ [& L. H# ], ~) O
m
5 h- K y# U* g$ C编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。
4 |+ C7 |; I# }7 a8 U0 ucrush-failure-domain' @+ A2 D6 F D& I- T) s
定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 9.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。
9 g/ j6 F( C& `, \) O使用第 13.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。
9 e/ c0 k7 K! ^可使用以下命令显示默认配置的设置:( R. L5 d/ R( {8 k$ x7 L/ d( W
ceph osd erasure-code-profile get default/ l) |2 X+ ^! S& Z" [2 H
directory=.libs$ s+ x: N$ T8 w9 H, S- F
k=2- T% ]5 W! j8 m: r$ o
m=1' @0 a+ P% V8 ~
plugin=jerasure2 j$ a$ T/ A/ O7 }' u* h: h
crush-failure-domain=host! e' ?+ _( d# j0 Y2 H
technique=reed_sol_van
$ s, @/ e% H2 SCOPY CODE" e7 r6 Z& q R: M. q* ?/ r
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 11.3 节 “存储池迁移”)。
1 C; E9 t7 M; [最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:- w- b! |8 M' A+ H
ceph osd erasure-code-profile set myprofile \ ^6 z( B' [" Q) A5 k/ Z
k=3 \5 R* P0 j& W3 d" ~5 F1 s T( ^
m=2 \
0 u: ~) r% M+ g6 l0 C crush-failure-domain=rack
# U# u: J& N: I2 g- fCOPY CODE
4 q) m0 d5 |' t; Q对于此新配置,可以重复第 13.2 节 “创建示例纠删码存储池”中的示例:$ t3 ?. h7 q% ?. Z
ceph osd pool create ecpool 12 12 erasure myprofile) o6 g: {- }8 p- R% o9 G ^
echo ABCDEFGHI | rados --pool ecpool put NYAN -7 H/ y, s. t% {2 w! ?5 h, F# ` J
rados --pool ecpool get NYAN -% a" D( |# I. [5 u6 b- o9 M* x
ABCDEFGHI N! G3 f& |- i; h
COPY CODE$ D, f+ a6 [& s% e
NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain==rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。
6 U) h% x. V/ \; ^3 |1 c+ m
! H+ S4 i$ U2 \! j: A13.3.1 创建新纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE* E' ^/ S8 R; W
以下命令可创建新纠删码配置:
1 X/ x3 r3 [" r( M. T+ Xceph osd erasure-code-profile set NAME \
7 z8 S; Z- K7 y# E& R directory=DIRECTORY \8 g+ P0 ]! ^& V, [: R
plugin=PLUGIN \
1 s; c' }; {5 O* ] stripe_unit=STRIPE_UNIT \
3 j3 T# \ k8 L9 x' p KEY=VALUE ... \, K0 N; h3 V: `$ R+ A/ K n8 ?( r
--force
6 Q r& c7 o, t* ~, u/ k/ ]2 j2 dCOPY CODE
' T# U) I# | t5 T+ TDIRECTORY! |. ?9 m. X! ]3 W: H+ z- V
可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。
+ b% C3 n( c# Q* qPLUGIN4 C( w" f/ @) {% } t$ a1 s' R
可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。% i/ c+ _. G! H; Q; s" F
STRIPE_UNIT; a9 r# h. I- j/ d, B5 ?
可选。数据块中每个条带的数据量。例如,如果配置拥有 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 T2 I& j7 b5 }KEY=VALUE7 @+ q2 _! m Y% U* j
专用于选定纠删码插件的选项键/值对。
! ]. C: {; F1 n9 F7 q+ b--force3 _) n2 e" n( U' C, v
可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。. y' l _5 x( ]& c8 b- A* N$ O
13.3.2 删除纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE
0 ^% U5 G& E/ Q% v( k+ _* Q4 r以下命令可按 NAME 所标识的纠删码配置删除相应配置:1 ^, C* x4 _! P3 p( E( o
ceph osd erasure-code-profile rm NAME. k% k* I: f2 K
COPY CODE' v4 s# y9 k6 g4 O2 S; P
重要重要: F' e3 {1 D8 Z
如果某个存储池引用了该配置,则删除将会失败。
5 t# g& _3 M. _3 \6 t$ l4 b13.3.3 显示纠删码配置的详细信息 REPORT DOCUMENTATION BUG#EDIT SOURCE
! ?& Y' f3 b4 W1 \1 f9 q+ x以下命令可按 NAME 所标识的纠删码配置显示其详细信息:/ a( W" V7 G8 Y/ d+ s0 ]: N7 D+ ~0 H
ceph osd erasure-code-profile get NAME
/ R2 q/ r/ i* ], \ S1 Y. S! u3 kCOPY CODE2 n$ M& T6 p: X. u/ U. \( U
13.3.4 列出纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE+ A- m$ [% e, ^7 `1 }* i3 {) ]
以下命令可列出所有纠删码配置的名称:" I( {6 [. T5 u+ e
ceph osd erasure-code-profile ls# f! ?* x& b1 U, r# K
COPY CODE
& l# U J c/ A/ E7 c13.4 含 RADOS 块设备的纠删码存储池 REPORT DOCUMENTATION BUG#EDIT SOURCE9 O% R3 i! K/ |# f2 u6 U
要将 EC 池标记为 RBD 池,请对其进行相应标记:! P) e% H2 n& K; w
ceph osd pool application enable rbd ec_pool_name+ T; E5 I7 c" @3 O& e- O7 q
COPY CODE
# T" ?3 X. e7 L$ H5 @$ FRBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:0 [8 C$ g% s0 T3 G* ^2 G `
rbd create rbd/image_name --size 1T --data-pool ec_pool_name
3 C0 k4 Z9 K8 C3 Q/ q9 MCOPY CODE
\: h" I# t2 Z3 [2 |; G& K1 m3 L( I3 L您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。
8 c2 p2 v6 `+ @* H6 { _$ ^ |
|