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

ceph 分布式存储crush的算法,相关运维操作统计

[复制链接]

0

主题

0

回帖

9

积分

管理员

积分
9
QQ
发表于 2022-10-17 15:30:00 | 显示全部楼层 |阅读模式
Crush的放置策略. }. L3 B1 A+ N* W/ l$ I: l
Ceph使用CRUSH算法(Controlled Replication Under Scalable Hashing 可扩展哈希下的受控复制)来计算哪些OSD存放哪些对象% f) W- k. f( n
对象分配到PG中,CRUSH决定这些PG使用哪些OSD来存储对象。理想情况下,CRUSH会将数据均匀的分布到存储中+ e! @: U8 f- _) D0 v: j5 U
3 r! R5 ~. _1 {2 ?) c/ l% f
当添加新OSD或者现有的OSD出现故障时,Ceph使用CRUSH在活跃的OSD上重平衡数据CRUSH map是CRUSH算法的中央配置机制,可通过调整CRUSHmap来优化数据存放位置默认情况下,CRUSH将一个对象的多个副本放置到不同主机上的0SD中。可以配置CRUSH map和CRUSH rules,使一个对象的多个副本放置到不同房间或者不同机柜的主机上的0SD中。
& g) k- E5 v" y3 e6 ]5 ~0 l& D0 w% c/ l1 J+ n( A
也可以将SSD磁盘分配给需要高速存储的池
  a! c; s" b  P& w0 Q
4 @5 d! Y1 `9 |1 [4 ~; [- w编译与翻译和更新
, ]7 i; z, ^4 t2 u导出CRUSH map; l8 e6 c, Q7 w$ ]6 j$ z
ceph osd getcrushmap -o ./crushmap.bin
( E. e2 ]3 O6 o+ g0 X: ^+ OShellCopy( L9 K, @! b) ]; P! n5 n0 [
解译CRUSH map
$ w8 W, {" k: J+ v9 wcrushtool -d ./crushmap.bin ./crushmap.txt+ s- M( s/ N2 Y- _1 a
ShellCopy
7 R9 M4 `; m1 o: ~$ x. g修改后的CRUSH map重新编译
7 s' g3 O/ B$ `: Z( M  s" C3 gcrushtool -c ./crushmap.txt-o ./crushmap-new.bin
4 R6 G  m# r: c+ t: x  hShellCopy- u: p# D5 X! o/ y" R
更新CRUSH map
( y, q4 A, K% y/ d8 e# `( e/ I# Iceph osd setcrushmap-i./crushmap-new.bin
! K, ]5 r/ I. |. [) ]$ P; S# zShellCopy
, L2 W- C+ \/ w% o1 O查询crush map的内容(返回json)
3 D+ r( ^2 _) G" E; R' a% Nceph osd crush dump# L* R- i4 Z  k* l) w
ShellCopy5 f  u3 G9 o3 J7 g
例子
1 k- B1 ^2 @1 f1 S" E9 }3 p5 j) O
! {. E& K9 B8 v/ W- d7 Q( h9 D& Sroot default {
  ?' Q6 B/ }; H; B" q  ^    id-1           # do not change unnecessarily
7 G- x$ H5 I, T% u    id-2 class hdd #do not change unnecessarily( Y& {/ s) r3 ?- _9 }& K
    #weiqht 0.166
' f. I/ R1 o, P# ^  a% [2 u& @7 }- D    alg straw2
3 z4 ?% Z# L* S9 l8 g    hash 0#rjenkins1
: s9 Q) O) b# c$ ]    item rackl weight 0.055
% j2 Y) r, L( x, I4 r2 a    item rack2 weiqht 0.0551 {% s# }1 a' z1 N
    item rack3 weight 0.055. x9 t0 u# h8 r( l# V. S
}( u# f* @  R- }
- }0 H! e2 x8 x8 U. o7 Z5 f; [) d
#rules
/ O; {) ]! l2 U7 e9 Drule replicated rule{8 `: s+ i4 ]& c: j% C. n
    id 07 e1 u# ?' Z3 |" P5 c2 X
    type replicated0 x4 T) G. H# y, Q' x7 o
    min size 1/ ]: R: S0 `: c) |
    max size 10  [1 r3 Z5 b9 ?" g8 p( t
    step take default  #只要是应用这个rule的都把数据写入到defaults下. K. Z3 }) |( w9 J6 p! t0 l# @4 c
    step chooseleaf firstn 0 type host  #定义故障的故障域为物理集机器级别(rack为机柜级别)4 J' S, e1 b3 R! z- W+ o$ _# c6 R
    step emit #结尾符号- G+ ]1 v; \* a
}
( i# \1 a9 g* UShellCopy. q+ V1 s( a- a" M% _2 [
集群调优
) F0 D6 p9 w5 P系统层面调优7 [- O( C& S! q
选择正确的CPU和内存。OSD、MON和MDS节点具有不同的CPU和内存需求: ]3 i. ?$ i' y5 E
mon的需求和osd的总个数有关需要的是计算力: V& s9 Y  t& x5 z; H* x1 @
mds对CPU和内存要求很高,会将大量的元数据缓存到自己的内存中,存储元数据的尽量的使用ssd  V# Z% H% i8 i8 f. e. i3 v$ t
osd最低要求1H2G的配置例如:24块硬盘最少是24H36G,磁盘方面必须高I/O有多好上多好
4 }" i# s) i/ a  C- d  [, _' w尽可能关闭NUMA) ?& A5 ^( z) h' m! `3 B3 a
规划好存储节点的数据以及各节点的磁盘要求(不考虑钱忽略)( v+ o7 o5 U5 S1 v

5 P% E, V1 }- o磁盘的选择尽可能在成本、吞吐量和延迟之间找到良好的平衡# c: \4 c: T- f& O6 r2 r# Q- B
! n& _. B# w, m( N1 c6 p
journal日志应该使用SSD( S6 I! J' u3 {5 s4 Z
4 G9 |% Z9 e( T- c; b
如果交换机支持(MTU 9000),则启用巨型帧(减少数据的分片),前提是ceph在一个单独的网络环境中切有独立交换机。
' }! [) H* N5 r( @* J3 C1 Z% o9 ~5 j$ q: J8 _/ ~" L1 h5 ]
启用ntp。Ceph对时间敏感,集群网络至少10GB带宽
" l6 {$ }0 L& n! Z# \# K& A
" s# m0 j& t4 W, B; \# d; \系统调优工具
7 t  N7 K, u! A使用tuned-admin工具,它可帮助系统管理员针对不同的工作负载进行系统调优
+ e* T4 l/ t& |2 v6 Y2 W& z$ f* v# Y& f5 U0 n" B
tuned-admin使用的profile默认存放在/usr/lib/tuned/<profile-name>目录中,可以参考其模板来自定义profile* @; Q* a4 }4 u/ B1 L4 G, X0 @# e
1 I9 s# }# i; n+ j
对于ceph而言,network-latency可以改进全局系统延迟,network-throughput可以改进全局系统吞吐量,如果两个都开启可以使用Custom自定义模式
+ C* [: ^5 u( x0 X) |$ g1 W4 X) h, \# F) ~6 G" f; A: }8 R0 J
# 列出现有可用的profile
' \5 z6 `$ t' S; h4 b6 Wtuned-adm list
! y+ H" Y& M! N" Z% a) Z' W5 D( B/ ^' c6 m* r! a" y
# 查看当前生效的profile. ?8 o' \. r. i3 Y2 x
tuned-adm active* a$ l6 M6 k; w" t

: {( w+ r: D. u  l+ d: @' y4 S# 使用指定的profile
% X8 w! u9 V% K+ R4 G9 Vtuned-admin profile profile-name
2 ]4 {% M% \- O9 M# L. T/ F5 i# V  |# [4 J9 G, b' J
# 禁用所有的profile
8 ~6 e2 k; w# [. G$ r/ Dtuned-admin off; n0 F( x. t* b5 Q0 z& J3 P: G
ShellCopy
4 N5 w& l) p; @I/O调度算法
  h4 @. _& e  o$ S, |noop:电梯算法,实现了一个简单的FIFO队列。基于SSD的磁盘,推荐使用这种调度方式
  l. `" p4 w+ P+ P  F  L5 `1 j( I! T& z( F9 [* M/ X
Deadline:截止时间调度算法,尽力为请求提供有保障的延迟。对于Ceph,基于sata或者sas的驱动器,应该首选这种调度方式4 M* t1 X8 `6 ?: O. k" _
9 M8 ^4 \# y% l. g3 A
cfq:完全公平队列,适合有许多进程同时读取和写入大小不等的请求的磁盘,也是默认的通用调度算法4 g* b2 A4 _0 X: e* Y5 n

% t7 {( `5 o" L, Z# S1 g/ H) |* [#查看当前系统支持的调度算法:9 M" v9 Z) i: z( n0 P: a3 J
    dmesg|grep -I scheduler+ ]0 Y9 M3 G( Q5 e0 e- `
# j  b' Z) H; e
#查看指定磁盘使用的调度算法:. v3 g* M1 D8 h, t
    cat /sys/block/磁盘设备号/queue/scheduler
/ q  I: U* L4 F5 A# R+ ^4 u# a
; g) ?6 E+ _- J! M& ]! g#修改调度算法
% E. N3 {) }  |: F( N# j/ M4 X* G    echo "deadline" > /sys/block/vdb/queue/scheduler
+ N+ m& x- ~) `9 n    vim /etc/default/grub/ J$ ~& W3 e- F& i7 I. D) h
        GRUB_CMDLINE_LINUX="elevator=deadline numa=off"
. [4 T4 g7 T* R: _" W0 i8 PShellCopy
( ~" Y1 ^. x- ?3 i" Q网络IO子系统调优
+ e4 x0 J# f% V  S用于集群的网络建议尽可能使用10Gb网络, C) E0 I* o& S
以下参数用于缓冲区内存管理
# Y, g) ^1 D! G0 x# E7 \2 k- a5 Z! V9 A6 N
#设置OS接收缓冲区的内存大小,第一个值告知内核一个TCP socket的最小缓冲区空间,第二值为默认缓冲区空间,第三个值是最大缓冲区空间
! ]0 ^* p8 c" @net.ipv4.tcp_wmem
/ |  ~9 S# P* X# J/ ~- F) h! J# K, `/ ~: S, v/ a3 n
#设置Os发送缓冲区的内存大小 9 c8 l7 h6 r2 `  O' I
net.ipv4.tcp_rmem
9 U% L# F' O2 N& a
* b* [6 P$ a  {8 _* \% g#定义TCP stack如何反应内存使用情况% k0 K" h$ h4 @9 v: n6 v
net.ipv4.tcp_mem
4 B* q) C$ _6 R" s$ K6 j: k4 wShellCopy
3 o/ u: e$ ?2 H0 B交换机启用大型帧2 N2 T3 x  M2 }  h& a
默认情况下,以太网最大传输数据包大小为1500字节。为提高吞吐量并减少处理开销,一种策略是将以太网网络配置为允许设备发送和接收更大的巨型帧。9 ^5 C6 {& r# M& g, s; P% n

9 P% ^; C2 l/ b8 s5 D8 |在使用巨型帧的要谨慎,因为需要硬件支持,且全部以太网口配置为相同的巨型帧MTU大小。: a6 S7 W6 E0 n; E
虚拟内存调优
# H+ e+ ^" T% U1 p5 W! K设置较低的比率会导致高频但用时短的写操作,这适合Ceph等I/O密集型应用。设置较高的比率会导致低频但用时长的写操作,这会产生较小的系统开销,但可能会造成应用响应时间变长
$ d* g+ X* X: |1 G9 @#脏内存占总系统总内存的百分比,达到此比率时内核会开始在后台写出数据  m7 z: S/ S% I* Q" M  d
vm.dirty_background_ratio' q; Z3 _! I3 M3 D' ^6 k9 f  p

& D) L: e) ?' S3 v2 E0 U#脏内存占总系统总内存的百分比,达到此比率时写入进程停滞,而系统会将内存页清空到后端存储! x0 b" i5 v+ q! l- O" c' K
vm.dirty_ratio; v, ]  P! d+ R7 \. @! F2 V0 i
2 t& \! g, \7 j- y
#控制交换分区的使用,生产中建议完全关闭,会拖慢系统运行速度( e5 Q$ @- v" y9 x1 Q
vm.swappiness
) f# R" z' u6 t" o2 o
9 i( G$ l+ |( `9 g: l#系统尽力保持可用状态的RAM大小。在一个RAM大于48G的系统上,建议设置为4G8 W8 w( A5 Q8 t8 `8 [3 `6 T1 A
vm.min_free_kbytes2 V$ O6 F6 |2 m; Z* h7 U- T6 N
ShellCopy
" M. c5 k; g8 V- a' LCeph本身调优1 P' o! j3 O( f8 t9 ]2 n
最佳实践
$ k0 Q8 L8 o9 ~5 Q1 _* c7 D. F7 l4 ~( R* w- N# Y
MON的性能对集群总体性能至关重要,应用部署于专用节点,为确保正确仲裁,数量应为奇数个1 f. R1 U$ q) P. n* F
在OSD节点上,操作系统、OSD数据、OSD日志应当位于独立的磁盘上,以确保满意的吞吐量
/ Y9 z$ P- X. H9 Z2 N4 L, Y* {
9 g: |* ~' k- I' y在集群安装后,需要监控集群、排除故障并维护,尽管 Ceph具有自愈功能。如果发生性能问题,首先在磁盘、网络和硬件层面上调查。然后逐步转向RADOS块设备和Ceph对象网关
, ^4 |% x5 n( `, _: q
  d* q, r5 q) d0 x+ {$ o' {  ]影响I/O的6大操作, q6 g) f+ J" I6 v+ O

3 V) x& Y( z2 y2 v8 {业务数据写入6 i# S. p- p* L: A1 @9 |
数据恢复6 w$ I, h# B( W% T& ^
数据回填3 i& \. l& n2 A+ I
数据重平衡
7 v* q4 k2 F! [4 p! Z% L2 _9 S数据一致性校验; ^- Y, B7 G3 k
快照清理* I: d' [3 j- w$ a9 d; U
OSD生产建议
5 O" ~, D7 K. {. m更快的日志性能可以改进响应时间,建议将单独的低延迟SSD或者NVMe设备用于OSD日志。
8 z4 k- ^0 o1 ?7 r  V* X( K多个日志可以共享同一SSD,以降低存储基础架构的成本。但是不能将过多OSD日志放在同一设备上。9 G, n: q0 v" F3 G% I$ K

6 K1 v- p9 w2 O& M5 @建议每个SATA OSD设备不超过6个OSD日志,每个NVMe设备不超过12个OSD日志。
. n- ~& K" O! j0 @" Y- n+ r* w, @$ t: D) {2 C8 E
需要说明的是,当用于托管日志的SSD或者NVMe设备故障时,使用它托管其日志的所有OSD也都变得不可用) W1 e5 ^9 z/ n; `4 t% v% G

+ Q7 `5 P2 S8 n硬件建议
. D3 k) ]- d) \9 y  H7 r: |
! |5 ~' a! Y: T+ w1 @将一个raid1磁盘用于ceph操作系统
* ~1 p1 |2 \. H每个OSD一块硬盘,尽量将SSD或者NVMe用于日志& v, o. _' C5 a
" j8 k3 S7 `7 V; {8 \" `" S* |0 j
使用多个10Gb网卡,每个网络一个双链路绑定(建议生产环境2个网卡4个光模块,2个万兆口做为数据的交换,2个万兆口做业务流量)  @' d5 W2 G6 V5 j
& y0 M1 U1 y9 _/ w4 v
每个OSD预留1个CPU,每个逻辑核心1GHz,分配16GB内存,外加每个OSD 2G内存
6 P5 M( L( H. F- m4 \; `6 r! ?7 j# Q( d6 T" m
RBD生产建议
, d1 q3 y2 B( Z块设备上的工作负载通常是I/O密集型负载,例如在OpenStack中虚拟机上运行数据库。8 W9 p" x1 \  `! A3 Y8 r$ P

; {! H2 `, w0 w1 e& q对于RBD,OSD日志应当位于SSD或者NVMe设备上
! y; F) D7 P& b; ]) r. M5 E, o
: y( X/ O/ R" D' _& e对后端存储,可以使用不同的存储设备以提供不同级别的服务( b' t& Q7 E  Z/ ]8 c

+ y; E3 A7 r$ ?; w0 W, f对象网关生产建议/ n* z& e: I& b3 T9 R' ]. i6 a! j
Ceph对象网关工作负载通常是吞吐密集型负载。但是其bucket索引池为I/O密集型工作负载模式。应当将这个池存储在SSD设备上! Q5 M8 y6 P, v  {2 x0 M2 A
! Z* t, S, R; L% a4 Z" Q
Ceph对象网关为每个存储桶维护一个索引。Ceph将这一索引存储在RADOS对象中。当存储桶存储数量巨大的对象时(超过100000个),索引性能会降低,因为只有一个RADOS对象参与所有索引操作。
$ L3 F1 ]; m2 h" H
5 p) |4 k( r' F( n  uCeph可以在多个RADOS对象或分片中保存大型索引。可以在ceph.conf中设置rgw_override_bucket_index_max_shards配置参数来启用该功能。此参数的建议值是存储桶中预计对象数量除以100000 `* S* L1 ]/ ]5 j" a( g, ]& j

0 _  Q; ]2 Q& c: O3 p当索引变大,Ceph通常需要重新划分存储桶。rgw_dynamic_resharding配置控制该功能,默认为true
- ^, d; H1 _1 N+ |" z; G0 u% v3 D& B& `+ n
CephFS生产建议# k) `# T# a8 E7 e% }
存放目录结构和其他索引的元数据池可能会成为CephFS的瓶颈。因此,应该将SSD设备用于这个池
/ T6 B/ `0 J5 I2 y( i1 B
. Q1 ^: s  D5 y每个MDS维护一个内存中缓存 ,用于索引节点等不同类型的项目。Ceph使用mds_cache_memory_limit配置参数限制这一缓存的大小。其默认值为1GB,可以在需要时调整,得不得超过系统总内存数
( v0 U/ o- O3 B# j4 P' W& O1 e5 X  g7 b# l
Monitor生产建议/ U' L8 r! X- U& ~
最好为每个MON一个独立的服务器/虚拟机6 Y6 @6 j7 I6 v) j5 z* O

5 q% b# i% ]2 R! \7 k, F小型和中型集群,使用10000RPM的磁盘,大型集群使用SSD! T' Y6 P, d: M, w% j6 d( a
) }) w3 I+ C. U, l2 ~! q2 L
CPU使用方面:使用一个多核CPU,最少16G内存,最好不要和osd存放在同一个服务器上
9 \' U" S( l7 N' F/ }1 i
' W5 o0 ^- H3 s' T5 Y% @* A将OSD日志迁移到SSD
! K1 |' _6 \9 [: H4 H" p8 Q强烈建议生产中千万不要这么干,一定在集群初始化的时候就定制好+ u: A, _; x4 t' s7 C2 F
#集群中设置标志位停止指定的osd使用
. b1 U3 [& T- c) y- Sceph osd set noout
8 D$ W) X9 C& Q& W
8 g9 q2 _( }6 O) Z0 L4 B/ q) m8 v#停止osd的进程$ @* W: Q6 R: X3 M6 [, |
systemctl stop ceph-osd@3
; a3 A$ K+ z8 U3 ]* B' i8 o
* |5 _; _- Z, B$ h# W9 N#将所有的日志做刷盘处理,刷盘到osd中; J1 |  s5 K7 e% t( z' K( d' [2 }
ceph-osd -i 3 --flush-journal
6 t4 g$ W: R8 c7 q' R# G0 j8 Z0 ]/ X# R4 ~0 D' X2 z
#删除该osd现有的日志3 M# ?# O( }0 o3 P" C
rm -f /var/lib/ceph/osd/ceph-3/journal3 J( K8 T- b2 H3 f8 Z
; q. Z) y% Q, {# o
#/dev/sdc1为SSD盘创建一个软连接
$ A" o1 A4 S% s, I+ Xln -s /dev/sdc1 /var/lib/ceph/osd/ceph-3/journal
6 u. k/ Z3 @' N. G% N" n" c+ T; r' n: W7 Y. b" |
#刷出日志, n+ t  u2 _& s8 R
ceph-osd -i 3 --mkjournal
2 M* d) {! X1 z/ G' ~
2 ^# U7 _3 x) z' l5 j; F3 q#启动osd( R5 X) z- }) e- L
systemctl start ceph-osd@3, n& S/ Q' i- Y" }- \
0 V' G6 t9 V( r3 U% i$ C8 S
#移除标志位
4 ?; k( F$ n4 _* F; g5 R+ A1 |1 Sceph osd unset noout+ k: ~0 I# [$ r# B  G
ShellCopy
8 b/ ]  O) ]5 p4 v* ]! L, @存储池中PG的计算方法3 r* G% v8 E8 \$ i+ A* I7 I
通常,计算一个池中应该有多少个归置组的计算方法 = 100 * OSDs(个数) / size(副本数)
& e8 v( f8 g6 B2 v
0 L0 y2 Z! W6 Y6 j7 [一种比较通用的取值规则:7 p* W3 R5 A6 S2 ~1 Z
, n9 i. i; K  T; X5 H, e
少于5个OSD时可把pg_num设置为128
3 }5 E# c: w' e1 I( ?" wOSD数量在5到10个时,可把pg_num设置为512
4 P4 ~+ ?$ m/ g) A( x" N3 \OSD数量在10到50个时,可把pg_num设置为40964 y4 u, D# U3 `8 i
OSD数量大于50时,建议自行计算* _! K/ E) S' U4 j, L" G" K, X
自行计算pg_num聚会时的工具
( C' j. ]& t" a9 l+ V/ Hpgcalc:https://ceph.com/pgcalc/* @" j4 H3 @2 L* R# I4 W" }8 G
cephpgc:https://access.redhat.com/labs/cephpgc/  I9 G: r5 Q+ R8 ^" W9 i* C6 V
注意:在实际的生产环境中我们很难去预估需要多少个pool,每个pool所占用的数据大小的百分百。所以正常情况下需要在特定的情况选择动态扩缩容pg的大小2 x# T8 j! }+ V: H5 [( z5 U) _7 a; z
PG与PGP. b+ m% r! O1 S% P2 e
通常而言,PG与PGP是相同的当我们为一个池增加PG时,PG会开始分裂,这个时候,OSD上的数据开始移动到新的PG,但总体而言,此时,数据还是在一个OSD的不同PG中迁移而我们一旦同时增加了PGP,则PG开始在多个OSD上重平衡,这时会出现跨OSD的数据迁移5 m1 P' e7 t0 ~. _, ?- X6 n, y

' h* b6 A& J4 y9 c' U9 S$ ~, A- z7 X" B) x

: E4 @; |0 ~" J! kceph osd pool create poolName PgNum PgpNum
/ V/ y" n4 x/ ~8 D# w2 R当变动pg数量只是针对当前的特定池中的osd发生变动影响范围只是一个池的pg平衡
7 ?. o$ ^3 R; @  s) Y$ ]0 |% b
正常情况下一个osd最多承载100个pg0 i$ p& a$ n% k, t$ `' |$ |8 \& _+ w' d
8 N2 y. ~2 J, t1 ]/ ]  r, V
当pgp发生大变动的时候会导致原本这个池中的pg变动导致池中osd,过载或者有很大剩余性能,ceph集群会将过大的性能均衡到各个性能使用小的osd上,这个时候就会发生数据的大规模迁移,大量的i/O写入会占有网络带宽会严重影响使用中的pg性能导致阻塞发生。/ p5 G" G# j( n6 ]

# U% p) Y, l: g* F7 u建议的做法是将pg_num直接设置为希望作为最终值的PG数量,而PGP的数量应当慢慢增加,以确保集群不会因为一段时间内的大量数据重平衡而导致的性能下降
' f$ M( d$ P; j9 r& T: `  D
. ]. X1 o$ t4 |0 k0 ]/ m4 \Ceph生产网络建议
% \9 M9 O6 y2 ^% {2 N+ }4 C$ G5 C# M6 `9 @$ l; H) i4 C' l
" S# U" [$ K3 n" I' E0 j$ i% T7 C
尽可能使用10Gb网络带宽以上的万兆带宽(内网)
. q4 T; s- w3 s/ V) \0 I尽可能使用不同的cluster网络和public网络
6 v) _: _- x& ^) f6 r
5 z. S2 M8 o8 r. u# W& `; I4 J做好必要的网络设备监控防止网络过载& I0 p0 e" M8 t9 @
( K9 O9 k$ U7 n; O/ B! q" ^
OSD和数据一致性校验
3 j- U% Y6 W) r) R清理会影响ceph集群性能,但建议不要禁用此功能,因为它能提供完数据的完整性
+ }3 }9 o' V9 U
) X3 P  R5 [  k: |- M( E" y清理:检查对象的存在性、校验和以及大小
9 t/ F) N4 i( `" A* J, F7 P* s! V" g深度清理:检查对象的存在性和大小,重新计算并验证对象的校验和。(最好不开严重影响性能)
3 ?  A& p# ^! W5 e. N* v
. s6 u& v! \$ m& d1 C# C#清理调优参数7 V  c! e9 U, o8 a
osd_scrub_begin_hour =                    #取值范围0-24) h- T5 T# m4 e2 I! X7 H4 l" b
osd_scrub_end_hour = end_hbegin_hour our  #取值范围0-24
4 w' q& V" r' Y, }/ Q7 V5 `# v6 dosd_scrub_load_threshold                  #当系统负载低于多少的时候可以清理,默认为0.5
4 N0 a% y: A: [& bosd_scrub_min_interval                    #多久清理一次,默认是一天一次(前提是系统负载低于上一个参数的设定)' r4 G& X+ K2 p/ b
osd_scrub_interval_randomize_ratio        #在清理的时候,随机延迟的值,默认是0.5* N4 G9 K1 w! M( F0 i) \
osd_scrub_max_interval                    #清理的最大间隔时间,默认是一周(如果一周内没清理过,这次就必须清理,不管负载是多少)0 e9 O* a6 u! i5 o" j' L
osd_scrub_priority                        #清理的优先级,默认是5/ R+ k: G4 |4 p2 x- R
osd_deep_scrub_interal                    #深度清理的时间间隔,默认是一周
0 R# h1 e7 \! f$ dosd_scrub_sleep                           #当有磁盘读取时,则暂停清理,增加此值可减缓清理的速度以降低对客户端的影响,默认为0,范围0-1) d+ ]4 x5 [0 h: M- B$ C
ShellCopy
" I# A( _- n* B( o% k显示最近发生的清理和深度清理
: R7 L! z) U) \4 Kceph pg dump all  # 查看LAST_SCRUB和LAST_DEEP_SCRUB
) R: u' |( ^6 |+ V  f7 m% tShellCopy: p# H( Q2 C0 n0 Q
-将清理调度到特定的pg
( _( N7 ]: R. Q. T: k! O9 Z
' G9 [( G# ~$ B, f9 yceph pg scrub pg-id
+ s+ h& t5 f3 j6 \+ HShellCopy
8 v! j7 `1 l9 F- P4 w) J; U: `5 P) T将深度清理调度到特定的pg) b6 D( p. F4 u. N7 A
ceph pg deep-scrub pg-id
2 |/ C7 t$ r, U# L: J% p" dShellCopy4 d' z$ H* N0 W( X
为设定的池设定清理参数
9 S  v) G* r, ~+ q, a9 l" R8 ^ceph osd pool set <pool-name> <parameter> <value>3 w9 C  x* ^7 p1 ^# G- J' w
    noscrub # 不清理,默认为false
2 |% G) x" n1 s* Z* k    nodeep-scrub # 不深度清理,默认为false+ j8 M3 \' e" s' y, @+ x. s: g
    scrub_min_interval # 如果设置为0,则应用全局配置osd_scrub_min_interval" N, k# k9 U0 ]2 @& ]5 j' W  c
    scrub_max_interval # 如果设置为0,则应用全局配置osd_scrub_max_interval
1 v6 E9 o+ i" L0 u9 `3 r7 \- l    deep_scrub_interval # 如果设置为0,则应用全局配置osd_scrub_interval; F6 }+ k3 u/ s1 y
ShellCopy
4 l4 \* d! V  X4 {! {6 W快照的生产建议
9 X- L' R' K. @% \. {快照在池级别和RBD级别上提供。当快照被移除时,ceph会以异步操作的形式删除快照数据,称为快照修剪进程' T3 n8 Q( E8 j6 f. |  @6 I
为减轻快照修剪进程会影响集群总体性能。可以通过配置osd_snap_trim_sleep来在有客户端读写操作的时候暂停修剪,参数的值范围是0到1! w" u# K% U: [6 s% {

3 D9 O! ^+ m7 C$ `  s快照修剪的优先级通过使用osd_snap_trim_priority参数控制,默认为5' p- _, W" T+ A4 d9 p$ q
8 V/ K. v" x& R# z6 k9 U
保护数据和osd  j- D; X  ^0 y4 a! |9 L
需要控制回填和恢复操作,以限制这些操作的影响
4 [! p+ L9 R, Q- }2 X+ i( i& @
2 I3 b" X8 O1 ?$ ~  T2 Z0 V回填发生于新的osd加入集群时,或者osd死机并且ceph将其pg分配到其他osd时。在这种场景中,ceph必须要在可用的osd之间复制对象副本2 K  H' M" Q7 u' a2 B

& _+ B9 i" F9 u0 R# p2 r恢复发生于新的osd已有数据时,如出现短暂停机。在这种情形下,ceph会简单的重放pg日志
" Q- m% @6 L$ \# @6 t+ G) A) O* k+ D4 s/ W9 n6 ]
管理回填和恢复操作的配置项
) E, c6 Y2 N1 E#用于限制每个osd上用于回填的并发操作数,默认为1' j$ W, ?/ b2 X0 T4 L' h: Y
osd_max_backfills
# q  S! E+ _% G/ y# g7 S
" H: e4 |+ ~) |+ T$ H- y" f8 _#用于限制每个osd上用于恢复的并发操作数,默认为3
) r7 d' r3 f) W; ?, sosd_recovery_max_active
5 w, c! I* u0 z( X0 R8 e2 z
% v, S+ e2 ]* J9 d  D. P#恢复操作的优先级,默认为3# q- D$ a5 b- @+ @# X
osd_recovery_op_priority
' K- a1 ]  Y" L( O; }  HShellCopy
+ Z5 F$ Y& ~) x* fOSD数据存储后端
( h# B! \; r: C, W% c9 VBlueStore管理一个,两个或(在某些情况下)三个存储设备。在最简单的情况下,BlueStore使用单个(主)存储设备。存储设备通常作为一个整体使用,BlueStore直接占用完整设备。该主设备通常由数据目录中的块符号链接标识。数据目录挂载成一个tmpfs,它将填充(在启动时或ceph-volume激活它时)所有常用的OSD文件,其中包含有关OSD的信息,例如:其标识符,它所属的集群,以及它的私钥。还可以使用两个额外的设备部署BlueStore
6 m  e, U5 v, E; V) @& ~% ~7 Z
/ H7 A$ M; G+ {WAL设备(在数据目录中标识为block.wal)可用于BlueStore的内部日志或预写日志。只有设备比主设备快(例如,当它在SSD上并且主设备是HDD时),使用WAL设备是有用的。
% i+ p: y& \! v- G3 b6 o数据库设备(在数据目录中标识为block.db)可用于存储BlueStore的内部元数据。 BlueStore(或者更确切地说,嵌入式RocksDB)将在数据库设备上放置尽可能多的元数据以提高性能。如果数据库设备填满,元数据将写到主设备。同样,数据库设备要比主设备更快,则提供数据库设备是有帮助的。0 J2 l3 E5 ?0 j6 W7 G' k
+ y0 @- X- g) Q! M
如果只有少量快速存储可用(例如,小于1GB),我们建议将其用作WAL设备。如果还有更多,配置数据库设备会更有意义。 BlueStore日志将始终放在可用的最快设备上,因此使用数据库设备将提供与WAL设备相同的优势,同时还允许在其中存储其他元数据。
3 \: h4 G/ D% f6 P( i6 s$ i6 N. V4 [( T( [- W* @# \  H
正常L版本推荐使用filestore,M版本可以考虑使用bluestore
" a6 [- [% {. W: y/ Q# W/ E
0 a9 x. U5 T% r) f- s推荐优化文章:https://www.cnblogs.com/luxiaodai/p/10006036.html#_lab2_1_9/ F2 C% ?) e0 m! K, |
2 e- F6 Y7 ~" ~9 }& x7 b
关于性能测试! G+ h6 j- P- v4 x4 D: R0 s4 E! _. A+ e
推荐使用fio参考阿里云文档:https://help.aliyun.com/document ... .659.38b44da2KZr2Sn
1 w3 p/ B" Z5 b  G0 y1 A
5 q! L- V" Q' t, f4 X; Y! [dd& `) ~& {0 Y! O: q9 S
/ t* k2 G7 a# {1 C: f
echo 3 > /proc/sys/vm/drop_caches; f! w' d; I  P8 y/ r5 Z6 E0 k7 W
dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/test.img bs=4M count=1024 oflag=direct2 m% J3 @7 l0 ^6 D/ x
dd if=/var/lib/ceph/osd/ceph-0/test.img of=/dev/null bs=4M count=1024 oflag=direct9 c% Y( p' p4 |; m- J3 S( V% U" j
ShellCopy" X5 A& h0 z; Y6 E/ a- Y
rados bench性能测试  `( C8 ^' i1 O$ h; C, d
rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t --no-cleanup9 H! |2 v9 @0 |& a& M
    pool_name 测试所针对的池( _8 O1 X, F# A, `1 a5 E
    seconds 测试所持续的时间,以秒为单位
+ u! |0 T( n0 x. A# f5 c    <write|seq|rand> 操作模式,分别是写、顺序读、随机读& P& g" v2 _; Q: t: v+ v$ V! O) j: J0 k
    -b <block_size> 块大小,默认是4M' E& L  B' I) f) c( k5 `
    -t 读/写的并行数,默认为16$ U* U7 ~, L$ L9 g0 [% ]
    --no-cleanup 表示测试完成后不删除测试用的数据。在做读测试之前,需要使用该参数来运行一遍写测试来产生测试数据,在全部测试完成以后,可以行rados -p <pool_name> cleanup来清理所有测试数据
; E  U9 z4 P; @/ M1 q: Y6 u' [0 S7 o+ R
#示例:3 g7 e( v" K' A' |( `
rados bench -p rbd 10 write --no-cleanup8 ^* H1 t' }! g: m1 l6 N4 v+ F
rados bench -p rbd 10 seq
. I" T8 g0 s+ i# {% e+ GShellCopy
/ e' M) }% H3 x3 K- r$ R1 i( Mrbd bench性能测试
! N( i9 z/ ?3 A& a/ _rbd bench -p <pool_name> <image_name> --io-type <write|read> --io-size <size> --io-threads <num> --io-total <size> --io-pattern <seq|rand>
. S. P' g7 }- X, r: b# d5 Q/ @    --io-type 测试类型,读/写. _" r& z% J1 I% h
    --io-size 字节数,默认4096# E9 |4 F: i( v3 G. z; J$ A
    --io-threads 线程数,默认16
$ r3 q' x7 o' j: ?) m    --io-total  读/写的总大小,默认1GB; y. @/ }& \) P+ o
    --io-pattern  读/写的方式,顺序还是随机
0 E) I4 d' @9 D( `3 W9 ?) e0 ~/ p2 N' X) ?
#示例:+ a: ~  X& t& O- j1 Y
https://edenmal.moe/post/2017/Ceph-rbd-bench-Commands/
+ j$ f; C" d' vShellCopy
0 E: z1 Y$ b# a设置集群的标志, [# p8 V& r$ g9 D
flag操作4 \1 |8 `% ~/ o& o7 K9 u9 C$ X

4 M& I4 a! a0 ]7 a只能对整个集群操作,不能针对单个osd" Z4 \0 \+ _  ]% v
语法:& h9 C9 t& Y0 M. o6 G
ceph osd set
% T1 f$ O( M# X, uceph osd unset
( g' \8 f' n5 K" B0 M#示例:5 W9 M3 C/ w1 S: r- L8 r
ceph osd set nodown
! d7 H* [; x7 l) x3 ]& k% f1 Zceph osd unset nodown1 h& J! {" g9 x" E; h9 M& p1 l3 `
ceph -s
; r  S/ T4 S  t7 d% k& M" ^  dShellCopy
/ @  A: T0 x# k2 U标志名称        含义用法详解5 v  a! I2 n3 n# o
noup        OSD启动时,会将自己在MON上标识为UP状态,设置该标志位,则OSD不会被自动标识为up状态
& u; C, T0 u' N1 ?nodown        OSD停止时,MON会将OSD标识为down状态,设置该标志位,则MON不会将停止的OSD标识为down状态,设置noup和nodown可以防止网络抖动( I' Q1 |0 i4 b( [' b" y1 ]# F% f
noout        设置该标志位,则mon不会从crush映射中删除任何OSD。对OSD作维护时,可设置该标志位,以防止CRUSH在OSD停止时自动重平衡数据。OSD重新启动时,需要清除该flag% B0 N+ I, G) }8 w( C
noin        设置该标志位,可以防止数据被自动分配到OSD上
( p: g- K+ h( P* Tnorecover        设置该flag,禁止任何集群恢复操作。在执行维护和停机时,可设置该flag: y1 |8 W: V4 d/ X) @! F% r
nobackfill        禁止数据回填
/ @; W: q, a6 U' n0 d/ Znoscrub        禁止清理操作。清理PG会在短期内影响OSD的操作。在低带宽集群中,清理期间如果OSD的速度过慢,则会被标记为down。可以该标记来防止这种情况发生+ d! a8 n7 p. w( _( q$ C! ]
nodeep-scrub        禁止深度清理
2 E- M9 I# _( C" i& A, ?norebalance        禁止重平衡数据。在执行集群维护或者停机时,可以使用该flag
; r  {. O6 m; Bpause        设置该标志位,则集群停止读写,但不影响osd自检. Y) U7 D. z+ [' ]4 n. w
full        标记集群已满,将拒绝任何数据写入,但可读
1 o" o& p- d" N5 [8 F9 V8 Yadmin sockets管理守护进程
' L" F/ z  h6 r$ \% A; L通过admin sockets,管理员可以直接与守护进程交互。如查看和修改守护进程的配置参数。- \, B0 s! |* d, L* d
守护进程的socket文件一般是/var/run/ceph/cluster-cluster−type.$id.asok+ g5 y3 |, |' l& N
; _3 i% J( w$ z7 A* S  r
基于admin sockets的操作:
4 Q3 {8 K) L8 S* p0 J- ?4 V9 E" U; S6 t% P% R
ceph daemon $type.$id command' ^2 N% q+ m1 T6 M
#或者; i* s; C' Z6 `- A, L
ceph --admin-daemon /var/run/ceph/$cluster-$type.$id.asok command
# ?7 H' [/ j  A0 q" T. y#常用command如下:
: O, m4 w0 B' i& u7 x2 Z$ Whelp( d6 H9 h" ^# w$ K5 Y( z% i+ V
config get parameter; ~% A/ i) T( o
config set parameter
' V5 @5 U2 D9 Y1 l& Pconfig show
4 [, R' o& D% cperf dump
* S/ h  j3 m' g9 T0 XShellCopy- Q& \' Y% p6 b8 y7 [
一、集群监控管理9 }4 V3 j) S& \  H$ J7 ^
集群整体运行状态3 l3 i& J0 p+ }5 ]& L7 }' L/ K2 y
+ U% S* Z2 N, K) a% Q% d
[root@cephnode01 ~]# ceph -s , I& u& \; f7 O5 Q  @4 O
cluster:2 n* {+ o9 r: W% t, |
    id:     8230a918-a0de-4784-9ab8-cd2a2b8671d0. G, Y- d) K# P% w- J
    health: HEALTH_WARN) p; n* \, d) m$ w& a9 F! A7 U0 C
            application not enabled on 1 pool(s)
+ k! `, x& i2 N4 b0 R7 @/ z( t
: J( h/ }4 w9 k  services:
  q: C! P/ v% |/ N# W! d! O& S    mon: 3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 27h)
" K. t8 W! I7 g5 m" x+ s    mgr: cephnode01(active, since 53m), standbys: cephnode03, cephnode02
( x6 _( V) I  m* o    osd: 4 osds: 4 up (since 27h), 4 in (since 19h)
4 k& i% S& f+ M  k    rgw: 1 daemon active (cephnode01)
0 B1 f5 d$ ]9 r9 M
+ X5 J9 U5 y  \8 J) h+ Y( m  data:2 S3 T0 w4 i$ p. E7 k. p3 W
    pools:   6 pools, 96 pgs* {- S7 e6 a6 e2 @& Q- X
    objects: 235 objects, 3.6 KiB; Z9 X6 m5 Z+ E2 C
    usage:   4.0 GiB used, 56 GiB / 60 GiB avail
# c4 V2 R& N$ Q, S9 |' |, u' G    pgs:     96 active+clean. y3 J5 ]5 r! @, Y
  F, k" |1 {0 R  N6 V( d* @* P# o
    id:集群ID
$ f5 ^- N+ C! Z# C; `/ T    health:集群运行状态,这里有一个警告,说明是有问题,意思是pg数大于pgp数,通常此数值相等。
! G6 b- t+ `4 v9 q# c9 W8 W, X3 F    mon:Monitors运行状态。- ]  Q& E) M  [+ c7 |
    osd:OSDs运行状态。, i- f- X! b2 J2 N! m) Q& j
    mgr:Managers运行状态。9 d1 i: b9 C! Z% b- G  t! Y
    mds:Metadatas运行状态。
3 M* z* d2 ~, ]1 U0 i" i    pools:存储池与PGs的数量。
. U' j& z6 A& A    objects:存储对象的数量。% G- Y( k; `& C3 g4 b
    usage:存储的理论用量。/ j8 Y: I0 e. X. p: `( U* w3 s
    pgs:PGs的运行状态
) u0 s! r2 e5 F* V# u: a( l4 L! V  H5 i1 f: ^
~]$ ceph -w
3 G7 u6 c" l7 H: P~]$ ceph health detail" t: L( O) Q5 j
ShellCopy# B2 k) W1 E, A2 R
PG状态
* }- N5 w4 z- x查看pg状态查看通常使用下面两个命令即可,dump可以查看更详细信息6 x* |; B0 _% n- r% j. v) G
2 t" q8 ?+ d: k. O
~]$ ceph pg dump
5 Y* H, j5 n4 z$ H7 b) @) p~]$ ceph pg stat! |6 L2 @# R. I# |3 m& w: y
ShellCopy. v) a3 p! O6 i
Pool状态
& K& D% c7 u! N* t  k4 B~]$ ceph osd pool stats
$ z0 A4 I9 y% x8 _: g* U7 ^~]$ ceph osd pool stats
! {! `6 o! ?9 y" l7 {" U/ l, MShellCopy% i) n" w' n! O* J3 }" j
OSD状态
2 @7 R- Z! |6 x. m~]$ ceph osd stat- c8 Z' a3 b' s2 B% g/ y: n2 D
~]$ ceph osd dump2 _. @- y" @. I1 G$ W" h2 C$ i
~]$ ceph osd tree
; D+ k' E9 V/ f0 _# B2 F, f" I! Y~]$ ceph osd df
4 e5 O7 R' T! TShellCopy
1 p2 T. T& G( H2 r0 O% b% bMonitor状态和查看仲裁状态
, w* B: @% j: T, b" |~]$ ceph mon stat7 o6 O" u+ Q) E4 J! O! P
~]$ ceph mon dump
1 ]! y+ s5 `+ R7 H2 L; E~]$ ceph quorum_status
. z. R' q. K, xShellCopy1 M; \8 [; F7 l' Y2 ]: R/ N
集群空间用量
8 A0 `' K/ G5 M1 c' [~]$ ceph df1 P* A8 |0 W. e1 b: C5 m$ G
~]$ ceph df detail. J# q# Y4 G: M8 i& H5 B" x
ShellCopy
& J1 b7 Y7 G* }( `$ Y+ |6 B: z; o二、集群配置管理(临时和全局,服务平滑重启)  b, a  N7 K. J9 V& d" e" E5 P' ^
有时候需要更改服务的配置,但不想重启服务,或者是临时修改。这时候就可以使用tell和daemon子命令来完成此需求。
& M1 \" v; |9 ~8 t+ T: J% u3 [1 d! e2 e4 Z5 B: p" ?( v, {0 A+ Z
1、查看运行配置
+ S! d7 O- T5 X) h命令格式:
4 U9 ?% R  ]8 _/ r# s- G# ceph daemon {daemon-type}.{id} config show
5 k9 Y7 d) x, ?. c4 m1 a4 K1 O
6 ]+ L3 P7 `- i$ ]$ W; y5 ]/ Y- t命令举例:
' I  B9 ~' c: v" a, h  R# q8 t# ceph daemon osd.0 config show % F" o! U9 h2 F9 m% e
ShellCopy& T5 M' M) k. l* Q" S% t2 l4 E
2、tell子命令格式
1 A! W; `- |1 Q, K# b使用 tell 的方式适合对整个集群进行设置,使用 * 号进行匹配,就可以对整个集群的角色进行设置。而出现节点异常无法设置时候,只会在命令行当中进行报错,不太便于查找。# ]# g* j: w9 w) i; Y9 _) i) m

6 p! e# h. j0 j: {3 q2 X+ I: V命令格式:! Z; X' d6 X: L, b
# ceph tell {daemon-type}.{daemon id or *} injectargs --{name}={value} [--{name}={value}]
% t+ a- L) k' o# V$ W5 @命令举例:7 N$ \& M0 r/ h
# ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1
, o0 g7 p) l  sShellCopy+ C& y  q) M! x
daemon-type:为要操作的对象类型如osd、mon、mds等。
9 p$ c0 Z8 M. A2 Gdaemon id:该对象的名称,osd通常为0、1等,mon为ceph -s显示的名称,这里可以输入*表示全部。, @+ A) c, C8 X. B: Z
injectargs:表示参数注入,后面必须跟一个参数,也可以跟多个9 }/ w5 e9 ?+ I6 G4 w4 H
3、daemon子命令6 j2 B, C4 Q) g( u3 n
使用 daemon 进行设置的方式就是一个个的去设置,这样可以比较好的反馈,此方法是需要在设置的角色所在的主机上进行设置。& l  ~, R; o* J0 A& Y
命令格式:
2 e. B/ C% ]- b# ceph daemon {daemon-type}.{id} config set {name}={value}4 w. Q4 Y' i% C  ^0 {
命令举例:2 q6 Z3 F) e( H
# ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false
# H( b% U2 K/ j7 a( zShellCopy3 B, L( M+ L" P/ _
三、集群操作; I+ G% j( u! ^( M$ D  E
命令包含start、restart、status
7 Y) K6 d0 ]+ r" [9 m#1.启动所有守护进程
7 X$ E) {) |& b1 L; s' P! gsystemctl start ceph.target7 V* M* l+ G, S* f- i% d% y
+ y+ e" D  f8 M! A; D3 b! X
#2.按类型启动守护进程, T8 u  C- u6 k8 S1 w
systemctl start ceph-mgr.target2 i% _5 s9 `- A6 Q
systemctl start ceph-osd@id9 O' n3 I! y$ v" I
systemctl start ceph-mon.target
+ q# l/ V+ U( D( o3 Asystemctl start ceph-mds.target
# `1 X' @% @0 h/ ]+ d+ msystemctl start ceph-radosgw.target6 c5 d: r6 i$ d, H
ShellCopy) G8 K  O7 C9 G1 [  o
四、添加和删除OSD
1 C. p" t8 W3 T0 T7 L" Q; h/ K1、添加OSD* v# t, k1 t6 P$ n; g
纵向扩容(会导致数据的重分布)
9 A1 v: [9 U$ ], c* M2 A生产环境下最好的做法就是不要一次性添加大量的osd,最好逐步添加等待数据同步后再进行添加操作9 A4 Y# M* `  U5 P

7 E/ B" ?0 n9 [  A当影响生产数据时候临时可以停止同步:ceph osd set [nobackfill|norebalance],unset取消对应的参数
6 V2 f, e* l+ L9 e) X#1.格式化磁盘- V. F. S, O, M' T0 ?
ceph-volume lvm zap /dev/sd<id>
3 p1 W: Y' ?5 {8 `' F+ _- V) `0 O  ?- I$ j0 O" F% U% v3 b! J
#2.进入到ceph-deploy执行目录/my-cluster,添加OSD
3 e: `) W& v. aceph-deploy osd create --data /dev/sd<id> $hostname  `* @6 |& h& l3 b, F
ShellCopy: R& y) G' U2 ~4 w) z1 e0 P) L
2、删除OSD
5 m( A$ P) D  }6 J- y点击跳转官方文档地址8 C3 V. M" T7 v) Y& m; o( E
如果机器有盘坏了可以使用dmdsg查看坏盘
0 X' V" C6 F; @: Z- f7 F" |' U1 C+ R7 D  b% a6 K* k
存在一种情况就是某osd的写入延迟大盘有坏道很大可能会拖垮ceph集群:
* z$ B1 L9 h/ |4 d6 U  I- u0 v$ ^. j! w& y
ceph osd tree: 查看当前集群的osd状态
3 K- U( h6 z) [( O/ o) I6 w+ D9 [ceph osd perf: 查看当前的OSD的延迟
  i( v( C7 }% r$ r' Y当某一快osd踢出集群时候立即做数据重分布(默认10分钟)
8 o- Y4 o. `0 i1 @, q1、调整osd的crush weight为 0$ r0 _/ `: Q& b* W6 q: B
ceph osd crush reweight osd.<ID> 0.0
9 \) R! w2 j/ t* N
, c2 Y7 v3 o  |& q" S2、将osd进程stop
8 E6 O1 H, L( c4 D2 L  S% K7 usystemctl stop ceph-osd@<ID>
# P8 ^9 r/ x" U
' a& A% E% W2 H3、将osd设置out(将会出发数据重分布)& f- ?. q. x8 z/ c" @7 A
ceph osd out <ID>
$ |' r, V! B( S, l) Y# b% ]+ v2 s! X7 ~
4、从crushmap中踢出osd! z0 g- U- q' Z# ?$ S# u3 a
# 查看运行视图的osd状态4 {$ ]$ j& O6 |( K5 x( [
ceph osd crush dump|less2 W, m& T9 a* }  Z
ceph osd crush rm <osd>.id% L- r  L$ q. y6 x3 X; c
+ t0 h: l, z- W  q. _4 C
5、从tree树中删除osd  V8 B. P# V7 n/ j$ {' W
ceph osd rm <osd>.id- C) I$ @$ T* I! N
* A  W$ x$ Q: p1 t  `
6、(选用)立即执行删除OSD中数据
1 r* ]7 M8 {% m& n/ d( Vceph osd purge osd.<ID> --yes-i-really-mean-it! B8 c8 N: E* \- z+ W6 h

6 Q6 f. h2 Z6 g$ S' G7、卸载磁盘. k# Q' n- J/ R6 r. E3 z( I/ t+ Q& }( h
umount /var/lib/ceph/osd/ceph-?7 F( k4 w3 w6 q2 }
+ j, l0 z- `$ Q6 v" H
8.从认证中删除磁盘对应的key
( V5 j1 T, u3 b. n% A( F# 查看认证的列表# y6 V, x7 F0 \1 [2 `7 L7 x# j9 l8 y* x/ s
ceph auth list  z' h7 c) f& \; g, x
ceph auth rm <osd>.id
% p- L- J: p: hShellCopy: A: k" h& _! P  n4 \
五、扩容PG
1 M+ A, `; @, @# L/ Y: Q1、扩容大小取跟它接近的2的N次方
. m( W7 b% A* |+ j0 U! o2、在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。如果你增加pool的pg_num,就需要同时增加pgp_num,保持它们大小一致,这样集群才能正常rebalancing。- q8 u- e$ W: a% g  J9 _$ c- \
ceph osd pool set {pool-name} pg_num 1287 V% `9 t, ]" K! F: ^/ b
ceph osd pool set {pool-name} pgp_num 128 ' @! N1 y) G3 _) ?
六、Pool操作
1 O3 r4 E# n1 W! Y  L: X5 q7 p列出存储池+ ^2 k$ u' l6 I* o" k. A
ceph osd lspools# H. @6 W" `- J! i
创建存储池) ?7 }; n7 \+ p/ ?; _
命令格式:' W! V) q( L5 z: N" N1 o, g# [
# ceph osd pool create {pool-name} {pg-num} [{pgp-num}]( Q$ E( @; O7 U
命令举例:
$ `2 W  M* ^) F/ h, J; ^# v# ceph osd pool create rbd  32 32
" x# h" f! s7 b8 @* f7 m& g2 W设置存储池配额1 D; \0 b" `" X. m, x( T
命令格式:2 {# q6 H9 P2 a2 R( Z8 Q1 |# ~
# ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}]# c' c1 M. D) i
命令举例:
7 R/ b- L/ k4 ]# ceph osd pool set-quota rbd max_objects 10000  r3 L) f  W  x* q
删除存储池8 G% u1 C7 F; O0 h5 F" R% P
ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]( F0 j+ A6 C0 N9 O: U& R7 ]
重命名存储池# ^: ^5 I3 A' u4 {6 a
ceph osd pool rename {current-pool-name} {new-pool-name}9 ~  V9 }  ?: B" H/ A" l$ X
查看存储池统计信息
; I; C' E. r# L. d9 }9 drados df
9 X4 d+ a7 }  [4 |5 W1 y给存储池做快照& D) w% a3 ?7 W* G4 y! A
ceph osd pool mksnap {pool-name} {snap-name}3 a- }; y  g4 i( `; O: {  F
删除存储池的快照. a3 j1 q/ b$ ^$ s, \
ceph osd pool rmsnap {pool-name} {snap-name}/ |5 m! Y6 u  J5 T1 ?' O
获取存储池选项值; p# M" p1 y7 R
ceph osd pool get {pool-name} {key}! |% G& E! j+ @9 p; H1 \# _7 B
调整存储池选项值
/ g0 k1 `9 Y, p/ b) ?! c  ]ceph osd pool set {pool-name} {key} {value}
# `, d) }1 @' |( D9 o7 D  dsize:设置存储池中的对象副本数,详情参见设置对象副本数。仅适用于副本存储池。+ a3 w' ]/ M& d6 z+ r
min_size:设置 I/O 需要的最小副本数,详情参见设置对象副本数。仅适用于副本存储池。' G  M8 ]3 }$ q. _
pg_num:计算数据分布时的有效 PG 数。只能大于当前 PG 数。9 F# |& P7 Y) h
pgp_num:计算数据分布时使用的有效 PGP 数量。小于等于存储池的 PG 数。9 I( q4 ?0 [* D- `
hashpspool:给指定存储池设置/取消 HASHPSPOOL 标志。5 V! ^1 ]6 @6 @1 T: L+ F- p7 g
target_max_bytes:达到 max_bytes 阀值时会触发 Ceph 冲洗或驱逐对象。
( M! m+ q, J% z4 ztarget_max_objects:达到 max_objects 阀值时会触发 Ceph 冲洗或驱逐对象。3 _6 j' p% ]: T0 [1 i8 b
scrub_min_interval:在负载低时,洗刷存储池的最小间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_min_interval 。! t! w8 l. J5 F( y
scrub_max_interval:不管集群负载如何,都要洗刷存储池的最大间隔秒数。如果是 0 ,就按照配置文件里的 osd_scrub_max_interval 。0 i  |; H4 w4 X% [8 F
deep_scrub_interval:“深度”洗刷存储池的间隔秒数。如果是 0 ,就按照配置文件里的 osd_deep_scrub_interval 。/ e/ F9 s% A  ]3 J" ~9 ^3 c6 Q
ShellCopy- N# m  U* E; X1 K; G+ @: P$ g7 A
获取对象副本数! H9 r" u/ b6 J! X
ceph osd dump | grep 'replicated size'
- m2 w) Y7 F5 |' T# U% w9 N+ d" s! I七、用户管理
$ K! I4 x8 O) u- k0 z+ f8 a: fCeph 把数据以对象的形式存于各存储池中。Ceph 用户必须具有访问存储池的权限才能够读写数据。另外,Ceph 用户必须具有执行权限才能够使用 Ceph 的管理命令。+ M& F9 ~2 D% V* V. ^; [3 }
7 p* g, U* T! H+ W8 F' J$ s
1、查看用户信息, C: D( p: K. U/ i% s% ^: L, r
查看所有用户信息& J; o# a( B; F+ r
# ceph auth list
9 r1 D0 Y  v7 u获取所有用户的key与权限相关信息& r" g5 F# |$ f3 i! C- |0 h
# ceph auth get client.admin
9 m: _6 i- @) i4 H+ n. r% h如果只需要某个用户的key信息,可以使用pring-key子命令
% [$ A% u- y! Q4 \0 g8 E" E# ceph auth print-key client.admin ; n' @  s7 r0 G. w4 V. Z
2、添加用户% d  x$ R% j. `
# ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'( Z8 H) W/ d7 O5 {" e: Z' v
# ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'/ s: C( x' m. f8 h& l
# ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring( v" O" s" V: F
# ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key$ D- Q0 J# k3 B- m/ R6 g& k
3、修改用户权限
+ V+ Z! p7 o1 b& L# ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'% q) x7 t' F9 ^8 i, y
# ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'$ ?# [& {0 }" F! r( O9 \: U9 x$ U9 C
# ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
  k; |* i: L% D. I8 A# ceph auth caps client.ringo mon ' ' osd ' '9 d% g# q  d8 i7 @" @3 r
4、删除用户
  M  I. ]- ]* Z7 U7 D8 q# ceph auth del {TYPE}.{ID}) b6 X3 X7 Y9 G$ j" X* V8 T
其中, {TYPE} 是 client,osd,mon 或 mds 的其中一种。{ID} 是用户的名字或守护进程的 ID 。
: A2 H- a2 D) H* E( R( A- o2 [7 I8 H' m6 K
八、增加和删除Monitor, s) x: `$ q; t, J$ `
一个集群可以只有一个 monitor,推荐生产环境至少部署 3 个。 Ceph 使用 Paxos 算法的一个变种对各种 map 、以及其它对集群来说至关重要的信息达成共识。建议(但不是强制)部署奇数个 monitor 。Ceph 需要 mon 中的大多数在运行并能够互相通信,比如单个 mon,或 2 个中的 2 个,3 个中的 2 个,4 个中的 3 个等。初始部署时,建议部署 3 个 monitor。后续如果要增加,请一次增加 2 个.6 K- L/ G+ w* A( z% ^

! E6 J/ p' X; A. P  |0 m1、新增一个monitor
# N- }- b$ d& E4 d: E% |# ceph-deploy mon create $hostname
2 O4 j/ c; l6 y' ?! s1 E注意:执行ceph-deploy之前要进入之前安装时候配置的目录。/my-cluster6 b8 p0 X6 z, r5 w5 B, E3 Z
, r# t" S( a4 I8 \" F/ E
2、删除Monitor/ E" L. I! z- M) k! a
# ceph-deploy mon destroy $hostname
* l7 a+ L2 a6 T7 S% }6 [# c注意: 确保你删除某个 Mon 后,其余 Mon 仍能达成一致。如果不可能,删除它之前可能需要先增加一个。
! d, x* h2 M% C3 l4 ?$ M  A
( D) H2 i+ x2 Q- Y6 _" w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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