Ceph中PG和PGP的区别

http://www.zphj1987.com/2016/10/19/Ceph%E4%B8%ADPG%E5%92%8CPGP%E7%9A%84%E5%8C%BA%E5%88%AB/

一、前言

首先来一段英文关于PG和PGP区别的解释:

PG = Placement Group
PGP = Placement Group for Placement purpose

pg_num = number of placement groups mapped to an OSD

When pg_num is increased for any pool, every PG of this pool splits into half, but they all remain mapped to their parent OSD.

Until this time, Ceph does not start rebalancing. Now, when you increase the pgp_num value for the same pool, PGs start to migrate from the parent to some other OSD, and cluster rebalancing starts. This is how PGP plays an important role.
By Karan Singh

以上是来自邮件列表的 Karan Singh 的PG和PGP的相关解释,他也是 Learning Ceph 和 Ceph Cookbook 的作者,以上的解释没有问题,我们来看下具体在集群里面具体作用

二、实践

环境准备,因为是测试环境,我只准备了两台机器,每台机器4个OSD,所以做了一些参数的设置,让数据尽量散列

osd_crush_chooseleaf_type = 0

以上为修改的参数,这个是让我的环境故障域为OSD分组的

创建测试需要的存储池
我们初始情况只创建一个名为testpool包含6个PG的存储池

[[email protected] ceph]# ceph osd pool create testpool 6 6pool ‘testpool‘ created

我们看一下默认创建完了后的PG分布情况

[[email protected] ceph]# ceph pg dump pgs|grep ^1|awk ‘{print $1,$2,$15}‘dumped pgs in format plain1.1 0 [3,6,0]1.0 0 [7,0,6]1.3 0 [4,1,2]1.2 0 [7,4,1]1.5 0 [4,6,3]1.4 0 [3,0,4]

我们写入一些对象,因为我们关心的不仅是pg的变动,同样关心PG内对象有没有移动,所以需要准备一些测试数据,这个调用原生rados接口写最方便

rados -p testpool bench 20 write --no-cleanup

我们再来查询一次

[[email protected] ceph]# ceph pg dump pgs|grep ^1|awk ‘{print $1,$2,$15}‘dumped pgs in format plain1.1 75 [3,6,0]1.0 83 [7,0,6]1.3 144 [4,1,2]1.2 146 [7,4,1]1.5 86 [4,6,3]1.4 80 [3,0,4]

可以看到写入了一些数据,其中的第二列为这个PG当中的对象的数目,第三列为PG所在的OSD

增加PG测试

我们来扩大PG再看看

[[email protected] ceph]# ceph osd pool set testpool pg_num 12set pool 1 pg_num to 12

再次查询

[[email protected] ceph]# ceph pg dump pgs|grep ^1|awk ‘{print $1,$2,$15}‘dumped pgs in format plain1.1 37 [3,6,0]1.9 38 [3,6,0]1.0 41 [7,0,6]1.8 42 [7,0,6]1.3 48 [4,1,2]1.b 48 [4,1,2]1.7 48 [4,1,2]1.2 48 [7,4,1]1.6 49 [7,4,1]1.a 49 [7,4,1]1.5 86 [4,6,3]1.4 80 [3,0,4]

可以看到上面新加上的PG的分布还是基于老的分布组合,并没有出现新的OSD组合,因为我们当前的设置是pgp为6,那么三个OSD的组合的个数就是6个,因为当前为12个pg,分布只能从6种组合里面挑选,所以会有重复的组合

根据上面的分布情况,可以确定的是,增加PG操作会引起PG内部对象分裂,分裂的份数是根据新增PG组合重复情况来的,比如上面的情况

  • 1.1的对象分成了两份[3,6,0]
  • 1.3的对象分成了三份[4,1,2]
  • 1.4的对象没有拆分[3,0,4]

结论:增加PG会引起PG内的对象分裂,也就是在OSD上创建了新的PG目录,然后进行部分对象的move的操作

增加PGP测试

我们将原来的PGP从6调整到12

[[email protected] ceph]# ceph osd pool set testpool pgp_num 12[[email protected] ceph]# ceph pg dump pgs|grep ^1|awk ‘{print $1,$2,$15}‘dumped pgs in format plain1.a 49 [1,2,6]1.b 48 [1,6,2]1.1 37 [3,6,0]1.0 41 [7,0,6]1.3 48 [4,1,2]1.2 48 [7,4,1]1.5 86 [4,6,3]1.4 80 [3,0,4]1.7 48 [1,6,0]1.6 49 [3,6,7]1.9 38 [1,4,2]1.8 42 [1,2,3]

可以看到PG里面的对象并没有发生变化,而PG所在的对应关系发生了变化
我们看下与调整PGP前的对比

*1.1 37 [3,6,0]          1.1 37 [3,6,0]*
1.9 38 [3,6,0]          1.9 38 [1,4,2]
*1.0 41 [7,0,6]          1.0 41 [7,0,6]*
1.8 42 [7,0,6]          1.8 42 [1,2,3]
*1.3 48 [4,1,2]          1.3 48 [4,1,2]*
1.b 48 [4,1,2]          1.b 48 [1,6,2]
1.7 48 [4,1,2]          1.7 48 [1,6,0]
*1.2 48 [7,4,1]          1.2 48 [7,4,1]*
1.6 49 [7,4,1]          1.6 49 [3,6,7]
1.a 49 [7,4,1]          1.a 49 [1,2,6]
*1.5 86 [4,6,3]          1.5 86 [4,6,3]*
*1.4 80 [3,0,4]          1.4 80 [3,0,4]*

可以看到其中最原始的6个PG的分布并没有变化(标注了*号),变化的是后增加的PG,也就是将重复的PG分布进行新分布,这里并不是随机完全打散,而是根据需要去进行重分布

结论:调整PGP不会引起PG内的对象的分裂,但是会引起PG的分布的变动

三、总结

  • PG是指定存储池存储对象的目录有多少个,PGP是存储池PG的OSD分布组合个数
  • PG的增加会引起PG内的数据进行分裂,分裂到相同的OSD上新生成的PG当中
  • PGP的增加会引起部分PG的分布进行变化,但是不会引起PG内对象的变动

原文地址:https://www.cnblogs.com/wangmo/p/11393544.html

时间: 2024-10-10 18:37:19

Ceph中PG和PGP的区别的相关文章

Ceph中的容量计算与管理

转自:https://www.ustack.com/blog/ceph%ef%bc%8drongliang/ 在部署完Ceph集群之后,一般地我们可以通过Ceph df这个命令来查看集群的容量状态,但是Ceph是如何计算和管理的呢?相信大家都比较好奇.因为用过 ceph df这个命令的人都会有这个疑问,它的输出到底是怎么计算的呢?为什么所有pool的可用空间有时候等于GLOBAL中的可用空间,有时候不等呢? 带着这些疑问我们可以通过分析ceph df的实现,来看看Ceph是如何计算容量和管理容量

调整ceph的pg数(pg_num, pgp_num)

https://www.jianshu.com/p/ae96ee24ef6c 调整ceph的pg数 PG全称是placement groups,它是ceph的逻辑存储单元.在数据存储到cesh时,先打散成一系列对象,再结合基于对象名的哈希操作.复制级别.PG数量,产生目标PG号.根据复制级别的不同,每个PG在不同的OSD上进行复制和分发.可以把PG想象成存储了多个对象的逻辑容器,这个容器映射到多个具体的OSD.PG存在的意义是提高ceph存储系统的性能和扩展性. 如果没有PG,就难以管理和跟踪数

Ceph —— 均衡PG

Ceph —— 均衡PG 日常工作中,我们常常会发现PG不均衡,而集群中只要有一个OSD先达到full的状态,则整个集群都无法写入数据,所以为了尽可能的提高集群存储空间的利用率,我们都希望PG尽可能的均匀分布在OSD上. 出现PG不均衡最常见的背景情况: 刚刚安装部署Ceph集群完毕 集群扩容或是其他情况,进行了加盘的操作,OSD数量发生变化 为了节省日常工作的时间,针对PG均衡问题,写了个python脚本: version : ceph_luminous (12.2.2) 1 #!/usr/b

【翻译】JAVA中抽象类和接口的区别

不知道有没有人翻译过了,这篇是挺简单的,权当复习一遍内容吧. 很多常见的面试问题如"抽象类和接口有什么区别","你在什么时候用抽象类什么时候用接口".所以在这篇文章里面,我们会讨论一下这个话题. 在开始讨论它们的区别之前,我们先看看它们的介绍. Abstract class 抽象类 抽象类被用来抽象出子类的共同特征.它是不能被实例化的,它只能被子类继承作为超类使用.抽象类被用作它的子类下的层次结构创建模板(Abstract classes are used to c

lua中的pairs和ipairs区别

pairs Returns three values: the next function, the table t, and nil, so that the construction for k,v in pairs(t) do body end will iterate over all key–value pairs of table t. See function next for the caveats of modifying the table during its traver

浅谈HTTP中Get与Post的区别_转

可参考:HTTP请求中POST与GET的区别 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作.到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息. 1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的

python类中super()和__init__()的区别

本文和大家分享的主要是python开发中super()和__init__()的区别,希望通过本文的分享,对初学者学习这部分内容有所帮助. 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'creat A ', Base.__init__(self) class chi

PHP中this,self,parent的区别

{一}PHP中this,self,parent的区别之一this篇 面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能.利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意义的. PHP5经过重写后,对OOP的支持额有了很大的飞跃,成为了具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性.这里我主要谈的是this,self,parent 三个关键字之间的区别.从字面上来理解,分别

【转载】C#中[],List,Array,ArrayList的区别及应用

本篇文章主要是对C#中[],List,Array,ArrayList的区别及应用进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 [] 是针对特定类型.固定长度的. List 是针对特定类型.任意长度的. Array 是针对任意类型.固定长度的. ArrayList 是针对任意类型.任意长度的. Array 和 ArrayList 是通过存储 object 实现任意类型的,所以使用时要转换.