调整PG分多次调整和一次到位的迁移差别分析
前言
这个问题来源于我们研发的一个问题,在进行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的环境
环境搭建
生成集群
./vstart.sh -n --mon_num 1 --osd_num 48 --mds_num 1 --short -d
后续操作都在源码的src目录下面执行
设置存储池副本为2
修改crush weight 为3.7模拟4T盘
seq 0 47| xargs -i ./ceph -c ceph.conf osd crush reweight osd.{} 3.8
模拟主机分组
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个左右
./rados -c ceph.conf -p rbd bench -b 1K 600 write --no-cleanup
一次调整pg到2400
统计一次调整到位的情况下的数据迁移情况
./ceph -c ceph.conf osd pool set rbd pg_num 2400
记录当前的pg分布的情况
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappg_1200_pgp_2400
调整存储池的pgp为2400
./ceph -c ceph.conf osd pool set rbd pgp_num 2400
等迁移完成以后,统计最终的pg分布情况
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappg2400_pgp2400
这里说明一下,调整pg的时候只会触发pg的分裂,并不会影响集群的分布,也就是不会出现pg迁移的情况,调整pgp以后才会去改变pg的分布,所以本次数据分析统计的是pgp变动后的迁移的数据量,这个量才是集群的真正的迁移量
用比较的脚本来进行统计(脚本会在本文文末提供)
[root@lab8106 src]#python compair.py pgmappg_1200_pgp_2400 pgmappg2400_pgp2400
| pgs | objects |
-----------------
[2299, 115361]
也就是整个环境有2299次pg的变动,总共迁移的对象数目为115361个
分五次调整到2400PG
初始pg为1200个第一次调整,1200PG调整到1440PG
./ceph -c ceph.conf osd pool set rbd pg_num 1440
调整pg为1440,当前pgp为1200
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaira1
调整pgp为1440,当前pg为1440
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaira2
统计第一次调整后的迁移量
[root@lab8106 pgdata]# python compair.py pgmappaira1 pgmappaira2
| pgs | objects |
-----------------
[460, 27933]
第二次调整,1440PG调整到1680PG
./ceph -c ceph.conf osd pool set rbd pg_num 1680
调整pg为1680,当前pgp为1440
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairb1
调整pgp为1680,当前pg为1680
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairb2
统计第二次调整后的迁移量
[root@lab8106 pgdata]# python compair.py pgmappairb1 pgmappairb2
| pgs | objects |
-----------------
[458, 27730]
第三次调整,1680PG调整到1920PG
./ceph -c ceph.conf osd pool set rbd pg_num 1920
调整pg为1920,当前pgp为1680
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairc1
调整pgp为1920,当前pg为1920
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappairc2
统计第三次调整后的迁移量
[root@lab8106 pgdata]# python compair.py pgmappairc1 pgmappairc2
| pgs | objects |
-----------------
[465, 27946]
第四次调整,1920PG调整到2160PG
./ceph -c ceph.conf osd pool set rbd pg_num 2160
调整pg为2160,当前pgp为1920
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaird1
调整pgp为2160,当前pg为2160
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaird2
统计第四次调整后的迁移量
[root@lab8106 pgdata]# python compair.py pgmappaird1 pgmappaird2
| pgs | objects |
-----------------
[457, 21141]
第五次调整,2160PG调整到2400PG
./ceph -c ceph.conf osd pool set rbd pg_num 2400
调整pg为2400,当前pgp为2160
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaire1
调整pgp为2400,当前pg为2400
记录当前的pg分布数据
./ceph -c ceph.conf pg dump pgs|awk '{print $1,$2,$15,$17}' > pgmappaire2
统计第五次调整后的迁移量
[root@lab8106 pgdata]# python compair.py pgmappaire1 pgmappaire2
| pgs | objects |
-----------------
[458, 13938]
上面五次加起来的总量为
2305 PGS 132696 objects
统计的脚本
#!/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 |
调整PG分多次调整和一次到位的迁移差别分析的更多相关文章
- ceph PG数量调整/PG的状态说明
优化: PG Number PG和PGP数量一定要根据OSD的数量进行调整,计算公式如下,但是最后算出的结果一定要接近或者等于一个2的指数.调整PGP不会引起PG内的对象的分裂,但是会引起PG的分布的 ...
- k3 cloud成本调整单提示期末余额不存在调整单分录的维度,请先出库核算确认是否存在核算维度的数据
成本调整单提示期末余额不存在调整单分录的维度,请先出库核算确认是否存在核算维度的数据,如下图所示: 解决办法:先做出库核算,然后做成本调整单,再做出库核算(出库成本核算)
- CFormView动态调整对话框的尺寸和调整比例控制的部署
基于单个文件CFormView动态调整对话框的尺寸和调整比例控制的部署 假设你正在开发一个程序基于单个文件,使用CFormView基类来实现多种形式展示,那么,这个文件可能会给你一点帮助. 一.实现对 ...
- #调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著,但并不是越多越好),加上verbose=True,显示进程使用信息
#调整随机森林的参数(调整n_estimators随机森林中树的数量默认10个树,精度递增显著) from sklearn import datasets X, y = datasets.make_c ...
- #调整随机森林的参数(调整max_features,结果未见明显差异)
#调整随机森林的参数(调整max_features,结果未见明显差异) from sklearn import datasets X, y = datasets.make_classification ...
- 调整 全局jvm 大小 tomcat 调整jvm大小
z最近公司换了一个线上的windows服务器,原来的内存48g,现在2g.项目启动报内存不足.又重新安装jre 安装jre 教程链接:(谢谢各位博友) https://www.genban.org/t ...
- rem布局,在用户调整手机字体大小/用户调整浏览器字体大小后,布局错乱问题
一.用户调整浏览器字体大小,影响的是从浏览器打开的web页. 浏览器设置字体大小,影响浏览器打开的页面.通过js可控制用户修改字体大小,使页面不受影响. (function(doc, win) { / ...
- 微服务、分库分表、分布式事务管理、APM链路跟踪性能分析演示项目
好多年没发博,最近有时间整理些东西,分享给大家. 所有内容都在github项目liuzhibin-cn/my-demo中,基于SpringBoot,演示Dubbo微服务 + Mycat, Shardi ...
- Crush 算法以及PG和PGP调整经验
PG和PGP调整经验调整前准备为了降低对业务的影响,需要调整以下参数ceph tell osd.* injectargs ‘–osd-max-backfills 1’ceph tell osd.* i ...
随机推荐
- 为了运行十年前的代码,程序员们甚至翻出了一台 1977 年的 Apple II
"Hello, World!" 46 年过去,这段被世人熟知的代码仍散发着历久弥新的魅力,和它一起登场的 C 语言,如今也成长为世界几大通行编程语言之一,为互联网世界乃至现实世界都 ...
- 【C语言入门学习笔记】如何把C语言程序变成可执行文件!
环境 在ANSI的任何一种实现中,存在两种不同的环境. 翻译环境:在这个环境里,源代码被转换为可执行的机器指令. 执行环境:用于实际执行代码. 翻译环境 组成一个程序的每个源文件通过编译过程分别转成目 ...
- python正则找到字符串里面的数字
totalNumbers = re.findall(r'\d+',str)
- 计算机CPU是怎么认识代码的?
先说一下半导体,啥叫半导体?就是介于导体和绝缘体中间的一种东西,比如二极管. 电流可以从A端流向C端,但反过来则不行.你可以把它理解成一种防止电流逆流的东西. 当C端10V,A端0V,二极管可以视 ...
- JUC---10JMM
前提:什么是Volatile? Java 虚拟机提供轻量级的同步机制 1.保证可见性------->JMM 2.不保证原子性 3.禁止指令重排 一.什么是JMM 1.JMM : Java内存模型 ...
- LoRa技术的特点和组成系统分析
目前,基于LoRa技术的网络层协议主要是LoRaWAN,也有少量的非LoRaWAN协议,但是通信系统网络都是星状网架构,以及在此基础上的简化和改进.主要包括以下3种. (1)点对点通信. 一点对一点通 ...
- C# 中的 in 参数和性能分析
in 修饰符也是从 C# 7.2 开始引入的,它与我们上一篇中讨论的 <C# 中的只读结构体(readonly struct)>[1] 是紧密相关的. in 修饰符 in 修饰符通过引用传 ...
- Django做验证码登录
验证码 关注公众号"轻松学编程"了解更多. 1.作用 在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力 ...
- 学了元件作用域,我终于对JMeter开窍了
引子 先看一下这个例子,测试计划"进入考场"下面有一个线程组,线程组下面有 3 个 HTTP 请求,分别是学生登录.考场 token和进入房间: 它们的处理逻辑是: 学生登录后,在 ...
- Hadoop高可用
一.原因 - NameNode是HDFS的黑心配置HDFS有事hadoop的核心组件 NameNode 在Hadoop及群众至关重要 - NameNode的宕机导致集群的不可用 二.解决方案 其中 N ...