PG如何影响数据分布
引言
有位朋友(下文简称小明)的集群OSD数据分布很不均匀,最多的OSD已经被使用了90%,而最少的才用了40%,这种现象的原因基本上可以确定为PG总数设置少了,再加上经常有朋友会问及到每个Pool的PG数该怎么设置,我这里就说下PG对数据分布的影响。
因为怎么做官网的pg计算器已经讲得很明确了,我主要想介绍下为什么要这么做。
实验环境准备
这里我完全重搭建出了小明的集群环境,需要他提供几个参考值:
ceph osd tree
: 用于重建CRUSH树,确定OSD权重。ceph df
:查看集群数据总数。ceph osd pool ls detail
,查看每个pool的PG数。ceph -v
: 同样的Ceph版本。
简单概述下小明的集群的状态:三主机,每个主机上13个OSD,每个OSD权重为1.08989
,三副本,三个PG数均为512的pool,数据量分别为102GB, 11940GB, 3454GB, 9.2.1
的版本的Ceph。
我用手头的三个虚拟机,每个虚拟机建立了13个目录,用来建OSD,配置文件里添加了两个配置osd crush update on start = false, osd journal size = 128
,用于建完OSD后,将OSD手动添加至CRUSH中,并保证权重和小明的OSD权重一样,又因为只是试验用,就把journal大小设置很小,主要是盘太多了。
在所有OSD完成prepare+activate
正常启动后,创建三个Bucket(host),并将所有的OSD添加至对应的Host下面,形如:ceph osd crush add osd.0 1.08989 host=ceph-1
。添加两个pool,并将这三个pool的PG都设置为512,环境准备完毕。给个截图看得清楚点(对的,OSD编号本来就不连续,我是按照原样的顺序重建的):
查看数据分布
我从磨磨的博客里找了个统计PG分布的脚本,列出了这个集群的PG分布,如下图:
简单说下这个图的意义:
pool: 0 1 2
:表示pool的编号。osd.0 23 20 18
: 表示osd.0
上有23个pool 0
的PG,20个pool 1
的PG,18个pool 2
的PG。
这里着重关注下osd.46
和osd.41
上的PG数:
osd.41
: 22-17-9
osd.46
: 23-33-34
集群三个pool的数据分布为: 102GB, 11940GB, 3454GB
这里我们假定(实际上也是),每个pool里面的PG的数据量是相同的,那么这三个pool的PG数据量平均为:
pool 0
: 102GB/512 = 0.2GBpool 1
: 11940GB/512 = 23.32GBpool 2
: 3454GB/512 = 6.75GB
那么这里很快可以计算出这两个OSD上的数据量:
osd.41
: 22*0.2 + 17*23.32 + 9*6.75 = 461.59GB (实际456G)osd.46
: 23*0.2 + 33*23.32 + 34*6.75 = 1003.66GB (实际994G)
这里再给出小明集群磁盘实际使用率,和我这里估算出来的值基本一样,不信可以再找个OSD算算:
信息量
整个实验过程,其实包含了很多有用的结论,这里我先罗列下:
- 只需要提供开篇的几个参考值,搭建出来的集群的PG分布就是完全一样的,因为
CRUSH(PG)=>OSD set
,CRUSH计算PG分布需要知道OSD的权重,CRUSH的树状结构,pool_id+pg_num,只要这些值一样,计算出的结果也一样,简单点说就是克隆出来一个一模一样的集群,只需要几个参考值。 - 对于同一个池内的PG,它们的数据量是几乎相等的,这也是有理论依据的,因为
HASH(obj) % PG_NUM => PG_ID
,这在我的大话CRUSH一文中也有介绍,对于几百万个对象,求余得到的PG_ID是很均匀的,所以PG内的数据量是相等的。 - 对于不同的pool的PG,分布的数据不一定相等,因为每个pool的数据量不一定相等,比如小明的数据量分布我可以很容易猜测到他使用了
openstack+ceph
的架构,第一个pool为rbd
,没有保存生产数据,二三两个pool的数据比例为11940:3454 = 3.45:1
,很明显第二个pool用于保存虚拟机,第三个用于保存镜像。这种近似4:1
的数据量的结构一般都是openstack+ceph
的架构。而每个PG的数据量是由pool_data/pg_num
求得的。 - 从集群搭建好PG数设置好之后,我们就可以预估某个OSD会在数据量达到一定值的时候被塞满了,我们只需要每个pool的数据总量即可估算,这里我想表达的是,既然这是一个可预见的问题,我们就应该在集群设置之初解决这个问题。
正确设置PG的姿势
首先要定几个规则:
- 每个OSD上的PG总数应该尽量相等,且在100左右。
- 每个pool的PG数应该为2的n次方。
- 每个PG(所有pool)上的数据应该尽量相等。
主要问题在第三点,由上面的数据可以知道,openstack的两个pool的每个PG的平均数据量并不相等:23.32GB和6.75GB,造成不相等的原因是,这两个pool里面保存的数据量总数不相等(通常为3:1~5:1),而他们的PG数却是相等的,所以,如果把他们的PG数设置为4:1的话,总数除以PG数得到的均值应该就基本上相等了。
所以这里,一个非常非常非常重要的结论就是,应该按照集群的所有pool的数据量的比例来设置每个pool的PG数!
而这个比例通常不好估计,Ceph官网给我们提供了一个计算公式,给出了常见的生产配比:
比如openstack结构的给出了8:1的比例,因为volumes
池会随业务持续增长,而images
池可能在上传完镜像后就不再变化,所以这里的8:1
的比例应该是考虑到长远的业务增长造成的volumes
池数据不断增长,我们平时看到的3:1->5:1
说明业务还有增长空间~~:
亦或RGW结构的,对.rgw.buckets
数据桶给了较大的PG数:
如果我们有30个OSD,跑三副本的话,要保证每个OSD上有100个PG的话,那么一共会有30 (OSD) * 100 (PG/OSD)
= 3000 PG ,再除以三副本的3,就是1000个不同的PG,如果使用8:1
的结构的话,我们可以分别设为1024
和128
的PG数。 主要方法是让最大的pool向1000靠近,取最接近于2的n次方的值,这里取1024,再加上八分之一的128,最终结果会导致每个OSD上的PG稍微大于100,不过这没有关系,即使到了两百都可以接受。
对于小明的例子,共有69个OSD,每个OSD上有100个PG的话,共有69 * 100 / 3 = 2300
个PG,按照八比一来分,大的pool我们取2048,小的取256,一共2304,正好极其接近2300,是一个很理想的值。
再取个比较难分的情况,比如共有100个OSD,那么共有3333个PG,还是八比一,这里我们选择往上取PG值,对于大pool,我们取4096,而不是2048,小pool取512,这样会使得每个OSD平均分到了138个PG,大一点,没有关系的,但是一定不要比100小很多,那样会导致OSD的PG最大最小的比例较大。
主要方法就是求出这个集群总共有多少PG,然后让数据最大的池的PG数向这个数靠近往上取2的n次方,结果大一点没关系,最好每个OSD平均100PG以上,取到了两百也没有关系,就是不能小。
还有个叫rbd
的系统默认生成的池,这个池如果没有用到的话,直接删掉就好了。
这时候回过来看下小明的PG分布,剔除rbd
池的PG,实际上osd.41
上只有17+9=26
个PG,而osd.46
上却有33+34=67
个PG,因为rbd
池基本不放数据,所以可以忽视掉对数据分布的影响,就像RGW的PG分布除了数据池很大外其他pool的PG都很小的原因。很明显,数据的分布不均是由于这两个OSD上的PG数比例较大导致的。
解决方法
说了这么多,小明到底应该怎么做呢?首先,要铭记于心的一个结论是:pg_num只能大不能小
,很不幸的是,据我所知,小明同学已经把三个pool的pg_num都设置为了1024,如果时间可以倒流的话,我会建议他将volumes
池设置为2048,images
池设置为512,因为不能再小了,既然已经都设到了1024,那么就再把volumes
池的PG设到2048吧,rbd
又不想删又不能减小,那就丢那吧,一个空的pool,不论PG多少,都不会对OSD数据分布有影响,起决定作用的是数据最多的那个pool,所以对于volumes
池,一定要将PG增大到使得每个OSD的PG(这里的PG可以说是不包含rbd的,仅包含volumes的)平均分布100左右。
还有一个缓解办法
:手动调整OSD weight,削峰填谷。对于即将满的OSD,降低它的权重,让它把数据迁移到别的盘上去,但是对于小明这里的情况,需要削的峰太多了,因为100±20的峰和50±20的峰是不一样的,如果是100的话80:120=2:3的比例,如果是50的话就是30:70的比例了,PG的比例会最终导致展现为数据分布的比例。所以,并不是很建议去使用这种缓解方法。
现在,我们删去rbd
池,将volumes
设到2048,看下PG分布:
前面的为volumes
池的,最大误差为-20% ~ + 28%
, 比之前的-59.6% ~ +52.3%
要缩小很多,平均每个OSD上89个volumes
池的PG,因为此时两个pool的PG比例为4:1,并且实际数据比例也约为4:1,所以,每个OSD上的PG总数比例就是最终OSD上的数据比例,最小是85个,最大是137个,所以对于一个1.1T的磁盘,最大的存储到1T时,最小的才使用到85/137=0.62T
, 不过这要比之前的0.4T要好很多了。对于137这种峰,我们可以削掉。
总结
这篇文章并没有说明在OSD即将满时该怎么处理,而是解释了为什么PG的分布不均会导致OSD的数据分布不均,重点需要明确的观念是,每个pool的PG数量应该根据这个pool实际的保存数据比例来定,最终使得每个OSD的平均PG在一百左右,在构建完集群后,最好检测一下集群的PG分布,提前将几个峰值削去,而不是等到数据真正堆满了再去削,那时候的数据迁移很容易导致集群垮掉,尽量使得每个OSD的PG分布在±20%以下。
PG如何影响数据分布相关推荐
- pg高性能服务器,Pgpool-II 负载均衡对PG的性能影响
Pgpool-II相当于中间件,Pgpool-II与PG是解耦合的,基于这样的机制,Pgpool-II可以搭建在已经存在的任意版本的PG主从结构上,主从结构的实现与Pgpool-II无关,可以通过sl ...
- 类间样本数量不平衡对分类模型性能的影响问题
我在做人脸检测试验的时候,发现了问题,别人的二分类器(判别是不是人脸)的阈值很高,大于90%点概率,而我的阈值要设置的很低10%点概率即认为是脸,经过观察,我的负样本数数量上比正样本数多的太多了,导致 ...
- 万字综述之生成对抗网络(GAN)
作者丨郭晓锋 单位丨爱奇艺 研究方向丨图像生成 前阵子学习 GAN 的过程发现现在的 GAN 综述文章大都是 2016 年 Ian Goodfellow 或者自动化所王飞跃老师那篇.可是在深度学习,G ...
- 转载:Ceph论文译文
译者注:本文是出于作者对于ceph的兴趣,在开源中国上关注ceph翻译,没有看到ceph论文的相关翻译,索性在阅读过程中把它翻译了出来,花费了几个周末时间,翻译过程中收获颇多,现把译文分享出来,如对您 ...
- 译文 Ceph:一个可扩展,高性能分布式文件系统
译者注:本文是出于作者对于ceph的兴趣,在开源中国上关注ceph翻译,没有看到ceph论文的相关翻译, 索性在阅读过程中把它翻译了出来,花费了几个周末时间,翻译过程中收获颇多,现把译文分享出来,如对 ...
- 【分析】Ceph:一个可扩展,高性能分布式文件系统
译者注:本文是出于作者对于ceph的兴趣,在开源中国上关注ceph翻译,没有看到ceph论文的相关翻译,索性在阅读过程中把它翻译了出来,花费了几个周末时间,翻译过程中收获颇多,现把译文分享出来,如对您 ...
- Ceph论文译文--Ceph:一个可扩展,高性能分布式文件系统 (转载)
Ceph论文译文--Ceph:一个可扩展,高性能分布式文件系统 分类: Storage 2014-09-23 11:56 1146人阅读 评论(0) 收藏 举报 Ceph 目录(?)[+] Ceph一 ...
- 理解计算:从根号2到AlphaGo番外篇——眼见未必为实--漫谈图像隐写术
有很多技术都致力于保护信息安全,其中有两类技术最为著名,一个是密码学,另一类就是密写术,也称为隐写术.应邀借此机会向大家谈谈隐写术这个很多人都不太熟悉的领域.本文将带领大家了解隐写技术发展的历史,现代 ...
- 一致 先验分布 后验分布_浅谈Loki分布式架构中的一致性哈希
云原生小白 看到上面蓝色字了么?关注下吧! Loki在分布式部署的模式下,保存Ingester服务的状态主要有3个渠道,分别是etcd.consul和基于gossip协议的memberlist.不管L ...
- sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南
原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...
最新文章
- python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序
- Facebook iOS 应用是如何加速图片显示的?
- PageRank算法以及Python实现(简洁版)
- HDU 1540 Tunnel Warfare
- 【计网】计算机网络期末总复习-谢希仁(个人总结)理论概念
- step3 . day7数据结构之二叉顺序数的创建和二叉树的栈形式遍历
- [zz]zookeeper的配置项
- 这个 bug 让我更加理解 Spring 单例了
- gz解压命令 linux_Linux日常篇-解压缩命令
- 360画报屏保,放大营销“感官力”
- 【Python爬虫】网络爬虫的“盗亦有道”
- 利用Scrapy框架爬取落网上的音乐文件
- vim移动一行或一段代码
- 2021年高考呼和浩特市二中成绩查询,呼和浩特市第二中学,是一所百强中学,2020年高考用实力来证明!...
- python展示文件_python之文件的读写和文件目录以及文件夹的操作实现代码
- 【驱动安装及keil使用】win10 stm32 stlink驱动安装,检测不到芯片,下载不了程序
- 电路图符号科普、整流电路、稳压电路、放大电路及调幅与检波电路和常见的基本电路
- Q4实现盈利,搜狐迎来“疫”外春天?
- P9 android8 第三方,华为P9--第三方安卓8.0ROM--GZOSP Oreo--XDA 已发布!
- %3c %3e是什么编程语言,第1章 网站数据分析与网站统计工具基础.ppt
热门文章
- [20151018]SCZ训练
- 记一次给笔记本安装固态硬盘
- 基于Tushare量化分析示例
- 裸眼3D大屏,打破人们的认知
- Credential Harvester Attack Method获得用户信息
- CS224W摘要12.Frequent Subgraph Mining with GNNs
- html京东下拉菜单设置,实现京东导航栏的下拉框
- 量子混沌:相互作用如何影响量子多体系统的局域化?
- MongoDB + Spark: 完整的大数据解决方案
- [截稿日期] 人机交互与普适计算方向的A、B类国际会议