前言 这个问题来源于我们研发的一个问题,在进行pg调整的时候,是一次调整到位好,还是分多次调整比较好,分多次调整的时候会不会出现某个pg反复挪动的问题,造成整体迁移量大于一次调整的
最近自己的项目上也有pg调整的需求,这个需求一般来源于pg规划好了,后期出现节点扩容的情况,需要对pg进行增加的调整
本篇用具体的数据来分析两种方式的差别
因为本篇的篇幅较长,直接先把结论拿出来
数据结论
调整pg
迁移pg
迁移对象
1200->1440
460
27933
1440->1680
458
27730
1680->1920
465
27946
1920->2160
457
21141
2160->2400
458
13938
总和
2305
132696
调整pg
迁移pg
迁移对象
1200->2400
2299
115361
结论: 分多次调整的时候,PG迁移量比一次调整多了6个,多了0.2%,对象的迁移量多了17335,多了15%
从数据上看pg迁移的数目基本一样,但是数据量是多了15%,这个是因为分多次迁移的时候,在pg基数比较小的时候,迁移一个pg里面的对象要比后期分裂以后的对象要多,就产生了这个数据量的差别
从整体上来看二者需要迁移的pg基本差不多,数据量上面会增加15%,分多次的时候是可以进行周期性调整的,拆分到不同的时间段来做,所以各有好处
实践 环境准备 本次测试采用的是开发环境,使用开发环境可以很快的部署一个需要的环境,本次分析采用的就是一台机器模拟的4台机器48个 4T osd的环境
环境搭建 生成集群
1 ./vstart.sh -n --mon_num 1 --osd_num 48 --mds_num 1 --short -d
后续操作都在源码的src目录下面执行
设置存储池副本为2
修改crush weight 为3.7模拟4T盘
1 seq 0 47| xargs -i ./ceph -c ceph.conf osd crush reweight osd.{} 3.8
模拟主机分组
1 2 3 4 seq 0 11 |xargs -i ./ceph -c ceph.conf osd crush set osd.{} 3.8 host=lab8106 root=default seq 12 23 |xargs -i ./ceph -c ceph.conf osd crush set osd.{} 3.8 host=lab8107 root=default seq 24 35 |xargs -i ./ceph -c ceph.conf osd crush set osd.{} 3.8 host=lab8108 root=default seq 36 47 |xargs -i ./ceph -c ceph.conf osd crush set osd.{} 3.8 host=lab8109 root=default
48个osd设置初始pg为1200,让每个osd上面差不多50个pg左右,做一下均衡操作,后续目标调整为pg为2400
准备120000个小文件准备put进去集群,使每个pg上面对象100个左右
1 ./rados -c ceph.conf -p rbd bench -b 1K 600 write --no-cleanup
一次调整pg到2400 统计一次调整到位的情况下的数据迁移情况
1 ./ceph -c ceph.conf osd pool set rbd pg_num 2400
记录当前的pg分布的情况
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappg_1200_pgp_2400
调整存储池的pgp为2400
1 ./ceph -c ceph.conf osd pool set rbd pgp_num 2400
等迁移完成以后,统计最终的pg分布情况
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappg2400_pgp2400
这里说明一下,调整pg的时候只会触发pg的分裂,并不会影响集群的分布,也就是不会出现pg迁移的情况,调整pgp以后才会去改变pg的分布,所以本次数据分析统计的是pgp变动后的迁移的数据量,这个量才是集群的真正的迁移量
用比较的脚本来进行统计(脚本会在本文文末提供)
1 2 3 4 [root@lab8106 src]#python compair.py pgmappg_1200_pgp_2400 pgmappg2400_pgp2400 | pgs | objects | ----------------- [2299, 115361]
也就是整个环境有2299次pg的变动,总共迁移的对象数目为115361个
分五次调整到2400PG 初始pg为1200个第一次调整,1200PG调整到1440PG 1 ./ceph -c ceph.conf osd pool set rbd pg_num 1440
调整pg为1440,当前pgp为1200 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaira1
调整pgp为1440,当前pg为1440 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaira2
统计第一次调整后的迁移量
1 2 3 4 [root@lab8106 pgdata]# python compair.py pgmappaira1 pgmappaira2 | pgs | objects | ----------------- [460, 27933]
第二次调整,1440PG调整到1680PG 1 ./ceph -c ceph.conf osd pool set rbd pg_num 1680
调整pg为1680,当前pgp为1440 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairb1
调整pgp为1680,当前pg为1680 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairb2
统计第二次调整后的迁移量
1 2 3 4 [root@lab8106 pgdata]# python compair.py pgmappairb1 pgmappairb2 | pgs | objects | ----------------- [458, 27730]
第三次调整,1680PG调整到1920PG 1 ./ceph -c ceph.conf osd pool set rbd pg_num 1920
调整pg为1920,当前pgp为1680 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairc1
调整pgp为1920,当前pg为1920 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairc2
统计第三次调整后的迁移量
1 2 3 4 [root@lab8106 pgdata]# python compair.py pgmappairc1 pgmappairc2 | pgs | objects | ----------------- [465, 27946]
第四次调整,1920PG调整到2160PG 1 ./ceph -c ceph.conf osd pool set rbd pg_num 2160
调整pg为2160,当前pgp为1920 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaird1
调整pgp为2160,当前pg为2160 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaird2
统计第四次调整后的迁移量
1 2 3 4 [root@lab8106 pgdata]# python compair.py pgmappaird1 pgmappaird2 | pgs | objects | ----------------- [457, 21141]
第五次调整,2160PG调整到2400PG 1 ./ceph -c ceph.conf osd pool set rbd pg_num 2400
调整pg为2400,当前pgp为2160 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaire1
调整pgp为2400,当前pg为2400 记录当前的pg分布数据
1 ./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaire2
统计第五次调整后的迁移量
1 2 3 4 [root@lab8106 pgdata]# python compair.py pgmappaire1 pgmappaire2 | pgs | objects | ----------------- [458, 13938]
上面五次加起来的总量为 2305 PGS 132696 objects
统计的脚本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ ="zp" import os,sys class filetojson(object): def __init__(self,orin,new): self.origin=orin self.new=new def tojson(self,filename): data={} pginfo={} for line in open(filename): if "pg_stat" in line: continue lines=line.split() pg=lines[0] objects=lines[1] withosd=lines[2] data[pg]={'objects':objects,'osd':list(eval(withosd))} return data def compare(self): movepg=0 allmovepg=0 allmoveobject=0 moveobject=0 oringinmap=self.tojson(self.origin) newmap=self.tojson(self.new) for key in oringinmap: amapn=set(oringinmap[key]['osd']) bmapn=set(newmap[key]['osd']) movepg=len(list(amapn.difference(bmapn))) if movepg != 0: moveobject=int(oringinmap[key]['objects']) * int(movepg) allmovepg=allmovepg+movepg allmoveobject=allmoveobject+moveobject return [allmovepg,allmoveobject] mycom=filetojson(sys.argv[1],sys.argv[2]) print "| pgs | objects |" print "-----------------" print mycom.compare()
总结 本篇是对集群进行pg调整的这个场景下迁移的数据进行分析的,对于一个集群来说,还是要用数据来进行问题的说明会比较有说服力,凭感觉还是没有那么强的说服力,本篇因为环境所限,所以在模拟的时候采用的是单个pg100个对象的样本,如果需要更精确的数据可以采用多次测试,并且加大这个单个pg的对象数目
变更记录
Why
Who
When
创建
武汉-运维-磨渣
2017-06-14