找回密码
 注册
查看: 568|回复: 0

ceph 如何运维

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2023-3-17 10:06:55 | 显示全部楼层 |阅读模式
本文先介绍 Ceph, 然后会聊到一些正确使用 Ceph 的姿势;在集群规模小的时候,Ceph 怎么玩都没问题;但集群大了(到PB级别),这些准则可是保证集群健康运行的不二法门;) _( R) V! a+ J. s  N+ S
/ X8 O) d$ X. K/ w, Y' B. t3 x
Ceph 最初的目标是做一个分布式文件系统,直到现在这个目标也不能算完美实现;目前官网上对它的文件系统还是谨慎推荐的态度(不建议对线上核心业务部署);
6 w+ j) t4 T0 M
' Q0 c" b3 l: a5 o( f3 f( e业界使用 Ceph ,大多是用它的对象存储;
$ X0 \0 L# g6 {: o' ^3 t( j8 S0 y, {% S7 z$ C6 e
Ceph 客户端$ s/ Z! `  Q1 @( T7 T, Z
Ceph 支持三种存储接口:对象存储 RGW(rados gateway)、块存储 RBD(rados block device) 和文件存储 CephFS;, B' i4 O+ [* h" }2 @8 y2 F  _
  I- @/ B$ e1 L: d- m
这三个接口只是在客户端的封装库不同,到服务端了都是对象存储;, g1 ~1 x  ^9 d  h: z1 z% \& U
7 L' J9 }4 O) o6 V+ o& D; O

) U. g% M" v5 E% x9 l$ C对象存储(RGW:RADOS gateway)
" t( z7 `& Z9 p- Z. PCeph 对象存储服务提供了 REST 风格的 API ,它有与 Amazon S3 和 OpenStack Swift 兼容的接口。也就是通常意义的键值存储,其接口就是简单的GET、PUT、DEL和其他扩展;: o, _8 E* N( F' f" {( v

& H. i1 k+ R$ g& ~1 Y块存储(RBD:RADOS block device)
. Q! k  \7 S6 @  `/ s3 PRBD 是通过librbd库对应用提供块存储,主要面向云平台的虚拟机提供虚拟磁盘;RBD类似传统的SAN存储,提供数据块级别的访问;
1 g8 h/ @: L8 t5 p4 [7 V1 Q( N+ c
2 a: M% j7 C3 }) X5 R目前 RBD 提供了两个接口,一种是直接在用户态实现, 通过 QEMU Driver 供 KVM 虚拟机使用。 另一种是在操作系统内核态实现了一个内核模块。通过该模块可以把块设备映射给物理主机,由物理主机直接访问。
" f) @& X, v% g% i2 z; n; @% A
9 c# A& m2 j! X: [( H) d* @文件存储
7 t7 z1 x0 s2 d- Q* [0 X) KCeph 文件系统服务提供了兼容 POSIX 的文件系统,可以直接挂载为用户空间文件系统。它跟传统的文件系统如Ext4是一个类型,区别在于分布式存储提供了并行化的能力;7 C- P: j. s  @1 N( c
( Q, x1 {3 D8 M! n
原生接口
* r' E; r1 Z9 M) e  ^7 R7 s除了以上3种存储接口, 还可以直接使用 librados 的原生接口,直接和RADOS通信;
8 S: L. a0 k: }& Q0 Q* M! B. G. _6 i" z. O; ^3 o8 K
原生接口的优点是是它直接和和应用代码集成,操作文件很方便;但它的问题是它不会主动为上传的数据分片;一个1G的大对象上传,落到 Ceph 的存储磁盘上就是1G的文件;9 H2 C1 a( s- A5 Z: a' }. n

) V) c1 r1 u! _4 R' d6 l而以上三个接口是具有分片功能(即:条带化 file-striping)1 B+ U' ~; t8 E1 u

0 E2 L7 u. \0 Y# R: U) e' cPS:两个对象的区分; b' J" J- A# n* Z7 Q

% a/ s" B/ k- N+ ]( A* R0 W需要说明下,这里提到两个对象的概念:一个是 RGW中的对象存储,一个是 Ceph 的后端存储的对象;这两个需要区分:
+ s  |: F" @0 p6 `* t+ H. E. `2 |
& R" b7 E5 ^/ L# [6 }9 d9 e4 W# O第一个对象面向用户,是用户接口能访问到的对象;& ]" n2 T% p. M% T" [/ N
2 D, y: j/ K# d; P. D0 c
第二个对象是ceph 服务端操作的对象;+ N% p' K7 [" ?5 m3 Y' S
- W; I- e0 ?6 I+ N7 `
eg:使用RGW接口,存放一个1G的文件,在用户接口看到的就是存放了一个对象(1);而通过RGW 分片成多个对象(2)后最终存储到磁盘上;3 e8 w" ]3 C) N7 O) u

5 ~4 l: ^( c: W9 u( n
) A% ^: u' }# C9 qCeph 服务端
7 J: l) U9 O. ?' B; b5 s% r. D* @( _" X( W1 z: J- A
! d' Y2 m3 m8 C& J- M- G5 h
服务端 RADOS 集群主要由两种节点组成:一种是为数众多的、负责完成数据存储和维护功能的OSD(Object Storage Device),另一种则是若干个负责完成系统状态检测和维护的monitor。
/ U$ w  a9 _$ g! t4 O+ Q
1 {& ]$ J/ V5 l2 I5 _! J8 tMonitor
: x0 e1 ?# [6 ^; `Monitor 集群提供了整个存储系统的节点信息等全局的配置信息,通过 Paxos 算法保持数据的一致性。! R% L0 D, H2 v

  h0 p" l# m7 _9 Q& }# CPool 、PG和OSD7 P0 K2 t) A3 ^! g
Pool是存储对象的逻辑分区,它规定了数据冗余的类型和对应的副本分布策略;支持两种类型:副本(replicated)和 纠删码( Erasure Code);目前我们公司内部使用的Pool都是副本类型(3副本);/ T# U) V1 g9 |6 Y4 u) F1 i

9 D4 g* j$ n$ P1 hPG( placement group)是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略;简单点说就是相同PG内的对象都会放到相同的硬盘上; PG是 ceph的核心概念, 服务端数据均衡和恢复的最小粒度就是PG;
% S2 O1 B6 E. h0 A% k( N& Z& o' {
OSD是负责物理存储的进程,一般配置成和磁盘一一对应,一块磁盘启动一个OSD进程;* Q  K: H+ d) g3 t6 B6 H
$ r. M- a. w) ~. f+ s
下面这张图形象的描绘了它们之间的关系:0 W& H& x+ m6 T  I( l
' u: t2 C. C2 T% s
一个Pool里有很多PG,& v+ E5 m+ L4 N0 M' K7 ~6 J$ h( F
一个PG里包含一堆对象;一个对象只能属于一个PG;
4 b: w1 i4 b, l" h/ Y- ePG有主从之分,一个PG分布在不同的OSD上(针对三副本类型)- u- a2 Q0 B$ n: c/ o, d6 ]

. \: _# ~! t- d
5 Q/ T: ]: I. |) s8 F% k8 a' l讲究的PG
4 Z. \6 v6 i. T& o5 ?8 c) b1 }& n& F9 ?# L0 g+ {; I' b$ h/ b
一个Pool里设置的PG数量是预先设置的,PG的数量不是随意设置,需要根据OSD的个数及副本策略来确定:
0 @3 t' Q* V" V8 S0 g5 g; d) `, [4 @7 ~/ t$ L4 y( ~
Total PGs = ((Total_number_of_OSD * 100) / max_replication_count) / pool_count. D0 S: |' @! k5 T
7 M" t. d. Y3 J% ?7 p- I

; Q' C+ z1 P8 v6 `& q" _( n1 d线上尽量不要更改PG的数量,PG的数量的变更将导致整个集群动起来(各个OSD之间copy数据),大量数据均衡期间读写性能下降严重;
( P7 c% m. t+ O: X
, b  g, l# }5 p& ]良好的工程实践建议(掉坑后的教训):; A: o. w6 M' N' C
预先规划Pool的规模,设置PG数量;一旦设置之后就不再变更;后续需要扩容就以 Pool 为维度为扩容,通过新增Pool来实现(Pool通过 crushmap实现故障域隔离);
" S6 [2 N! `/ _; _/ v+ p9 I$ \" ]+ ?& Z  ]8 T# a3 B5 ]
对象的寻址过程- i5 t5 H9 g& G7 O! l/ i
查找对象在集群中的存储的位置,具体分为两步:6 k5 U; D: }& O6 S
第一步,对象到PG的映射;将对象的id 通过hash映射,然后用PG总数对hash值取模得到pg id:5 j$ {: _, [+ v4 y0 F$ k9 R/ V* G
8 M/ A0 ?1 t( k
pg_ id = hash( object_ id ) % pg_num) E4 @! L  ^1 v9 g3 A

2 H# G' x" C) v$ O# W6 y, C0 Z& M' o) T, ^4 \- J
第二步,PG到osd列表映射; 通过crush算法计算PG 上的对象分布到哪些OSD硬盘上;: U: F0 K- R: _3 |
. M! m) m' l: w1 a$ y9 d4 [
CRUSH(PG_ID) =⇒ OSD. i# [" l, A. E+ N! z3 Q1 ~
CRUSH算法是 ceph的精华所在;( Z! u4 V: M3 o# Y" u* D+ z# ?- q7 ^
+ s" B1 A* `# F9 F+ k* v
crush的目标! r" U; f2 W' N' {; ^5 ]7 v* o% [
先看看crush算法的希望达成的目标:7 j* l2 H+ E2 x

0 d0 _$ j% S. ], {: ?数据均匀的分布到集群中;
9 Z0 o! O( m6 u需要考虑各个OSD权重的不同(根据读写性能的差异,磁盘的容量的大小差异等设置不同的权重)
! h% n3 F0 w; U; u  o6 o当有OSD损坏需要数据迁移时,数据的迁移量尽可能的少;- {) k" E+ j5 l& O0 d0 T" Z
crush算法
6 s' |: O; x& _4 L! M9 r; K简单说下crush算法的过程:
! g- U1 @) X/ t! J9 v9 J8 j& k% E$ q) |% k第一步输入PG id、可供选择的OSD id 列表,和一个常量,通过一个伪随机算法,得到一个随机数,伪随机算法保证了同一个key总是得到相同的随机数,从而保证每次计算的存储位置不会改变;
# s& i/ @. W7 b$ q0 i- E7 |% O: G, ]7 f; }4 l
CRUSH_HASH( PG_ID, OSD_ID, r ) = draw
; y: j; _8 {( d5 Y5 P, R% t) o第二步将上面得到的随机数和每个OSD的权重相乘,然后挑出乘积最大的那个OSD;/ a* h4 ~, {- f4 H, D+ ]+ B
* o* E' N3 W, J+ L# c9 \
( draw &0xffff ) * osd_weight = osd_straw
5 O/ |; @2 v$ B- W: {% r3 Z在样本容量足够大之后,这个随机数对挑中的结果不再有影响,起决定性影响的是OSD的权重,也就是说,OSD的权重越大,被挑中的概率越大。
4 N7 K4 b1 d! \5 I5 X) B到这里了我们再看看crush算法如何达成的目标:2 U. l% D. t: E; t9 J
通过随机算法让数据均衡分布,乘以权重让挑选的结果考虑了权重;而如果出现故障OSD,只需要恢复这个OSD上的数据,不在这个节点上的数据不需移动;5 A+ Y& r' g8 `
$ [) M4 ~, P/ E8 y( r# J7 Q- L2 f7 S
crush优缺点
' {8 I5 C5 p& s( h聊到这里,crush算法的优缺点就明显了:" U* I- g" V" }; D  x
优点如下:0 s" |' V! f7 V4 r2 P3 M
/ V5 l  C6 l; Y* E! `0 J6 |0 u
输入元数据( cluster map、 placement rule) 较少, 可以应对大规模集群。
7 y3 W* h, o" S5 x; h" e- K可以应对集群的扩容和缩容。
6 b/ U$ v$ ?5 K0 z7 ^采用以概率为基础的统计上的均衡,在大规模集群中可以实现数据均衡。; c/ n8 c  i/ w; _
缺点呢:5 e: _5 o3 y. E7 B9 j7 f
" d! ]# |2 `. f, t& F
在小规模集群中, 会有一定的数据不均衡现象(权重的影响低,主要起作用的是伪随机算法)。3 X6 B, n( U% w: `
看清楚了寻址的过程,就明白为啥PG不能轻易变更了;PG是寻址第一步中的取模参数,变更PG会导致对象的PG id 都发生变化,从而导致整个集群的数据迁移;* P0 U/ R3 ?% f# y" P9 S4 R

. S7 g$ e. m( u0 a* g这里只是做个引子,关于crush算法,这篇文章讲的通俗直白,有兴趣的移步:大话Ceph--CRUSH那点事儿
" ~2 x( G9 }2 x' h. o' o; C+ Q& O7 {' d' `: D4 T( X' p; }
Ceph 是Sega本人的博士论文作品, 其博士论文被整理成三篇短论文,其中一篇就是 CRUSH,& l* z4 Y2 {4 k; Z+ ^7 S0 o5 L
CRUSH论文标题为《CRUSH: Controlled, Scalable, Decentralized Placement of Replicated Data》,介绍了CRUSH的设计与实现细节。. e% Z+ R! V2 D
(PS:另外两篇是 RADOS和 CephFS, 分别讲 Ceph 的服务器实现和 Ceph 文件系统的细节实现)
  g! f& d2 u$ B- O% V9 X
2 Q: Y& W! g! q' O4 K故障域的划分( Y  [/ ~7 ]0 W* a+ b
刚开始接触 Ceph,通常会忽略 crushmap,因为即使对它不做任何设置,也不影响我们的正常使用;, o9 ?/ K* s& b! i& r7 ?% n% `
一旦集群大了,没有它集群就处于一个危险的运行状态中;
/ h2 n: |9 t' E, b1 y9 _% l没有故障域的划分,整个集群就处于一个未隔离的资源池中;
6 Y+ [! R/ x' K7 E一个对象存过去,可能落在 500个OSD硬盘的任意三个上;0 h) G( X( R! Q5 I% ?- |4 I. F
如果一块硬盘坏了,可能带来的是全局影响(副本copy,这个硬盘上丢失的PG副本可能分布在全局各个硬盘上);
/ U' `" W- v. e) {7 }3 v# f
7 f; {2 ~: B% P) b8 H4 G% x使用crushmap 将整个集群的OSD 划分为一个个故障域,类似将一个集群按业务划分成为了多个小集群;每个Pool 只会用到特定的 OSD,这样,一旦某个OSD 损坏,影响的只是某个业务的某个Pool,将故障的范围控制在一个很小的范围内。
0 J" _9 H8 j, k- e4 E2 K) {  s/ s$ b3 G" v; z/ S, z
良好的工程实践建议:& o+ q, b: y9 g! H# |) o4 d. T
使用crushmap 划分故障域,将pool限制在特定的osd list上,osd的损坏只会引起这个pool内的数据均衡,不会造成全局影响;4 [$ U. D$ M4 C4 Y1 v
' ~$ l+ G8 T2 h, c1 \: u8 m
服务端对象的存储
" }. t) F9 o1 P$ o对象是数据存储的基本单元, 一般默认 4MB 大小(这里指的是RADOS的底层存储的对象,非RGW接口的对象)。- b' I2 T* Z. q) E
; C0 e8 W7 ~6 s, A# T
对象的组成分为3部分:key 、value、元数据;
/ n( F& b5 J1 ?. @! y5 @( V
3 @) j8 n/ K7 U/ a1 K元数据可直接存在文件的扩展属性中(必须是标准的文件属性),也可存到levelDb中;
2 O4 H5 H; n& @1 i' F. e0 c6 evalue 就是对象数据,在本地文件系统中用一个文件存储;
$ F5 T9 i8 {4 d( o对于大文件的存储,Ceph 提供的客户端接口会对大文件分片(条带化)后存储到服务端;这个条带化操作是在客户端接口程序完成的,在 Ceph 存储集群内存储的那些对象是没条带化的。客户端通过 librados 直接写入 Ceph 存储的数据不会分片。
& P4 f9 X: L+ {) I$ G+ j! u
, \$ Z0 a; f6 B+ K" ~良好的工程实践建议:' A" g1 R2 z3 m! N/ x2 ?, |
对于对象存储,只使用 Ceph 提供的 RGW 接口, 不使用 librados原生接口;不仅有分片功能,扩展也更容易(RGW是无状态的,可水平扩展);大量大对象直接存放到 Ceph中会影响 Ceph 稳定性(存储容量达到60%后);
/ a3 x/ q5 D8 A
9 K0 f/ d) r' z# j+ o: \5 \总结. s. T  x  x9 E3 X, v$ F, O
上线 Ceph 前,5 ?1 M- v; C- {3 w% n/ C5 [' @
先规划未来一年的预期使用量,为每个 pool 一次性设置 PG之后不再变更;
5 O0 G" ?7 Z5 E使用crushmap 设置故障域隔离,将磁盘故障后带来的数据平衡控制在一个小的范围之内。
' \5 u  v2 r% x接口方面推荐只使用Ceph 提供的RGW 接口,不使用 librados原生接口。
: j; @* k. E3 P, T+ M3 ?$ u* d- r  J8 o5 p3 ]/ j$ s) m
做好这些, 你的 Ceph 用起来会省心很多。
, }) s8 u* k) A2 L# L1 [- S7 L* B- r9 C" {* W
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-11 22:57 , Processed in 0.035621 second(s), 25 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表