|
|
纠删码存储池 REPORT DOCUMENTATION BUG#EDIT SOURCE
) _# c3 A+ d" n% U( Q13.1 纠删码存储池的先决条件
; N, F @3 q( i' B5 x1 E; E13.2 创建示例纠删码存储池
8 _- V; \ a8 F6 p* } a/ X& e13.3 纠删码配置
5 n0 f2 }7 @& `) z3 m2 u13.4 含 RADOS 块设备的纠删码存储池
7 l; p& u0 t' B# j- G1 d9 L8 \Ceph 提供了一种在存储池中正常复制数据的替代方案,称为纠删存储池或纠删码存储池。纠删码存储池不能提供副本存储池的所有功能(例如,它们无法存储 RBD 存储池的元数据),但其所需的原始存储空间更少。一个能够存储 1 TB 数据的默认纠删码存储池需要 1.5 TB 的原始存储空间,以应对发生单个磁盘故障的情况。从这方面而言,纠删码存储池优于副本存储池,因为后者需要 2 TB 的原始存储空间才能实现相同目的。
& D# _) a8 S" E6 q# z/ ^/ m有关纠删码的背景信息,请参见 https://en.wikipedia.org/wiki/Erasure_code。1 u# g# g/ P9 I/ }+ ~& Q
注意注意& U3 a9 x5 z" @3 h6 O& T3 j- D
使用 FileStore 时,除非已配置缓存层,否则无法通过 RBD 接口访问纠删码存储池。请参见第 14.5 节 “纠删码存储池和缓存分层”了解更多详细信息,或使用默认 BlueStore(请参见第 1.4 节 “BlueStore”)。, X4 D8 ^* G. q9 |; n' i: ^
13.1 纠删码存储池的先决条件 REPORT DOCUMENTATION BUG#EDIT SOURCE1 ~# v0 h. Q1 Y$ d9 W2 f1 O4 G
要使用纠删码,您需要:
- N) M( l8 s( q0 M+ R5 B! q4 c; B在 CRUSH 索引中定义纠删码规则。4 \' F) [) P# [4 A t [4 d! x0 E5 L
定义指定要使用的编码算法的纠删码配置。
( m/ d3 u1 O: K创建使用上述规则和配置的存储池。
7 F3 N6 J* j3 ?( U! {请记住,一旦创建好存储池且存储池中包含数据,便无法更改配置和配置中的详细信息。 i3 \& J" c( w3 n& M
确保纠删码存储池的 CRUSH 规则对 step 使用 indep。有关详细信息,请参见第 9.3.2 节 “firstn 和 indep”。
2 q& i9 y& J( G! ^0 f3 w13.2 创建示例纠删码存储池 REPORT DOCUMENTATION BUG#EDIT SOURCE2 o! ^, K) t/ } p |5 p" @0 W. r
最简单的纠删码存储池相当于 RAID5,至少需要三个主机。以下过程介绍如何创建用于测试的存储池。5 t4 T8 M: G R) Z8 q
命令 ceph osd pool create 用于创建类型为纠删的存储池。12 表示归置组的数量。使用默认参数时,该存储池能够处理一个 OSD 的故障。% r" m. B7 G' V1 t
ceph osd pool create ecpool 12 12 erasure
0 q; g1 O" H0 `9 H& l6 vpool 'ecpool' created) z$ P+ q! n$ u* [$ g% D
COPY CODE, l& C; L% `( O! Z8 }$ O8 K- x
字符串 ABCDEFGHI 将写入名为 NYAN 的对象。
) ~3 R* B' ?" |( U/ s. gecho ABCDEFGHI | rados --pool ecpool put NYAN -
$ M4 k! X8 G% o9 x1 @# UCOPY CODE
" l2 V% i: e" W为了进行测试,现在可以禁用 OSD,例如,断开其网络连接。
6 a; e$ g. \% X+ u要测试该存储池是否可以处理多台设备发生故障的情况,可以使用 rados 命令来访问文件的内容。4 R& j/ l, A3 X1 U5 m) e
rados --pool ecpool get NYAN -
: t- [- I8 f: O/ l1 AABCDEFGHI
; n* h0 w9 x' m e# F6 H+ s" E5 fCOPY CODE
* \' z: [8 m0 A/ h, Y: ` C3 x13.3 纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE8 F A$ n' k2 y& @
调用 ceph osd pool create 命令来创建纠删码存储池时,除非指定了其他配置,否则会使用默认的配置。配置定义数据冗余。要进行这种定义,可以设置随意命名为 k 和 m 的两个参数。k 和 m 定义要将数据片段拆分成多少个块,以及要创建多少个编码块。然后,冗余块将存储在不同的 OSD 上。. V: {: y$ A& m* F; O: w
纠删池配置所需的定义:
; P9 W3 L' O2 h- e, Lchunk2 \& v1 K, ?" e
如果调用该编码函数,它会返回相同大小的块:可串联起来以重构造原始对象的数据块,以及可用于重构建丢失的块的编码块。
1 k" B+ k4 c& g: z( H$ P3 ?/ R4 D: |k. D3 z0 C7 t% h8 `9 W* L% P2 {
数据块的数量,即要将原始对象分割成的块数量。例如,如果 k = 2,则会将一个 10 kB 对象分割成各为 5 kB 的 k 个对象。纠删码存储池的默认 min_size 为 k + 1。不过,我们建议将 min_size 设置为 k + 2 或更大的值,以防丢失写入和数据。) m$ y9 p) F2 m- p5 o6 V' H
m
. B g. b( H% S! b7 ^' s0 }( I编码块的数量,即编码函数计算的额外块的数量。如果有 2 个编码块,则表示可以移出 2 个 OSD,而不会丢失数据。
) l5 f6 Q" c2 ecrush-failure-domain0 l3 [/ s* }2 `& m9 C5 P
定义要将块分布到的设备。其值需要设置为某个存储桶类型。有关所有的存储桶类型,请参见第 9.2 节 “存储桶”。如果故障域为机柜,则会将块存储在不同的机柜上,以提高机柜发生故障时的恢复能力。请记住,这需要 k+m 个机柜。
; r* M4 r1 D6 E6 k使用第 13.2 节 “创建示例纠删码存储池”中所用的默认纠删码配置时,如果单个 OSD 或主机发生故障,将不会丢失集群数据。因此,要存储 1 TB 数据,需要额外提供 0.5 TB 原始存储空间。也就是说,需要 1.5 TB 原始存储空间才能存储 1 TB 的数据(因为 k=2、m=1)。这相当于常见的 RAID 5 配置。作为对比,副本存储池需要 2 TB 原始存储空间才能存储 1 TB 数据。
4 s1 P% v8 X9 O3 t2 q/ U可使用以下命令显示默认配置的设置:
9 p! y3 ^: r- h+ r. t; Qceph osd erasure-code-profile get default
1 I7 k$ r4 ?' ^directory=.libs
$ z: A- b6 a+ F2 Dk=27 T" X# q$ M, l! E; T2 H
m=1) R; h. A6 w2 W- K. F$ t; \
plugin=jerasure% A. f2 B9 h9 k7 h! r
crush-failure-domain=host3 o9 V0 U N) D- I
technique=reed_sol_van
7 Q n+ \5 N0 ]3 c& o) Z+ pCOPY CODE/ v; ~0 T9 U( a6 y2 Z, j6 n* E
选择适当的配置非常重要,因为在创建存储池后便无法修改配置。需要创建使用不同配置的新存储池,并将之前的存储池中的所有对象移到新存储池(请参见第 11.3 节 “存储池迁移”)。9 s4 g4 T6 i, ~) I8 h4 _
最重要的几个配置参数是 k、m 和 crush-failure-domain,因为它们定义存储开销和数据持久性。例如,如果在两个机柜发生故障并且存储开销达到 66% 的情况下,必须能够维系所需的体系结构,可定义以下配置。请注意,这仅适用于拥有“rack”类型的存储桶的 CRUSH 索引:) P( @" K! ~; H
ceph osd erasure-code-profile set myprofile \
9 g$ {0 j4 N0 T9 Y k=3 \# c' u# C$ ]5 j0 N a
m=2 \+ I! ]" a( k: L+ u) F, g1 o |/ J1 [( y
crush-failure-domain=rack
2 g9 Q9 `, f4 F; R% `# uCOPY CODE
" D9 [# t3 }5 h" q3 X. L7 f对于此新配置,可以重复第 13.2 节 “创建示例纠删码存储池”中的示例:, [; t9 E$ e) Q9 e! W
ceph osd pool create ecpool 12 12 erasure myprofile
9 l2 }" B3 B: t2 `echo ABCDEFGHI | rados --pool ecpool put NYAN -
) `# a- x8 r8 X" K; P! |8 \rados --pool ecpool get NYAN -, i, \# H( E! o
ABCDEFGHI' z! I2 h/ z" @
COPY CODE1 ?& w( A4 u6 D- N: s, M7 z2 b, i
NYAN 对象将分割成三个 (k=3),并将创建两个额外的块 (m=2)。m 值定义可以同时丢失多少个 OSD 而不会丢失任何数据。crush-failure-domain==rack 将创建一个 CRUSH 规则组,用于确保不会将两个块存储在同一个机柜中。2 N% v* L* x, Q
2 `: x; X% e" F* Y4 {" V. s
13.3.1 创建新纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE
5 U3 V6 |8 R- g3 s# L4 I1 d以下命令可创建新纠删码配置:% @. l( o9 l) B7 w3 c- n/ Q8 D' ?+ \
ceph osd erasure-code-profile set NAME \
/ S5 @" t& m5 Q9 ^, M) B0 k+ j/ I directory=DIRECTORY \
4 D6 Q: L7 f- b* P! e* ^ plugin=PLUGIN \9 A4 E4 S6 d3 _" Z4 R8 K! V5 C
stripe_unit=STRIPE_UNIT \
; R& Q) \$ z) @* [9 D3 D$ [, U KEY=VALUE ... \9 ~0 x& ~8 L$ R7 J/ v& V! Y
--force9 i0 w/ I5 F4 Q) s
COPY CODE
8 u2 Z4 {) U& \+ r! L; sDIRECTORY
; z5 g! P6 x' g" q' |可选。设置从中加载纠删码插件的目录名称。默认为 /usr/lib/ceph/erasure-code。
2 j0 c& c5 a" g7 o; e/ ~; {PLUGIN2 m- N/ c1 A. [& u: u
可选。使用纠删码插件可计算编码块和恢复缺失的块。可用的插件有“jerasure”、“isa”、“lrc”和“shes”。默认为“jerasure”。
7 L5 n6 R3 E4 y$ S! @7 I5 G7 V1 O: pSTRIPE_UNIT
8 g- C0 _6 }! f可选。数据块中每个条带的数据量。例如,如果配置拥有 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”。
Y: m$ ~: _4 b6 U( R5 MKEY=VALUE8 v+ k5 C+ w' G7 W# N% c* r5 _
专用于选定纠删码插件的选项键/值对。
6 T7 ~/ M! g; K) R/ Y( z--force
/ e1 v& ]0 `# T# \! |& i6 n0 B% g1 } l可选。覆盖名称相同的现有配置,并允许设置不按 4K 对齐的 stripe_unit。& Z5 [& f, P' b0 d0 F0 ^2 S0 s
13.3.2 删除纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE
# J* `# n- R8 f! y) W3 ~以下命令可按 NAME 所标识的纠删码配置删除相应配置:: c2 y) ^8 j1 I$ x$ ^0 W
ceph osd erasure-code-profile rm NAME" l# G, |7 n) N/ X G0 }7 Z5 c
COPY CODE) U! m4 R( _: U+ X& g! H) x) ?
重要重要
% w7 i0 k( g2 D如果某个存储池引用了该配置,则删除将会失败。
* l4 r% G1 C0 Z- r13.3.3 显示纠删码配置的详细信息 REPORT DOCUMENTATION BUG#EDIT SOURCE
/ y2 S- p0 g4 p' I: m8 U, P3 }以下命令可按 NAME 所标识的纠删码配置显示其详细信息:- o- N# j: @* o8 V8 c: ?
ceph osd erasure-code-profile get NAME
r4 W% d& d: W6 S% }COPY CODE
2 N( _( b2 O* r9 @6 y8 H3 q13.3.4 列出纠删码配置 REPORT DOCUMENTATION BUG#EDIT SOURCE2 _% T0 Q( R& L3 u" V, M: T2 J
以下命令可列出所有纠删码配置的名称:* v' b& H' n, q* M: v
ceph osd erasure-code-profile ls
9 ~8 m. G# Y. I0 m7 HCOPY CODE
8 x I$ F! A4 h7 V7 U13.4 含 RADOS 块设备的纠删码存储池 REPORT DOCUMENTATION BUG#EDIT SOURCE
- K2 x# Y* p7 I要将 EC 池标记为 RBD 池,请对其进行相应标记:5 Q8 `+ v5 v3 ^$ [ S! T; e
ceph osd pool application enable rbd ec_pool_name
! g' T3 U. ^5 b8 ]& MCOPY CODE
) y8 c0 S7 S' @' s, }+ @8 [RBD 可在 EC 池中存储映像数据。但是,映像报头和元数据仍需要存储在副本存储池中。为此,假设您的存储池命名为“rbd”:" T: ]" u' q3 n9 \
rbd create rbd/image_name --size 1T --data-pool ec_pool_name4 V; P0 Z3 b; @& M( b7 N/ [
COPY CODE5 q9 J2 q6 G1 r% g8 m' ~
您可以像使用任何其他映像一样正常使用该映像,只不过所有数据都将存储在 ec_pool_name 池而非“rbd”池中。- j$ J- m/ [. S) g3 y+ F
|
|