|
|
cephfs扩容方案
6 C( c; ?3 }$ \ L4 z% D. e) z8 ]' `# d }) A- p
需求描述
% a, U$ V+ c: I8 }0 U9 l2 ?, s& i3 B. O0 n8 D8 \- O$ y
建立完善的cephfs的扩容方案,满足cephfs用户数据存储空间在各种场景下的扩容需求。目前扩容只涉及到用户的数据存储,元数据部分因为空间使用率较低所以不需要考虑扩容。# A5 c) L. |$ R; }
f, p) X* a5 k' D: R1 f ?$ I
现有cephfs用户存储模型: M k7 p9 X/ f# P$ S6 [9 J
9 P( ]% g$ J0 X: w' b) `* m
目前单个用户会对应一个ceph集群里面的多个Dir目录,每个Dir目录底层会关联到两个pool,其中metadata_pool用来存储元数据,data_pool用来存储数据。
T( Y* u0 f0 L5 F' B8 @
6 o% \; p, D0 f7 t) I. d2 {# I
" |& R) T x8 R4 K0 {0 O( M2 e2 S
& Y- C5 C! t* h' o单集群扩容方案
, p3 R+ d5 n7 o6 p6 f6 w+ i2 t
9 v7 f1 N8 {+ P* F' i# C3 b通过filelayout进行扩容
( s9 `) y$ U2 q+ x! }$ w; H5 l1 m% E' | y9 d& M
基本原理; h$ i# t8 f p$ {
& }3 h0 T$ a9 u8 O W+ ~% n' W8 ~! V每个文件都有filelayout的xattr属性,其中包含一个关键的pool字段,用来指定存储文件底层用到哪个pool,因此利用该特性可以实现基于目录基本的扩容。
5 n3 [. q! g; n3 g' l1 K4 A A3 J' t, y8 O
参考 https://docs.ceph.com/docs/maste ... ata-pool-to-the-mds
1 U" ^& R, \5 X+ G1 S4 B! F) w1 o6 [7 P. W. H; F+ a
操作流程' B% e! D% q1 Z- H
) `3 [8 h, q2 ^ x3 R6 I
root@host1:/mnt/cephfs1# ceph df RAW STORAGE: CLASS SIZE AVAIL USED RAW USED %RAW USED hdd 952 TiB 861 TiB 89 TiB 91 TiB 9.52 TOTAL 952 TiB 861 TiB 89 TiB 91 TiB 9.52 POOLS: POOL ID STORED OBJECTS USED %USED MAX AVAIL rbdtest-site1-ssd-img 1 8.7 TiB 2.34M 26 TiB 24.58 27 TiB rbdtest-site1-sas-img 2 8.8 TiB 2.31M 26 TiB 3.63 233 TiB cephfs_metadata 3 85 GiB 116.05k 86 GiB 0.10 27 TiB cephfs_data 4 12 TiB 198.68M 36 TiB 30.65 27 TiB cephfs_pool1 5 121 GiB 31.04k 364 GiB 0.44 27 TiB sym_cephfs_data 6 656 KiB 13 3.6 MiB 0 233 TiB sym_cephfs_metadata 7 0 B 0 0 B 0 233 TiB kubernetes 20 152 B 6 192 KiB 0 233 TiB root@host1:/mnt/cephfs1# setfattr -n ceph.dir.layout.pool -v cephfs_pool1 /mnt/cephfs1/extest1/ root@host1:/mnt/cephfs1# getfattr -n ceph.dir.layout /mnt/cephfs1/extest1 getfattr: Removing leading '/' from absolute path names # file: mnt/cephfs1/extest1 ceph.dir.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 pool=cephfs_pool1" root@host1:/mnt/cephfs1/extest1# touch file2 root@host1:/mnt/cephfs1/extest1# getfattr -n ceph.file.layout /mnt/cephfs1/extest1/file2 getfattr: Removing leading '/' from absolute path names # file: mnt/cephfs1/extest1/file2 ceph.file.layout="stripe_unit=4194304 stripe_count=1 object_size=4194304 pool=cephfs_pool1"
' W1 I) s7 S G9 E6 t7 h1 f. f$ r+ b& i. S1 Q" ~! p
方案1. 同级目录扩容
0 w: I$ P% g9 J+ l; u3 f: X' I2 D2 e n9 K, B7 M$ G
如果业务侧能够按新增主目录方式进行扩容,则可以通过新增一个用户主目录,将新目录指向新的data_pool来实现扩容。
0 W+ A, B! v6 a! s: ~- J" [. j
7 \; p; r ]) h; n9 V+ J* @3 _优点:新扩容的pool不会对现有存储服务造成影响。& W7 v& v; }. e e9 w! m+ m, x
# S. g8 D7 J1 Q缺点:业务需要能够适配这种新增子目录的扩容方式。
. V1 x# q" r2 y+ d4 X; C
, J6 V9 }" c6 h& G3 x1 b, g6 p! Y8 C1 i+ E( Q- D; l3 ^: m
, H) F6 v' p4 |( K
方案2. 子目录扩容, q% d X$ K! `* A, m, F
% ]* t' n7 w c! o
如果业务侧只能在原有主目录中进行操作,则可以通过在原有主目录下新增一个用户子目录,将新生成的子目录指向新的data_pool来实现扩容。
5 |* \( Q [5 ?
5 i0 S' r. Y; P9 o优点:新扩容的pool不会对现有存储服务造成影响。
( Z( S5 K8 J" |3 F _, q- C+ C
/ \/ |; o7 E0 ]/ Q$ @9 n缺点:业务需要能够适配这种新增子目录的扩容方式。
( k: n6 p# S' ]' `% D" F- _
6 R# N* q8 h1 o# ?4 S M
* J: W N u ]3 `' i$ Q2 `7 ]# j: C! c- V ^! N9 w
通过新增OSD进行扩容
% I2 q: v; M# t* h' {5 o
" E: R, M s* L, ]/ e. |基本原理: Q. P' a" R, S+ V( c
( ?" d. ]: x# Q
基于原生底层分布式存储的基本特性,可以在原有的pool里面新增OSD进行扩容,但是新增OSD会导致旧有数据重新平衡,造成性能波动,影响服务质量。
/ c! M; h/ v% V! m- v( a) g! {* N
% J' m4 w& A7 y. D: Y4 N8 m: P方案3. 原有data_pool扩容) l1 ^* F4 [4 h% L. x) K3 g& V
2 X0 b l9 W, ]. R" [/ T3 o9 W+ b! X
通过在原有data_pool中新增OSD来实现扩容。) L! Y! Y2 }3 k; g6 M: m# g
8 L9 p4 P$ |7 x, A
优点:业务和k8s层面不需要做任何变动,完全对上层透明。) V+ w) H" @6 y6 |$ k% r
1 N" z" S+ ?% R' Z缺点:旧集群在新增OSD的时候会发生性能抖动,同时为了兼顾扩容速率和减少业务影响,相对扩容周期会比较长。受限与机房机柜和网络设备环境,有物理层面的上限。- J0 t( v* W& ]& l7 |) f, m! Z4 d! p
! ^+ c+ f/ {9 m# l
5 p. C4 f' U- Z, Z" q9 [4 W
1 E3 J h3 L0 y4 V" f1 Q多集群扩容方案; o" R2 V) C4 n: i1 i. @0 m
- J1 j q4 m l2 f( A. q方案4. 新增ceph集群, l; x: n5 ?6 U3 ~2 ^
% E. j4 d. H. r- I1 n9 D
受限于单集群规模存储集群的规模有限(受限机柜、网络等),单机房多集群、多机房多集群都会可能存在,因此这一块的存储扩容方案也会纳入设计范围。
. R5 k4 w) z9 D# F( h/ ]- B5 B5 t
$ H7 n$ w: E# @6 g; S# e优点:适配现有的单集群部署方案(1个集群跨3个机柜),相对来讲容易做故障域隔离(鸡蛋不放一个篮子里).扩容新集群不会对现有存储服务造成影响。
8 i( Q6 U( r* L m1 U
! J: Q3 j6 A8 ?缺点:需要业务能够适配这种跨集群模型(跨集群的目录数据不能互通),单个docker里面最好不要同时挂载两个以上集群的目录。k8s的存储资源调度复杂度上升,需要支持多集群。9 T+ ^7 n6 E# i$ L
5 x3 L& Y. A5 \9 B7 P4 m
2 ^3 E: `' k% q- G0 \0 ? |
|