|
|
[root@host09 deploy]# ceph osd crush remove hdd
7 W' Y% w$ A, h3 u. ]removed item id -2 name 'hdd' from crush map: r2 T( W D" E* n8 {
& G9 q1 I5 E% f
# {1 `( A# |' v. X一、缓存池原理
! I" r( V+ }0 q8 d6 F* }( W: D* Z缓存分层特性也是在Ceph的Firefly版中正式发布的,这也是Ceph的Firefly版本中被谈论最多的一个特性。缓存分层是在更快的磁盘(通常是SSD),上创建一个Ceph池。这个缓存池应放置在一个常规的复制池或erasure池的前端,这样所有的客户端I/O操作都首先由缓存池处理。之后,再将数据写回到现有的数据池中。客户端能够在缓存池上享受高性能,而它们的数据显而易见最终是被写入到常规池中的。( J! k6 J0 L+ q, S+ N' v
! u4 `1 P1 X; O
& c4 v! a0 {" ]1 |2 v' ]; }
一般来说,缓存层构建在昂贵/速度更快的SSD磁盘上,这样才能为客户提供更好的I/O性能。在缓存池后端通常是存储层,它由复制或者erasure类型的HDD组成。在这种类型的设置中,客户端将I/O请求提交到缓存池,不管它是一个读或写操作,它的请求都能够立即获得响应。速度更快的缓存层为客户端请求提供服务。一段时间后,缓存层将所有数据写回备用的存储层,以便它可以缓存来自客户端的新请求。在缓存层和存储层之间的数据迁移都是自动触发且对客户端是透明的。缓存分层能以两种模式进行配置。 B; C4 [9 a9 l$ Z1 ~* g$ N
, `& L, I! a v* M$ W- C
writeback模式:当Ceph的缓存分层配置为writeback模式时,Ceph客户端将数据写到缓存层类型的池,也就是速度更快的池,因此能够立即接收写入确认。基于你为缓存层设置的flushing/evicting策略,数据将从缓存层迁移到存储层,并最终由缓存分层代理将其从缓存层中删除。处理来自客户端的读操作时,首先由缓存分层代理将数据从存储层迁移到缓存层,然后再把它提供给客户。直到数据变得不再活跃或成为冷数据,否则它将一直保留在缓存层中。6 ^- j- e/ E1 O- X+ [
+ J% }* O" x6 Rread-only模式:当Ceph的缓存分层配置为read-only模式时,它只适用于处理客户端的读操作。客户端的写操作不涉及缓存分层,所有的客户端写都在存储层上完成。在处理来自客户端的读操作时,缓存分层代理将请求的数据从存储层复制到缓存层。基于你为缓存层配置的策略,不活跃的对象将会从缓存层中删除。这种方法非常适合多个客户端需要读取大量类似数据的场景。
% D: O: j* F. y* o# @ j7 p0 f1 e$ i: W" R3 k7 Z9 k6 w
缓存层是在速度更快的物理磁盘(通常是SSD)上实现的,它在使用HDD构建的速度较慢的常规池前部署一个快速的缓存层。在本节中,我们将创建两个独立的池(一个缓存池和一个常规),分别用作缓存层和存储层。
# t% s- v5 N& d7 T& V
( N! d" U6 j) `' I6 i; o- f% S/ c: f7 ^
网上找了一篇一篇牛人写的存储分层在OpenStack的一个应用,将ssd池做cinder、nova、glance的缓冲。
+ L' z% v6 m2 f! i6 W. e9 b: ^0 E( U9 n5 f% r. _' u
二、理论与实践相结合
6 r! J* v. a* I8 d" }1 R! K% z1、下面开始配置以cache作为sata-pool的前端高速缓冲池。
) z% M3 n' V6 h: j, x- t& R9 w; _3 y, E9 Y# R( q8 E
1)新建缓冲池,其中,cache作为sata-pool的前端高速缓冲池。
3 G i6 h) C- ?6 Y Q: ^
4 {/ L6 T9 k( ^1 q1 q# ceph osd pool create storage 64" O U" ^2 Q ]- ?, Y2 L' N
pool 'storage' created |$ ?7 }+ [. A( R3 ^: Q4 p
# ceph osd pool create cache 64
/ z! Q" }8 p8 r! |pool 'cache' created. o) B! s; i3 R/ B) z* j8 w; J6 q
2 q4 z( d8 \! K. [* Q: G2)设定缓冲池读写策略为写回模式。4 N. g8 ~( V& B
ceph osd tier cache-mode cache writeback4 ]2 T' K i$ k0 o" o% i ~
8 ^- d3 r4 J& t
3)把缓存层挂接到后端存储池上" b% g' \% q6 r5 k& O
# ceph osd tier add storage cache
$ |5 t. e& {# W9 o$ ~; C- hpool 'cache' is now (or already was) a tierof 'storage'
& y6 R" X7 y: L. @% z$ k% E; S% O, L
4)将客户端流量指向到缓存存储池
9 j' Y' ?0 P+ O; m: R" T# ceph osd tier set-overlay storage cache# J4 w) J- Z$ Q; Q7 |2 x
overlay for 'storage' is now (or alreadywas) 'cache'& a7 d: k1 m4 P6 i- r% \" R, d0 Q, \
# @9 q- K+ K2 g4 m2 w+ V E' g2、调整Cache tier配置1 } A: g7 }/ M: T1 z) z, V
1)设置缓存层hit_set_type使用bloom过滤器0 y# {* P: B6 L4 v |* r! w+ b( c
# ceph osd pool set cache hit_set_typebloom
- L! i; l2 r- |9 N4 rset pool 27 hit_set_type to bloom; H5 w9 o* C# m: l D7 l) h
* _* f0 I s9 U& C. W9 q4 v
命令格式如下:: I ~0 L2 y0 V, o( t
ceph osd pool set {cachepool} {key} {value}
: C" y& l5 [3 |" j# S& Q/ U% ]4 E9 n2 a: ]$ }
关于Bloom-Filte[color=#444444 !important]算法原理可参见:
4 F1 Q! b- q+ w, p) f! n7 Uhttps://blog.csdn.net/jiaomeng/article/details/1495500: @* x5 H/ J. j* f0 e
" p+ n" f& C1 E* X* a0 N
2)设置hit_set_count、hit_set_period3 L! c0 Y0 a) _8 f7 K, W
# ceph osd pool set cache hit_set_count 1
+ v1 R' ~4 p6 S# aset pool 27 hit_set_count to 1
7 _& }" {0 _' O0 e! C6 M# ceph osd pool set cache hit_set_period3600* h6 v+ @4 O- K1 D. V8 `, I
set pool 27 hit_set_period to 36007 l8 A7 v" N( C' A4 }
# ceph osd pool set cache target_max_bytes1000000000000
8 M9 @& w5 C$ b0 S; Z# Xset pool 27 target_max_bytes to1000000000000; I' n% G2 k+ {6 S) j% U& k
' @) T# G/ z, j: }默认情况下缓冲池基于数据的修改时间来进行确定是否命中缓存,也可以设定热度数hit_set_count和热度周期hit_set_period,以及较大缓冲数据target_max_bytes。/ C) J& [! Z$ O! `; S# Q w$ G3 s
7 N/ I2 ^7 Y: E: E( Z5 g/ R
hit_set_count 和 hit_set_period 选项分别定义了 HitSet 覆盖的时间区间、以及保留多少个这样的 HitSet,保留一段时间以来的访问记录,这样 Ceph 就能判断一客户端在一段时间内访问了某对象一次、还是多次(存活期与热度)。8 q) D- A& Y; R3 X7 |# e! E, H; k4 U
0 V2 m) e0 f' O! t: E
3)设置min_read_recency_for_promote、min_write_recency_for_promote- e# N6 z8 r9 S
# ceph osd pool set cachemin_read_recency_for_promote 1
3 t. Y) c# m: k. n* z; sset pool 27 min_read_recency_for_promote to13 P6 x. M3 z) d) w2 ]- B( j
# ceph osd pool set cachemin_write_recency_for_promote 1+ k; T! B, U# W! R( {
set pool 27 min_write_recency_for_promote to 1, z7 _; b2 @3 g m4 k6 y6 ]
9 C, p5 [* I) i2 F! H9 ?缓存池容量控制# A) U+ }. r: K
先讲解个概念缓存池代理层两大主要操作; g# }/ I' e1 B. T$ ]2 P
0 G. d7 `& z0 W( U7 L4 }1 x+ G
·刷写(flushing):负责把已经被修改的对象写入到后端慢存储,但是对象依然在缓冲池。- U3 C; S$ S# I* ^1 x& i
·驱逐(evicting):负责在缓冲池里销毁那些没有被修改的对象。
# {6 G, {+ J/ T y. @$ S8 O
9 l# k4 `% Q) P& A' c缓冲池代理层进行刷写和驱逐的操作,主要和缓冲池本身的容量有关。在缓冲池里,如果被修改的数据达到一个阈值(容量百分比),缓冲池代理就开始把这些数据刷写到后端慢存储。当缓冲池里被修改的数据达到40%时,则触发刷写动作。
8 z$ _! O; q+ O6 e5 T2 K' @
x+ W2 ~" r( Y0 o% A# ceph osd pool set cachecache_target_dirty_ratio 0.4
& t- m' a1 W; w
( U; u# _$ {& Q, c1 B当被修改的数据达到一个确定的阈值(容量百分比),刷写动作将会以高速运作。例如,当缓冲池里被修改数据达到60%时候,则高速刷写。 {8 m9 @( I- m
6 Y6 m% {1 ~7 J I$ c2 [5 D% ]# ceph osd pool set cachecache_target_dirty_high_ratio 0.6
( Z% U) c0 n+ x2 z' }4 F9 ~5 w1 O3 @* J" `' ~ }+ H+ ^; q; J% T
缓冲池的代理将会触发驱逐操作,目的是释放缓冲区空间。例如,当缓冲池里的容量使用达到80%时候,则触发驱逐操作。
& ^9 M: M0 A% G& V3 B
/ X7 w+ M' r0 }5 |5 m% f# ceph osd pool set cachecache_target_full_ratio 0.8
~, I$ ~" G2 I; D$ Y) z' j2 _4 C! p" e4 T# E
除了上面提及基于缓冲池的百分比来判断是否触发刷写和驱逐,还可以指定确定的数据对象数量或者确定的数据容量。对缓冲池设定较大的数据容量,来强制触发刷写和驱逐操作。
* [8 X/ c8 q$ [$ C% z. n% \! W
0 Q. U+ f4 {$ ^# \: ]- X5 ]# ceph osd pool set cache target_max_bytes1073741824
& u2 J6 Q* S" j; q+ `0 f
& Q, B- ]1 L$ c* w$ }9 s5 f同时,也可以对缓冲池设定较大的对象数量。在默认情况下,RBD的默认对象大小为4MB,1GB容量包含256个4MB的对象,则可以设定:
: X. O: z4 ^* o6 _% \% h" g
- S& V, \0 w4 F# ceph osd pool set cache target_max_objects 256
; o5 h" Z. ?& E8 \0 @" F. m
; k& i) u# I5 k, b. @* ]4)缓冲池的数据刷新问题在缓冲池里,对象有最短的刷写周期。若被修改的对象在缓冲池里超过最短周期,将会被刷写到慢存储池。8 Q. M+ C- P6 w
# ceph osd pool set cachecache_min_flush_age 600
# o" ]& p& e1 m, }注意:单位是分钟1 S: Z0 H% K( M, A @5 ?
) Y: u4 B i3 [/ J
设定对象最短的驱逐周期。
( g+ S0 i! \% B6 K, s/ H' H2 d0 J# ceph osd pool set cachecache_min_evict_age 1800
4 W* c! b; @/ i1 r
; Q& ?; `4 P3 V, J# ?) L; A/ W6 n3、删除缓存层
3 Z+ j4 w( g0 Q! J S |! g7 R删除readonly缓存
! l5 p6 y( J$ {
8 X. v; j; I! F; v4 S$ m8 x1)把缓存模式改为 none 即可禁用。
0 h1 {. m' G* Q( d% Iceph osd tier cache-mode {cachepool} none4 T' f- ]1 _, O1 U/ c; b
7 h' I. l* D/ }! }5 s6 B: [, Y2 I# t2)去除后端存储池的缓存池。0 H: J) V0 M0 G* {' P) r
ceph osd tier remove {storagepool}{cachepool}: M8 [! G0 k3 F- c4 b# @
: `; a' Q* F z: x删除writeback缓存2 J' E% w' X* e& g) n9 f
1)把缓存模式改为 forward ,这样新的和更改过的对象将直接刷回到后端存储池: t/ a! r- e/ T4 \
# ceph osd tier cache-mode cache forward--yes-i-really-mean-it
w7 v. S! x: T- r% g' \' I6 H& ?! R$ G: aset cache-mode for pool 'cache' to forward
1 {4 R: y+ T) v% Q2 H) `
' b1 t9 _+ H2 q$ n$ S% c2)确保缓存池已刷回,可能要等数分钟' M m$ ]1 A7 y5 E4 y/ n
# rados ls -p cache
3 [. d' r( U- J% z' u: l: R
. z# Q" U9 v: {( M T& n5 Z' `) p可以通过以下命令进行手动刷回
: M8 c/ v; }8 B5 ]$ X! Z7 W# rados -p cache cache-flush-evict-all0 L& o+ a& g. E/ Y# S0 X6 g
& m' f) y" e: D8 R d+ J. j% j3)取消流量指向缓存池, Y. R0 O( L, b' c& j- v% ~
# ceph osd tier remove-overlay storage2 |2 O$ i7 o9 I" P# r, m6 _
there is now (or already was) no overlayfor 'storage'
, ?2 A4 K' n2 q! F
( [) \/ ~2 R4 R3 ~1 g6 L4)剥离缓存池
$ n6 S4 s* J# l4 l# x! s6 d9 ~# ceph osd tier remove storage cache
* A! N) r5 I$ x7 G- Kpool 'cache' is now (or already was) not atier of 'storage'
6 \0 p j9 b# u
1 B; f9 p& x. z8 C |
|