ceph-deploy osd扩容和换盘
[TOC]
ceph扩容分为两种,一种横向扩容一种纵向扩容。
横向扩容:增加节点:scale out --增加更多的节点
纵向扩容:在单节点上增加更多的磁盘:scale up
1.osd纵向扩容
查看信息
[root@controller ~]# cd ceph-deploy/
[root@controller ceph-deploy]# ceph-deploy disk list controller
要更换磁盘(删除其分区表)以准备与Ceph一起使用,请执行以下操作:
ceph-deploy disk zap {osd-server-name} {disk-name}
ceph-deploy disk zap osdserver1 /dev/sdb /dev/sdc
如果有数据可以运行zap清除
[root@controller ceph-deploy]# ceph-deploy disk zap controller /dev/sde
增加osd
[root@controller ceph-deploy]# ceph-deploy --overwrite-conf osd create controller --data /dev/sde
2.数据rebalancing重分布
在扩容ceph往里面加osd,他会去做数据的分布叫rebalancing。
什么叫rebalancing?
当集群中目前有两个osd,上面分别有10个PG,object分别是放到pg里面。扩容之后新增加了一个osd,会把之前的数据移动一部分到新增加的osd上。让整个集群看起来相对均衡。在扩容的过程中移动的是pg并不是对象,假设移动对象的情况下涉及到的数据量大计算复杂。所以移动pg,pg是有限的。
为什么移动pg?
是因为加入了osd,osd自动把状态上报给monitor,monitor能知道cluster map也就是osd map发生了变动,这个时候就会触发rebalancing,确保osd上面的pg能够平滑移动到新的osd节上。
所以在实际的生产环境中,pg里面存储了很多数据,这个时候移动可能会涉及到性能。
假设一次性加入很多osd进来,那么之前很多pg都需要移动,而pg中存储了大量的数据,此时rebalancing业务可能受影响,所以在扩容的过程中防止业务受影响一次不要扩容太多osd,一个一个慢慢往上加。
[root@controller ceph-deploy]# ceph -s
cluster:
id: 73c4cfc1-af4c-4be5-8ad4-fb0ff78b2efc
health: HEALTH_WARN
Degraded data redundancy: 261/2388 objects degraded (10.930%), 33 pgs degraded, 6 pgs undersized
services:
mon: 3 daemons, quorum controller,compute01,compute02 (age 34m)
mgr: controller(active, since 46m), standbys: compute01, compute02
osd: 10 osds: 10 up (since 75s), 10 in (since 75s); 7 remapped pgs
data:
pools: 3 pools, 384 pgs
objects: 796 objects, 3.3 GiB
usage: 20 GiB used, 480 GiB / 500 GiB avail
pgs: 261/2388 objects degraded (10.930%)
33/2388 objects misplaced (1.382%)
348 active+clean
28 active+recovery_wait+degraded
5 active+recovery_wait+undersized+degraded+remapped
2 active+recovery_wait+remapped
1 active+recovering+undersized+remapped
io:
recovery: 8.8 MiB/s, 4 objects/s
progress:
Rebalancing after osd.9 marked in
[===================...........]
扩容
[root@controller ceph-deploy]# ceph-deploy osd create compute01 --data /dev/sde
[root@controller ceph-deploy]# ceph-deploy osd create compute02 --data /dev/sde
扩容完了立刻实时监测,查看状态可以查看到rebalancing数据重分布过程
[root@controller ceph-deploy]# watch -n1 'ceph -s'
3.临时关闭rebalancing重分布
每个osd最多有一个线程在做数据的填充,值调的同步的时候快,消耗性能也多。
[root@controller ~]# ceph --admin-daemon /var/run/ceph/ceph-mon.controller.asok config show |grep max_backfills
"osd_max_backfills": "1",
注意ceph网络
在osd进行扩容数据进行重分布走的就是cluster_network网络,客户端连接是public_network网络。
生产中一定要分开,cluster_network使用万兆网卡减少之间的影响。因为如果在扩容osd时rebalancing流量较大此时就会影响到业务了。
[root@controller ~]# cat /etc/ceph/ceph.conf
public_network = 10.0.0.0/24
cluster_network = 172.16.0.0/24
如果两个网络就是在一起的,这个时候也在扩容,已经影响到线上业务了。
这个时候可以把rebalancing暂停了。
[root@controller ~]# ceph -h|grep reba
norebalance|norecover|noscrub|nodeep-scrub|notieragent|
norebalance|norecover|noscrub|nodeep-scrub|notieragent|
[root@controller ~]# ceph osd set norebalance #关闭标志位
norebalance is set
[root@controller ~]# ceph -s
cluster:
id: 236d7731-b1ce-4340-a218-0c2f1eecf61a
health: HEALTH_WARN
norebalance flag(s) set #这个就是用来做数据分布的
用来做数据填充的也需要关闭掉nobackfill
[root@controller ~]# ceph osd set nobackfill
nobackfill is set
[root@controller ~]# ceph -s
cluster:
id: 236d7731-b1ce-4340-a218-0c2f1eecf61a
health: HEALTH_WARN
nobackfill,norebalance flag(s) set
如果设置了nobackfill,norebalance标志位,如果有osd正在同步的情况下会把这个任务暂停掉,业务流量就能访问正常了。
取消nobackfill,norebalance
[root@controller ~]# ceph osd unset nobackfill
nobackfill is unset
[root@controller ~]# ceph osd unset norebalance
norebalance is unset
[root@controller ~]# ceph -s
cluster:
id: 236d7731-b1ce-4340-a218-0c2f1eecf61a
health: HEALTH_OK
4.osd坏盘更换
可以查看到坏的磁盘信息
[root@controller ~]# dmesg
查看数据延迟(当硬盘磁道快坏了的时候可以查看延迟)
[root@controller ~]# ceph osd perf
osd commit_latency(ms) apply_latency(ms)
5 0 0
4 0 0
0 0 0
1 0 0
2 0 0
3 0 0
停止坏盘的osd
[root@controller ~]# systemctl stop ceph-osd@9
当踢掉ceph-osd@9时,数据就会做一个重分布的过程,不会立即同步,需要等大概10分钟左右才会触发rebalance动作。这个时候一直ceph -s数据都没有动。
[root@controller ~]# ceph -s
cluster:
id: 73c4cfc1-af4c-4be5-8ad4-fb0ff78b2efc
health: HEALTH_WARN
1 osds down
Degraded data redundancy: 237/2388 objects degraded (9.925%), 81 pgs degraded, 97 pgs undersized
services:
mon: 3 daemons, quorum controller,compute01,compute02 (age 7m)
mgr: controller(active, since 2d), standbys: compute01, compute02
osd: 10 osds: 9 up (since 101s), 10 in (since 37h)
data:
pools: 3 pools, 384 pgs
objects: 796 objects, 3.3 GiB
usage: 20 GiB used, 480 GiB / 500 GiB avail
pgs: 237/2388 objects degraded (9.925%) #此时已经237pg数受影响了,但是还没有触发rebalance动作
287 active+clean
81 active+undersized+degraded
16 active+undersized
查看是否同步完成
[root@controller ceph-deploy]# ceph -s
cluster:
id: 73c4cfc1-af4c-4be5-8ad4-fb0ff78b2efc
health: HEALTH_OK
services:
mon: 3 daemons, quorum controller,compute01,compute02 (age 2h)
mgr: controller(active, since 2d), standbys: compute01, compute02
osd: 10 osds: 9 up (since 43m), 9 in (since 33m)
data:
pools: 3 pools, 384 pgs
objects: 796 objects, 3.3 GiB
usage: 19 GiB used, 431 GiB / 450 GiB avail
pgs: 384 active+clean
io:
client: 8.2 KiB/s rd, 9 op/s rd, 0 op/s wr
等待同步完成之后进行删除osd,在osd-map里面剔除掉osd.9
[root@controller ~]# ceph osd tree
9 hdd 0.04880 osd.9 down 1.00000 1.00000
[root@controller ~]# ceph osd out osd.9
marked out osd.9.
[root@controller ~]# ceph osd tree|grep osd.9
9 hdd 0.04880 osd.9 down 0 1.00000 #权重已经变为0
删除crush map
[root@controller ~]# ceph osd crush dump|more
[root@controller ~]# ceph osd crush rm osd.9
removed item id 9 name 'osd.9' from crush map
[root@controller ~]# ceph osd crush dump|more #再次查看就没有osd.9了
删除osd
[root@controller ~]# ceph osd rm osd.9
removed osd.9
[root@controller ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.43918 root default
-5 0.14639 host compute01
3 hdd 0.04880 osd.3 up 1.00000 1.00000
4 hdd 0.04880 osd.4 up 1.00000 1.00000
5 hdd 0.04880 osd.5 up 1.00000 1.00000
-7 0.14639 host compute02
6 hdd 0.04880 osd.6 up 1.00000 1.00000
7 hdd 0.04880 osd.7 up 1.00000 1.00000
8 hdd 0.04880 osd.8 up 1.00000 1.00000
-3 0.14639 host controller
0 hdd 0.04880 osd.0 up 1.00000 1.00000
1 hdd 0.04880 osd.1 up 1.00000 1.00000
2 hdd 0.04880 osd.2 up 1.00000 1.00000
删除认证信息
[root@controller ~]# ceph auth list
[root@controller ~]# ceph auth rm osd.9 #删除对应认证信息
updated
删除osd过程
删除之前做一个ceph osd out动作,做数据的重分布,安全
1.cursh map
2.auth
3.osd
5.数据一致性检查
三副本:
正常的一份数据会存储3份,怎么确保三份数据时一致的呢?ceph会定期检查三份数据内容是否一致,检查的方式有两种。
一种叫scrub轻量的一致性检查,轻量的一致性检查:主要对比object的元数据的内容是否一样(文件名、文件属性、大小),如果不一样就会从主节点的pg里面复制一份
一种叫deeper scrubbing深度的一致性检查:主要对比数据的内容(数据是否一样)(缺散检查)把两个缺散进行对比看数据是否一样。这个动作对于ceph集群大的时候比如上百T是消耗非常大的,非常的的一个负荷。所以这个检查间隔比较长通常每周做一次。
对于轻量的scrub来说类似于fsck检查存储中的内容,防止磁盘坏道、数据不一致。轻量的检查就能够检查出来,默认每天会自动检查。
针对于pg级别的(scrub轻量级)
[root@controller ~]# ceph -h|grep scrub
[root@controller ~]# ceph pg dump #拿到pg id
2.7c
[root@controller ~]# ceph pg scrub 2.7c
instructing pg 2.7c on osd.2 to scrub
[root@controller ~]# ceph -s #动作很快基本看不到任何信息
深度检查(将pg数据取出来进行对比)如果pg数据较多会耗费内存资源,因为需要把数据取出来在进行hash
[root@controller ~]# ceph pg deep-scrub 2.7c
instructing pg 2.7c on osd.2 to deep-scrub
[root@controller ~]# ceph -s
cluster:
id: 7580ffaa-ed48-435e-b49a-1bb46de61d1d
health: HEALTH_OK
services:
mon: 3 daemons, quorum controller,compute01,compute02 (age 95m)
mgr: controller(active, since 95m), standbys: compute01, compute02
mds: cephfs-demo:1 {0=controller=up:active} 2 up:standby
osd: 6 osds: 6 up (since 5m), 6 in (since 5m)
rgw: 1 daemon active (controller)
data:
pools: 8 pools, 256 pgs
objects: 4.64k objects, 17 GiB
usage: 49 GiB used, 251 GiB / 300 GiB avail
pgs: 256 active+clean
循环深度检查pg
[root@controller ~]# for i in `ceph pg dump |grep "active+clean"|awk '{print $1}'`;do ceph pg deep-scrub ${i};done
[root@controller ceph-deploy]# ceph -s
cluster:
id: 73c4cfc1-af4c-4be5-8ad4-fb0ff78b2efc
health: HEALTH_OK
services:
mon: 3 daemons, quorum controller,compute01,compute02 (age 2h)
mgr: controller(active, since 2d), standbys: compute01, compute02
osd: 9 osds: 9 up (since 77m), 9 in (since 67m)
data:
pools: 3 pools, 384 pgs
objects: 796 objects, 3.3 GiB
usage: 19 GiB used, 431 GiB / 450 GiB avail
pgs: 384 active+clean
1 active+clean+scrubbing+deep #关注