|
|
将存储池与应用关联8 W5 j* x- @, x/ r; n7 k; y
在使用存储池之前,需要将它们与应用关联。将与 CephFS 搭配使用或由对象网关自动创建的存储池会自动关联。需要使用 rbd 工具初始化要与 RBD 搭配使用的存储池。5 w7 s. q3 @! \6 f. J8 }
) l9 R9 t1 Y6 P" W" p; D0 D* b: O1
2 d! o0 m4 U( A: D1 k root # ceph osd pool application enable pool_name application_name, Q& j- u; q% o; d. p
9 ~# V. N; a8 R2 ~
一个存储池可以与多个应用关联,每个应用都可具有自己的元数据。可使用以下命令显示给定存储池的应用元数据:5 a, t: o9 F* q7 a
+ p8 b. v0 u g6 W1 ]' T+ d8 M
1* Q' A+ w8 c: c" u( x
root # ceph osd pool application get pool_name0 p* E) s1 U# f
1 I. ~9 W6 M# k
操作存储池8 g# `0 T& e) Z& R k; m7 D1 D9 y
了解如何列出、创建和删除存储池,以及如何显示存储池统计数字或管理存储池快照。; W; B9 G5 |9 O; s) D" x% S% R8 k6 `- k
列出存储池
9 t9 q @0 V7 P9 t要列出集群的存储池,请执行以下命令:6 u* p9 T; T5 l- {
) |4 R& _# J# D; ` root # ceph osd lspools2 d& e) W" q( p& B. w# Y* N
0 rbd, - F+ y: t3 G! `8 Z) g2 ^
1 photo_collection,
8 v4 b. O' v6 N% z# u" _0 i2 foo_pool,
# N, L1 B, @8 [' B; v3 }/ T+ S) b& v& z0 _7 N7 ^! [
创建存储池4 [0 H5 E7 M" v3 y3 e& E
要创建副本存储池,请执行以下命令:4 y9 m7 f, G% B- F
0 v% Y3 B& [2 o1
7 _- k5 f+ u) M) m root # ceph osd pool create pool_name pg_num pgp_num replicated crush_ruleset_name expected_num_objects9 F4 |, x5 V) O# g/ }
; Y& d4 y# O0 P! J: G0 J: N
要创建纠删码池,请执行以下命令:
0 z& R; k$ d( n; L9 [' a3 ^+ ~/ y) q; e9 Z
1
; D5 e0 i; E: i; t' [% d! K: b root # ceph osd pool create pool_name pg_num pgp_num erasure erasure_code_profile crush_ruleset_name expected_num_objects
$ X" s# r4 D2 ~& U5 v
0 r5 ?# b7 T8 g7 Z2 K' R0 Apool_name
* ^; \4 H! M) q# V. A1 S存储池的名称,必须唯一。必须指定此选项。2 W' G1 w7 E, K) B
pg_num
- G- \/ O! S8 `; I7 ` y存储池的归置组总数。必须指定此选项。默认值是 8。
2 b& @: F9 }( _0 e, zpgp_num
' {7 [, V2 _+ k3 H2 d* e用于归置数据的归置组总数。此数量应该与归置组总数相等,归置组拆分情况除外。必须指定此选项。默认值是 8。
/ U8 H, @9 X( O5 xpgp_type4 ` ?* l1 X8 _+ N& D' _+ v f
存储池类型,可以是 replicated(用于保留对象的多个副本,以便从失败的 OSD 恢复)或 erasure(用于获得某种通用 RAID5 功能)。副本池需要的原始存储较多,但可实现所有 Ceph 操作。纠删码池需要的原始存储较少,但只实现一部分可用的操作。默认值是“replicated”。, Z/ ^' p7 N& ~/ T9 G- d/ a. V
crush_ruleset_name
6 s" O1 V% y, x4 |: D Y* P此存储池的 crush 规则组的名称。如果所指定的规则组不存在,则创建副本池的操作将会失败,并显示 -ENOENT。但副本池将使用指定的名称创建新的纠删规则组。对于纠删码池,默认值是“erasure-code”。对于副本池,将选取 Ceph 配置变量 osd_osd_pool_default_crush_replicated_ruleset。
% L5 Q2 r% [! T T8 x2 Jerasure_code_profile=profile) t" d9 i, U. a+ ?# B& P: W5 P
仅适用于纠删码池。使用纠删码配置。该配置必须是 osd erasure-code-profile set 所定义的现有配置。
7 o2 o$ A0 z1 {4 `9 z( ^# Xexpected_num_objects! |% I1 g( F: {
此存储池的预期对象数。如果设置此值,PG 文件夹拆分发生于存储池创建时。这可避免因运行时文件夹拆分导致的延迟影响。
% a; C8 K. u1 h* v设置存储池配额
) p. W5 ]: C1 e5 y( q您可以设置存储池配额,限定每个存储池的最大字节数和/或最大对象数。3 ~7 N9 F' _0 T% ?4 v
% l6 P6 _ L! `) G
1! J R8 R& g. H
root # ceph osd pool set-quota pool-name max_objects obj-count max_bytes bytes0 n" m7 r# _' j
' w( E* `' _$ z+ ?# h' o删除存储池9 m0 Q) K& X1 e( d6 L- W
存储池中可能包含重要数据。删除存储池会导致存储池中的所有数据消失,且无法恢复。6 i* E, X; Z$ [
不小心删除存储池十分危险,因此 Ceph 实施了两个机制来防止删除存储池。要删除存储池,必须先禁用这两个机制。& o2 h$ I* M. }; c/ j( G
第一个机制是 NODELETE 标志。每个存储池都有这个标志,其默认值是“false”。要确定某个存储池的此标志值,请运行以下命令:
* u: \& l, T2 R( `
: S& C5 e3 I) d' x, f/ L! h1 v: h0 c1$ {8 ]1 d6 R7 D% K8 C8 b
root # ceph osd pool get pool_name nodelete( t& B- ]& v, D) r$ K: m
; {$ T: [" L0 E
如果命令输出 nodelete: true,则只有在使用以下命令更改该标志后,才能删除存储池:
/ z2 |3 z& K( _. Y- [5 i
% m% G! u$ t9 V5 E( [8 Y1
) [! |- |! c4 e* [: Y: f ceph osd pool set pool_name nodelete false
% ]3 }! ]$ ~' G1 T$ s+ X% ] t) Y m. l
第二个机制是集群范围的配置参数 mon allow pool delete,其默认值为“false”。这表示默认不能删除存储池。
/ r0 p! K. t. U y& x* n若要规避此安全设置删除存储池,可以临时将 mon allow pool delete 设置为“true”,删除存储池,然后将该参数恢复为“false”:
$ b) j$ [9 u; G$ w) `! ]
, m7 B3 ~; I' |. g2 Y12 C2 ^+ z8 ?& W* O- B
20 g% F4 }. |* [1 L- i
3% ^1 z: y+ \. p) d
4
7 I) l% f6 @) ?% }# f5
- L W b% a/ @$ p5 q% g root # ceph tell mon.* injectargs --mon-allow-pool-delete=true
, k8 d2 c2 i( ?root # ceph osd pool delete pool_name pool_name --yes-i-really-really-mean-it
4 p. K' _" F& z: j* jroot # ceph tell mon.* injectargs --mon-allow-pool-delete=false0 O" Q8 \* {# H
; a3 C3 x" L) I/ P
injectargs 命令会显示以下讯息:
; N0 C9 ]/ E; p+ \' u n8 X; q
1, c# C8 [, K# K' [
injectargs:mon_allow_pool_delete = 'true' (not observed, change may require restart)& c& P3 v7 i* a9 f5 ?6 {( m
. V0 X" ]' N5 U& d4 ? M重命名存储池# e( X' m+ ^+ t' B* q
要重命名存储池,请执行以下命令:1 d) H: |9 y! P( G$ w' O5 e7 I9 i/ {
8 {1 ]9 G3 z4 `1
: A3 _/ z+ F; F, \" P6 J4 N& I root # ceph osd pool rename current-pool-name new-pool-name0 c7 A5 t9 ` n8 t ~" Z
5 U$ B' o) A: M+ S! M" h; ~9 z如果重命名了存储池,且为经过身份验证的用户使用了按存储池功能,则必须用新的存储池名称更新用户的功能。
7 A' q K& Q1 M. S9 I) O. ^显示存储池统计数字
9 U$ \$ S: v8 D0 a/ s要显示存储池的用量统计数字,请执行以下命令:
$ b) ~& h9 F9 [# Q; E* P% F) N, {# ~( Z7 r) v
root # rados df
5 B4 Q6 f! i3 Lpool name category KB objects lones degraded unfound rd rd KB wr wr KB
$ r2 d, B% R$ ^1 ~cold-storage - 228 1 0 0 0 0 0 1 2286 l5 Y( F: h* b5 |5 f8 G' x( y
data - 1 4 0 0 0 0 0 4 42 ?8 Y3 a3 e3 }6 Y; [* D
hot-storage - 1 2 0 0 0 15 10 5 231! E# `7 y7 M0 f5 H
metadata - 0 0 0 0 0 0 0 0 0! {3 T: Z. y% `1 O. |$ Q
pool1 - 0 0 0 0 0 0 0 0 06 A/ b' G' M/ Y
rbd - 0 0 0 0 0 0 0 0 0
+ |2 z% n- c" h' R$ U, H d( E) vtotal used 266268 7
4 Q# C6 a6 a" C* K' C& Jtotal avail 27966296
. R w# r3 ~2 D7 _7 O0 Utotal space 28232564
/ t1 R$ X6 P+ Y8 i; L- b
' A) f! a6 u4 ~' ]设置存储池的值! k/ V3 [) }: H# P; F
要设置存储池的值,请执行以下命令:
) F0 r, t9 X Z. i& E- Q- w9 V8 K6 R0 E" ^
1
, n# n1 M- F/ V% q1 b root # ceph osd pool set pool-name key value: F2 a* _0 \' i6 _/ r( n
( h' ?/ s; h4 ?1 A
2 n: H* K! |& Q M7 G# A1 P ) c& @; R# Y% J/ d: ]( r; x
size% @: }7 K, ~ A; T9 \3 s$ I
设置存储池中对象的副本数。5 b, q3 y+ x0 g# n1 H
min_size2 s- u) d4 ^8 E
设置 I/O 所需的最小副本数。
( i! M" q* s% hcrash_replay_interval
% `5 Q& Y, _% Y4 [" T0 n! c9 _" R* v允许客户端重放已确认但未提交的请求的秒数。
9 _9 V# s, s Y% @. C2 }2 apg_num
& r- l8 \2 @5 |$ \; R$ \存储池的归置组数。4 h* S' f% V1 \% k6 d
pgp_num, |1 n+ t- y: k- s9 a$ O2 n
计算数据归置时要使用的归置组的有效数量。
# K6 S& v" c" [0 L5 D2 g/ I. rcrush_ruleset
& T8 {& g: {" K0 e用于在集群中映射对象归置的规则组。
( n2 {; u. V' j# ahashpspool
' s3 _" ?) H! a8 ]; {, |为给定存储池设置 (1) 或取消设置 (0) HASHPSPOOL 标志。启用此标志会更改算法,以采用更佳的方式将 PG 分配到 OSD 之间。对之前 HASHPSPOOL 标志设为 0 的存储池启用此标志后,集群会开始回填,以使所有 PG 都可再次正确归置。请注意,这可能会在集群上产生相当高的 I/O 负载,因此对高负载生产集群必须进行妥善规划。1 z" x0 J! `: K6 v. q& k
nodelete- [0 `5 K4 W1 {6 u
防止删除存储池。" R+ t+ X! V/ w" s; a. L
nopgchange
3 U' y6 m$ T u1 u3 ~( c% H防止更改存储池的 pg_num 和 pgp_num。 B# R; ^! |* \) D
nosizechange' h/ V0 s8 l" w5 a: Q! |7 N
防止更改存储池的大小。; T5 R7 c' y! x* o) m" k% b2 `
write_fadvise_dontneed
; G6 O" \. J; F4 Q% ?对给定存储池设置/取消设置 WRITE_FADVISE_DONTNEED 标志。7 O% l9 f/ t2 {+ s$ A/ ?9 t
noscrub、nodeep-scrub
# c5 Y1 t' W% {& n9 [+ m+ z禁用(深层)整理 (scrub) 特定存储池的数据以解决临时高 I/O 负载问题。4 A; u" J; k' ]
hit_set_type" F' Y, S! H+ `
对快速缓存池启用命中集跟踪。请参见布隆过滤器以了解更多信息。此选项可用的值如下:bloom、explicit_hash、explicit_object。默认值是 bloom,其他值仅用于测试。2 X8 d8 R! [4 F. [: O: e3 @0 ?3 r
hit_set_count
( {/ Y" y ?6 `& Z1 X( r6 \5 W要为快速缓存池存储的命中集数。该数值越高,ceph-osd 守护进程耗用的 RAM 越多。默认值是 0。' Y5 F% W% e$ O: X
hit_set_period
$ r4 ^% V) N! `+ P4 Q快速缓存池的命中集期间的时长(以秒为单位)。该数值越高,ceph-osd 守护进程耗用的 RAM 越多。; y4 H( Y# t$ R! P
hit_set_fpp \4 b/ ^, i! J) l
布隆命中集类型的误报率。请参见布隆过滤器以了解更多信息。有效范围是 0.0 - 1.0,默认值是 0.05" `( L: U) R* _4 f: F4 W- b( g
use_gmt_hitset
( @9 P( s6 l% G* m为快速缓存分层创建命中集时,强制 OSD 使用 GMT(格林威治标准时间)时戳。这可确保在不同时区中的节点返回相同的结果。默认值是 1。不应该更改此值。9 e) @: o- [8 |6 |
cache_target_dirty_ratio1 I( q0 }8 H7 m k4 o
在快速缓存分层代理将已修改(脏)对象清理到后备存储池之前,包含此类对象的快速缓存池百分比。默认值是 .4& n2 ~: W: v$ v( c; {" E9 m* a
cache_target_dirty_high_ratio
$ Q: G& }% E& |. B6 ]" ?$ f在快速缓存分层代理将已修改(脏)对象清理到速度更快的后备存储池之前,包含此类对象的快速缓存池百分比。默认值是 .6。. A/ |' p: A- B3 [
cache_target_full_ratio
- W3 T' k: Z5 P# ?1 c: o在快速缓存分层代理将未修改(干净)对象从快速缓存池逐出之前,包含此类对象的快速缓存池百分比。默认值是 .8
9 a. R4 Z3 q5 w R" Ntarget_max_bytes
# c* S" z1 u& `; V" v触发 max_bytes 阈值后,Ceph 将会开始清理或逐出对象。* @ j' b7 q5 _9 ]7 `3 s
target_max_objects
: P7 d" T' B% n: R触发 max_objects 阈值时,Ceph 将开始清理或逐出对象。
9 {1 C* Z+ _# v& Zhit_set_grade_decay_rate
& W: ]- `1 Y: \0 C) m( g% b7 b4 B. r- Z$ P两次连续的 hit_set 之间的温度降低率。默认值是 20。
9 L T0 J {6 Q" ~% vhit_set_search_last_n4 C: q+ D" R/ L3 u, @& l5 c. J1 ~" @
计算温度时在 hit_set 中对出现的项最多计 N 次。默认值是 1。
5 Y& x% o! }# O! `/ dcache_min_flush_age7 `0 J! Y& k7 h H) Q5 d
在快速缓存分层代理将对象从快速缓存池清理到存储池之前的时间(秒)。# [* `8 ]/ P8 M) q+ y! D
cache_min_evict_age3 H3 {( d+ @+ ~/ x- Z
在快速缓存分层代理将对象从快速缓存池中逐出之前的时间(秒)。
" u" M# T R. c. e4 }5 m4 l3 S) Vfast_read3 A5 l/ m2 n3 ^' B/ e( K8 g
如果对纠删码池启用此标志,则读取请求会向所有分片发出子读取命令,并一直等到接收到足够解码的分片,才会为客户端提供服务。对于 jerasure 和 isa 纠删插件,前 K 个副本返回时,就会使用从这些副本解码的数据立即处理客户端的请求。这有助于获得一些资源以提高性能。目前,此标志仅支持用于纠删码池。默认值是 0。
6 u+ f- y8 U# vscrub_min_interval
1 S% ?+ ^6 D( B集群负载低时整理 (scrub) 存储池的最小间隔(秒)。默认值 0 表示使用来自 Ceph 配置文件的 osd_scrub_min_interval 值。3 S- x/ E5 E( `; p$ p/ j
scrub_max_interval
0 n" [( h: k/ J" P% v% D不论集群负载如何都整理 (scrub) 存储池的最大间隔(秒)。默认值 0 表示使用来自 Ceph 配置文件的 osd_scrub_max_interval 值。
# v6 b ^1 |4 A/ g; rdeep_scrub_interval$ u0 k- `0 r* J; _- a
深层整理 (scrub) 存储池的间隔(秒)。默认值 0 表示使用来自 Ceph 配置文件的 osd_deep_scrub 值。
' l" S& l9 N& E0 U% Y/ }9 [0 \9 u
: o) c' n9 k9 }' @( o P% \9 S' j获取存储池的值* n' K. Z" n8 G, o
要获取存储池中的值,请执行以下命令:
s: b% [4 V2 Q5 ^/ q; M( N
. O" l* D7 e( J- p1: T1 s' h7 i( w
root # ceph osd pool get pool-name key$ `* [ p: t! F+ i$ S% ]
- [! D' B5 P$ ]8 F& r/ B
9 e$ [# e- V* T$ ]0 B% ] pg_num T1 d6 u) r/ ?0 C0 a* F
存储池的归置组数。
6 k; _. V9 I Zpgp_num1 W$ j1 b$ U& Z% I
计算数据归置时要使用的归置组的有效数量。有效范围小于或等于 pg_num。; ]# k( v% j2 O; S8 J& a
5 z& w7 l/ H" G6 v' a" Z; |设置对象副本数% Y* U1 ?$ r f& ^# f
要设置副本存储池上的对象副本数,请执行以下命令:) h2 h! f& d* Q' u, e
+ @3 Z! ?4 _: K' h6 x, E
& f6 V5 o `7 N
root # ceph osd pool set poolname size num-replicas
- V. Y: i) h! ?- o( }/ D# ^' f0 qnum-replicas 包括对象本身。例如,如果您想用对象和对象的两个副本组成对象的三个实例,请指定 3。
" o& ?+ O# E0 _3 c) I
) e M7 f8 } l9 h获取对象副本数, B, }0 ]" P; K& l
要获取对象副本数,请执行以下命令:5 O2 M0 X+ D3 s# l6 _
0 F& M M/ D% B# K3 C( N8 l
1
* L# {% J% `( r. d4 @ root # ceph osd dump | grep 'replicated size'" m- ?; I' Y, G1 \. a/ X3 k
0 }0 f- ?- o, {: T! R1 f
7.2.11 增加归置组数
; T2 C6 V4 M& ^7 c3 D创建新存储池时,需指定存储池的归置组数(请参见第 7.2.2 节 “创建存储池”)。将更多 OSD 添加至集群后,出于性能和数据持久性原因,通常还需要增加归置组数。对于每个归置组,OSD 和监视器节点始终都需要用到内存、网络和 CPU,在恢复期间需求量甚至更大。因此,最大限度地减少归置组数可节省相当大的资源量。 B# B8 h& Q1 H+ X- _! Z6 A P" m
4 i5 g O/ Q7 L" v* b+ S7 P
1; @- ~6 i U6 m; {
root # ceph osd pool set rbd pg_num 40967 ]9 s8 B M$ z5 V [
4 G% F2 y1 s( p# }6 Z% o
添加存储池0 W/ |4 w% k6 Y; t$ w0 [
在您首次部署集群之后,Ceph 会使用默认存储池来存储数据。之后,您可以使用以下命令创建新的存储池: G, F$ T$ o- U4 p
8 a$ \' Z2 a, s8 i+ v1
9 V- ~2 [' }. s root # ceph osd pool create O# Y+ {6 y2 B- l) d$ V; h
$ M' u- q* V) ?# Q# `" {存储池迁移* N0 r) \1 r. n' I% O1 P5 l# @
迁移存储池的方法有多种。建议使用快速缓存层,因为该方法是透明的,能够减少集群停机时间并避免复制所有存储池的数据。1 w% V- {. }5 ^/ A
7.3.1 使用快速缓存层迁移
# I2 {5 f R2 ]- l* T5 m该方法的原理十分简单,只需将需要迁移的存储池按相反的顺序加入快速缓存层中即可。有关快速缓存层的详细信息,请参见第 10 章 “快速缓存分层”。例如,要将名为“testpool”的副本池迁移到纠删码池,请执行以下步骤:
/ `9 r; B6 ]8 I3 S创建一个名为“newpool”的新纠删码池:9 Q P: ]; k* F7 t+ I V% J
, |6 E. ?% r8 U% G# F4 r) f1
5 `* F6 U$ A2 T9 j2 h* f) ^ root@localhost > ceph osd pool create newpool 4096 4096 erasure default
" r+ ?% s! ^0 u6 w! C
8 o. H& k, b+ x. m0 T7 M您现在有两个池,即装满数据的原始副本池“testpool”和新的空纠删码池“newpool”:2 s4 j6 V+ Y9 Z6 N& J5 [/ V/ [* i
设置快速缓存层,并将副本池“testpool”配置为快速缓存池:$ z. P; x7 U, X& N% u* P e a
1 Z6 \1 q$ I9 a root@localhost > ceph osd tier add newpool testpool --force-nonempty
& L4 O$ @3 l5 N. s' t8 Froot@localhost > ceph osd cache-mode testpool forward
7 l7 T, a6 B7 l# }+ n0 k
% y" w) `/ k% B# q/ ?: D6 @, S- J+ _强制快速缓存池将所有对象移到新池中:
: \" r7 d; ]( L7 S# C
. U% g9 A. @7 c! H# s# | X: v1( g$ J3 ?% s6 M) S
root@localhost> rados -p testpool cache-flush-evict-all
- Z9 v+ m( v( `
+ p B, n: h( t a" P. q数据清理- o9 N) o& o9 |8 R. z2 i8 R
将所有客户端切换到新池。您需要指定一个覆盖层,以便在旧池中搜索对象,直到所有数据都已清理到新的纠删码池。
% Q+ `( h8 ]& u3 u, |5 c2 H
. a2 z/ N3 L+ h8 O A1& P9 N# @3 J4 o1 k1 v
root@localhost > ceph osd tier set-overlay newpool testpool
# T2 y6 I: h- P( M0 Z. K8 i! l4 f
3 f& Y1 x5 h, r+ g# H有了覆盖层,所有操作都会转到旧的副本池“testpool”:' ^2 ^9 }) H8 f0 c
设置覆盖层5 A' C7 v; U# h
现在,您可以将所有客户端都切换为访问新池中的对象。所有数据都迁移到纠删码池“newpool”后,删除覆盖层和旧超速缓冲池“testpool”:
- y( }" ]( |9 O: a" ~1 Y$ r# F
/ C$ N- s) b- A+ s1
' E, M O6 X. n8 N" x2& e2 X0 E6 s) T7 X, M0 b+ o
root@localhost > ceph osd tier remove-overlay newpool
7 o, C- v7 C! Oroot@localhost > ceph osd tier remove newpool testpool* q6 H2 J; W3 X
" N4 R" k% j" u7 E# @. c+ ]存储池快照
1 i! t. c9 b- e5 k$ s& c, u存储池快照是整个 Ceph 存储池的状态快照。通过存储池快照,可以保留存储池状态的历史。创建存储池快照可能需要大量存储空间,具体取决于存储池的大小。在创建存储池快照之前,始终需要检查相关存储是否有足够的磁盘空间。: f. S7 M& m2 p1 u6 h
创建存储池快照
1 i& I# Y" T# {要创建存储池快照,请执行以下命令:
! p; v/ S A7 L2 D
2 i$ o6 Y( p: S. u& p$ H root # ceph osd pool mksnap pool-name snap-name
: x* e" I5 j4 ~7 R) D( u: W例如:
J0 M$ p5 p2 }- |) q- c; n: C1 _root # ceph osd pool mksnap pool1 snapshot1
, Q3 q" P, n7 q f. Vcreated pool pool1 snap snapshot1
3 f1 w4 p6 ?8 M; y9 @) i
& i( l: h0 {4 a3 |; H" i删除存储池快照
! w0 H4 \1 K/ ?+ C, k要删除存储池快照,请执行以下命令:9 c& Y8 B: ^! z$ Q
g$ b5 @% x j1
5 _4 b5 j7 k6 I+ F root # ceph osd pool rmsnap pool-name snap-name! {' w7 q3 A/ o( \8 d& W, W1 w2 [4 [( y
( j, I, J+ V1 Y0 F |
|