引言

PG,Placement Group,中文翻译为归置组,在ceph中是一个很重要的概念,这篇文章将对PG进行深入浅出的讲解。

PG是什么

PG就是目录!

我事先搭建了一个3个host, 每个host有3个OSD的集群,集群使用3副本,min_size为2。
集群状态如下:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

 

[root@ceph-1 ~]# ceph osd tree

ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY

-1 17.90991 root default

-2 5.96997 host ceph-1

0 1.98999 osd.0 up 1.00000 1.00000

1 1.98999 osd.1 up 1.00000 1.00000

2 1.98999 osd.2 up 1.00000 1.00000

-4 5.96997 host ceph-2

3 1.98999 osd.3 up 1.00000 1.00000

4 1.98999 osd.4 up 1.00000 1.00000

5 1.98999 osd.5 up 1.00000 1.00000

-3 5.96997 host ceph-3

6 1.98999 osd.6 up 1.00000 1.00000

7 1.98999 osd.7 up 1.00000 1.00000

8 1.98999 osd.8 up 1.00000 1.00000

每一个pool都有一个id,系统默认生成的rbd池的id号为0,那么rbd池内的所有PG都会以0.开头,让我们看一下osd.0下面的current目录的内容:

 

1

2

3

4

 

[root@ceph-1 ~]# ls /var/lib/ceph/osd/ceph-0/current/

0.0_head 0.1d_head 0.34_head 0.45_head 0.4e_head

....省略部分内容

0.af_head 0.bc_head 0.d0_head 0.e2_head 0.f4_head

每个OSD的current目录下都保存了部分的PG,而rbd池的PG以0.xxx_head的目录形式存在!

现在我们通过rados向集群写入一个文件(char.txt),在集群内保存名为char,通过下面的指令查看该文件实际保存的位置:

 

1

2

 

[root@ceph-1 ~]# ceph osd map rbd char

osdmap e109 pool 'rbd' (0) object 'char' -> pg 0.98165844 (0.44) -> up ([0,7,4], p0) acting ([0,7,4], p0)

可见,文件会保存在PG 0.44中,而这个PG位于osd.0,osd.7,osd.4中,之所以有这里有三个OSD,是因为集群副本数为3,可以在0/7/4这三个OSD的current下找到0.44_head目录。而同一份文件(比如这里的char.txt)的三个副本会分别保存在这三个同名的PG中。

执行指令,将char.txt文件存入集群,并查看各个OSD的PG目录内容:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

 

[root@ceph-1 cluster]# rados -p rbd put char char.txt

[root@ceph-1 0.44_head]# pwd && ll

/var/lib/ceph/osd/ceph-0/current/0.44_head

-rw-r--r--. 1 root root 8 8月 25 01:38 char__head_98165844__0

-rw-r--r--. 1 root root 0 8月 24 23:40 __head_00000044__0

[root@ceph-2 0.44_head]# pwd && ll

/var/lib/ceph/osd/ceph-4/current/0.44_head

-rw-r--r-- 1 root root 8 8月 25 13:38 char__head_98165844__0

-rw-r--r-- 1 root root 0 8月 25 11:40 __head_00000044__0

[root@ceph-3 0.44_head]# pwd && ll

/var/lib/ceph/osd/ceph-7/current/0.44_head

-rw-r--r-- 1 root root 8 8月 25 13:38 char__head_98165844__0

-rw-r--r-- 1 root root 0 8月 25 11:40 __head_00000044__0

可见,这三个OSD保存了这个文件的三分副本,这就是ceph的多副本的基础,将一份数据保存成多个副本,按照一定规则分布在各个OSD中,而多副本的数据的一个特点就是,他们都保存在同名的PG下面,也就是同名的目录下。这样,我们就对PG有了一个直接的理解。

active+clean想说爱你不容易

active + clean是PG的健康状态,然而PG也会生病,有的是小感冒,有的则可能是一级伤残,下面就是集群进入恢复状态时的一个截图,这里面聚集了各种老弱病残,现在就来分析下每种病症的原因:

这里再次回忆下集群的配置:size = 3, min_size = 2

Degraded

降级:由上文可以得知,每个PG有三个副本,分别保存在不同的OSD中,在非故障情况下,这个PG是a+c状态,那么,如果保存0.44这个PG的osd.4挂掉了,这个PG是什么状态呢,操作如下:

 

1

2

3

4

5

 

[root@ceph-2 ~]# service ceph stop osd.4

=== osd.4 ===

Stopping Ceph osd.4 on ceph-2...kill 6475...kill 6475...done

[root@ceph-2 ~]# ceph pg dump_stuck |egrep ^0.44

0.44 active+undersized+degraded [0,7] 0 [0,7] 0

这里我们前往ceph-2节点,手动停止了osd.4,然后查看此时pg 0.44的状态,可见,它此刻的状态是active+undersized+degraded,当一个PG所在的OSD挂掉之后,这个PG就会进入undersized+degraded状态,而后面的[0,7]的意义就是还有两个0.44的副本存活在osd.0和osd.7上。那么现在可以读取刚刚写入的那个文件吗?是可以正常读取的!

 

1

2

3

 

[root@ceph-1 0.44_head]# rados -p rbd get char char.txt

[root@ceph-1 0.44_head]# cat char.txt

abcdefg

降级就是在发生了一些故障比如OSD挂掉之后,ceph将这个OSD上的所有PG标记为degraded,但是此时的集群还是可以正常读写数据的,降级的PG只是相当于小感冒而已,并不是严重的问题,而另一个词undersized,我的理解就是当前存活的PG 0.44数为2,小于副本数3,将其做此标记,也不是严重的问题。

Peered

那么,什么才是PG的大病呢,peered算是一个,刚刚我们关闭了osd.4,集群里还活着两个PG 0.44,现在我们关闭osd.7,查看下0.44的状态:

 

1

2

3

4

5

 

[root@ceph-3 0.44_head]# service ceph stop osd.7

=== osd.7 ===

Stopping Ceph osd.7 on ceph-3...kill 5986...kill 5986...done

[root@ceph-2 ~]# ceph pg dump_stuck |egrep ^0.44

0.44 undersized+degraded+peered [0] 0 [0] 0

可见,现在只剩下独苗苗活在osd.0上了,并且0.44还多了一个状态:peered,英文的意思是仔细看,这里我们可以理解成协商、搜索,这时候读取char.txt文件,会发现指令会卡在那个地方一直不动,如此来解释min_size的作用,在ceph中,它的全名叫做osd_pool_default_min_size,这里大家就会问了,不是还活着一个呢吗,为什么就不能读取内容了,因为我们设置的min_size=2,在ceph中的意义就是,如果存活数少于2了,比如这里的1 ,那么ceph就不会响应外部的IO请求。

在这里如果执行指令,将min_size设置为1:

 

1

2

3

 

[root@ceph-2 ~]# ceph osd pool set rbd min_size 1

[root@ceph-2 ~]# ceph pg dump_stuck |egrep ^0.44

0.44 active+undersized+degraded [0] 0 [0] 0

可以看到,0.44没有了peered状态,并且文件可以正常读写了,因为min_size=1时,只要集群里面有一份副本活着,那就可以响应外部的IO请求。

peered,我们这里可以将它理解成它在等待其他兄弟姐妹上线,这里也就是osd.4和osd.7的任意一个上线就可以去除这个状态了,处于peered状态的PG是不能响应外部的请求的,外部就会觉得卡卡的。

Remapped

ceph强大的自我恢复能力,是我们选择它的一个重要原因,在上面的试验中,我们关闭了两个OSD,但是至少还有一个PG 0.44存活在osd.0上,如果那两个盘真的坏了,ceph还是可以将这份仅存的数据恢复到别的OSD上的。

在OSD挂掉5min(default 300s)之后,这个OSD会被标记为out状态,可以理解为ceph认为这个OSD已经不属于集群了,然后就会把PG 0.44 map到别的OSD上去,这个map也是按照一定的规则的,重映射之后呢,就会在另外两个OSD上找到0.44这个PG,而这只是创建了这个目录而已,丢失的数据是要从仅存的OSD上回填到新的OSD上的,处于回填状态的PG就会被标记为backfilling

所以当一个PG处于remapped+backfilling状态时,可以认为其处于自我克隆复制的自愈过程。

Recover

这里我们先来做一个实验,首先开启所有OSD使得集群处于健康状态,然后前往osd.4的PG 0.44下面删除char__head_98165844__0这个文件,再通知ceph扫描(scrub)这个PG:

 

1

2

3

4

5

 

[root@ceph-2 0.44_head]# pwd && rm -f char__head_98165844__0

/var/lib/ceph/osd/ceph-4/current/0.44_head

[root@ceph-2 0.44_head]# ceph pg scrub 0.44

[root@ceph-2 0.44_head]# ceph pg dump |egrep ^0.44

active+clean+inconsistent [0,7,4] 0 [0,7,4] 0

可见,0.44多了个inconsistent状态,顾名思义,ceph发现了这个PG的不一致状态,这样就可以理解这个状态的意义了。

想要修复丢失的文件呢,只需要执行ceph pg repair 0.44,ceph就会从别的副本中将丢失的文件拷贝过来,这也是ceph自愈的一个情形。

现在再假设一个情形,在osd.4挂掉的过程中呢,我们对char文件进行了写操作,因为集群内还存在着两个副本,是可以正常写入的,但是osd.4内的数据并没有得到更新,过了一会,osd.4上线了,ceph就发现,osd.4的char文件是陈旧的,就通过别的OSD向osd.4进行数据的恢复,使其数据为最新的,而这个恢复的过程中,PG就会被标记为recover

总结

至此,我们对PG在磁盘的具体意义进行了分析,相信大家也对PG有了更深入的理解,同时,对常见的PG状态进行了剖析,今后看到了长长的病例单也不会有所畏惧了。
最后,本文对PG状态的解释都基于作者对ceph浅显的理解,如果有错误的地

转自:http://xuxiaopang.com/2016/10/09/easy-ceph-PG/

大话Ceph--PG那点事儿相关推荐

  1. Ceph pg状态总结

    PG( placement group)是一个放置策略组,它是对象的集合,该集合里的所有对象都具有相同的放置策略:简单点说就是相同PG内的对象都会放到相同的硬盘上: PG是 ceph的核心概念, 服务 ...

  2. ceph PG状态及部分故障(状态)模拟

    1. PG介绍 这次主要来分享Ceph中的PG各种状态详解,PG是最复杂和难于理解的概念之一,PG的复杂如下: - 在架构层次上,PG位于RADOS层的中间. a. 往上负责接收和处理来自客户端的请求 ...

  3. Ceph入门到精通-Ceph PG状态详细介绍(全)

    本文主要介绍PG的各个状态,以及ceph故障过程中PG状态的转变. Placement Group States(PG状态) creating Ceph is still creating the p ...

  4. ceph pg不一致问题

    今天在公司环境中出现了pg不一致问题,通过ceph health detail命令查看如下: pg 19.211 is active+clean+inconsistent, acting [88,16 ...

  5. ceph PG和PGP调整经验

    PG和PGP调整经验 调整前准备 为了降低对业务的影响,需要调整以下参数 ceph tell osd.* injectargs '–osd-max-backfills 1' ceph tell osd ...

  6. Ceph PG 归置组状态

    归置组状态 检查集群状态时(如运行 ceph -s 或 ceph -w ), Ceph 会报告归置组状态.一个归置组有一到多种状态,其最优状态为 active+clean . Creating Cep ...

  7. ceph PG设计,状态机,peering,recovery 导图

  8. 【ceph】ceph集群PG(归置组)存在的意义是什么?

    Ceph 的 RADOS中,引入了 PG 的概念用以更好地管理数据.PG 的引入降低对数量巨大的对象的管理难度. 1.对象数量时刻处于变化中.而PG的数量经过人工规划因而严格可控. 2.PG数量远小于 ...

  9. 大话Ceph--CephX 那点事儿

    <大话 Ceph >系列文章通过通俗易懂的语言并结合基础实验,用最简单的描述来讲解 Ceph 中的重要概念.让读者对分布式存储系统有一个清晰的理解. 引言 这篇文章主要介绍了 Ceph 中 ...

  10. ceph分布式存储-常见 PG 故障处理

    3. 常见 PG 故障处理 3.1 PG 无法达到 CLEAN 状态 创建一个新集群后,PG 的状态一直处于 active , active + remapped 或 active + degrade ...

最新文章

  1. vue切换路由时动画
  2. 录屏 模拟器_Scrcpy-在电脑无缝操作手机 (投屏/录屏/免Root)
  3. 文本编辑器实现打开帮助文件的功能
  4. javascript真的是异步的吗?且看setTimeout的实现原理以及setTimeout(0)的使用场景
  5. gRPC-微服务间通信实践
  6. POJ 计算几何(3)
  7. 【今日CS 视觉论文速览】31 Dec 2018
  8. 企业运维几百个重点面试题汇总(老男孩)
  9. 如何遍历或枚举JavaScript对象?
  10. Activemq 使用ssl说明
  11. java快排原理_快速排序 java实现 (原理-优化) 三路快排
  12. matlab中的小函数
  13. 【UOJ#310】【UNR#2】黎明前的巧克力(FWT)
  14. Android 开发错误集锦
  15. 微信支付H5完整版代码
  16. 微信支付-企业付款到零钱
  17. 保利威视 获取回放API接口
  18. 思科pt静态路由的简单配置
  19. python打开autocad
  20. 神经复杂系统前沿:关于认知大脑的两种观念

热门文章

  1. JAVA根据字符串生成HTML
  2. unc 目录不受支持_windows unc途径不受支持的解决
  3. 金额转中文大写源代码(原创)
  4. 简单导出rv1126工程环境
  5. Java详解:淘宝秒杀脚本java
  6. 重返天梯-L3-014 周游世界 (30 分)(dfs)
  7. MySQL存储过程分支语句_mysql 高级语句--存储过程(PROCEDURE)
  8. 找到PHP工作并遇上心仪女孩,求大神支招怎么约饭?
  9. JavaScript延时器和计时器
  10. EasyExcel通过模板导出数据