分布式存储 Ceph 中 PG 各种状态详解

分布式存储 Ceph 中 PG 各种状态详解

作者:李航 2018-08-02 08:42:57

存储

存储软件

分布式 面向容灾域的备份策略使得一般而言的PG需要执行跨节点的分布式写,因此数据在不同节点之间的同步、恢复时的数据修复也都是依赖PG完成。

 1. PG介绍

这次主要来分享Ceph中的PG各种状态详解,PG是最复杂和难于理解的概念之一,PG的复杂如下: 

– 在架构层次上,PG位于RADOS层的中间。 

a. 往上负责接收和处理来自客户端的请求。

b. 往下负责将这些数据请求翻译为能够被本地对象存储所能理解的事务。

– 是组成存储池的基本单位,存储池中的很多特性,都是直接依托于PG实现的。 

– 面向容灾域的备份策略使得一般而言的PG需要执行跨节点的分布式写,因此数据在不同节点之间的同步、恢复时的数据修复也都是依赖PG完成。

2. PG状态表

正常的PG状态是 100%的active + clean, 这表示所有的PG是可访问的,所有副本都对全部PG都可用。 如果Ceph也报告PG的其他的警告或者错误状态。PG状态表:

3. 状态详解及故障模拟复现

3.1 Degraded

3.1.1 说明

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

3.1.2 故障模拟

  • 停止osd.1 $ systemctl stop ceph-osd@1
  • 查看PG状态 $ bin/ceph pg stat 20 pgs: 20 active+undersized+degraded; 14512 kB data, 302 GB used, 6388 GB / 6691 GB avail; 12/36 objects degraded (33.333%)
  • 查看集群监控状态

  • 客户端IO操作

故障总结:

为了模拟故障,(size = 3, min_size = 2) 我们手动停止了 osd.1,然后查看PG状态,可见,它此刻的状态是active+undersized+degraded,当一个 PG 所在的 OSD 挂掉之后,这个 PG 就会进入undersized+degraded 状态,而后面的[0,2]的意义就是还有两个副本存活在 osd.0 和 osd.2 上, 并且这个时候客户端可以正常读写IO。

3.1.3 总结

  • 降级就是在发生了一些故障比如OSD挂掉之后,Ceph 将这个 OSD 上的所有 PG 标记为 Degraded。
  • 降级的集群可以正常读写数据,降级的 PG 只是相当于小毛病而已,并不是严重的问题。
  • Undersized的意思就是当前存活的PG 副本数为 2,小于副本数3,将其做此标记,表明存货副本数不足,也不是严重的问题。

3.2 Peered

3.2.1 说明

  • Peering已经完成,但是PG当前Acting Set规模小于存储池规定的最小副本数(min_size)。

3.2.2 故障模拟

a. 停掉两个副本osd.1,osd.0

  1. $ systemctl stop ceph-osd@1 $ systemctl stop ceph-osd@0 

b. 查看集群健康状态

c. 客户端IO操作(夯住) 

读取对象到文件,夯住IO

  1. $ bin/rados -p test_pool get myobject ceph.conf.old 

故障总结:

– 现在pg 只剩下osd.2上存活,并且 pg 还多了一个状态:peered,英文的意思是仔细看,这里我们可以理解成协商、搜索。

– 这时候读取文件,会发现指令会卡在那个地方一直不动,为什么就不能读取内容了,因为我们设置的 min_size=2 ,如果存活数少于2,比如这里的 1 ,那么就不会响应外部的IO请求。

d. 调整min_size=1可以解决IO夯住问题

设置min_size = 1

  1. $ bin/ceph osd pool set test_pool min_size 1 set pool 1 min_size to 1 

e. 查看集群监控状态

f. 客户端IO操作

读取对象到文件中

  1. $ ll -lh ceph.conf* -rw-r--r-- 1 root root 6.1K Jun 25 14:01 ceph.conf -rw-r--r-- 1 root root 6.1K Jul 3 20:11 ceph.conf.old -rw-r--r-- 1 root root 6.1K Jul 3 20:11 ceph.conf.old.1 

故障总结:

– 可以看到,PG状态Peered没有了,并且客户端文件IO可以正常读写了。

– 当min_size=1时,只要集群里面有一份副本活着,那就可以响应外部的IO请求。

3.2.3 总结

  • Peered状态我们这里可以将它理解成它在等待其他副本上线。
  • 当min_size = 2 时,也就是必须保证有两个副本存活的时候就可以去除Peered这个状态。
  • 处于 Peered 状态的 PG 是不能响应外部的请求的并且IO被挂起。

3.3 Remapped

3.3.1 说明

  • Peering完成,PG当前Acting Set与Up Set不一致就会出现Remapped状态。

3.3.2 故障模拟

a. 停止osd.x

  1. $ systemctl stop ceph-osd@x 

b. 间隔5分钟,启动osd.x

  1. $ systemctl start ceph-osd@x 

c. 查看PG状态

d. 客户端IO操作

rados读写正常

  1. rados -p test_pool put myobject /tmp/test.log 

3.3.3 总结

在 OSD 挂掉或者在扩容的时候PG 上的OSD会按照Crush算法重新分配PG 所属的osd编号。并且会把 PG Remap到别的OSD上去。

Remapped状态时,PG当前Acting Set与Up Set不一致。

客户端IO可以正常读写。

3.4 Recovery

3.4.1 说明

指PG通过PGLog日志针对数据不一致的对象进行同步和修复的过程。

3.4.2 故障模拟

a. 停止osd.x

  1. $ systemctl stop ceph-osd@x 

b. 间隔1分钟启动osd.x

  1. osd$ systemctl start ceph-osd@x 

c. 查看集群监控状态

  1. $ ceph health detail HEALTH_WARN Degraded data redundancy: 183/57960 objects degraded (0.316%), 17 pgs unclean, 17 pgs degraded PG_DEGRADED Degraded data redundancy: 183/57960 objects degraded (0.316%), 17 pgs unclean, 17 pgs degraded pg 1.19 is active+recovery_wait+degraded, acting [29,9,17] 

3.4.3 总结

Recovery是通过记录的PGLog进行恢复数据的。

记录的PGLog 在osd_max_pg_log_entries=10000条以内,这个时候通过PGLog就能增量恢复数据。

3.5 Backfill

3.5.1 说明

  • 当PG的副本无非通过PGLog来恢复数据,这个时候就需要进行全量同步,通过完全拷贝当前Primary所有对象的方式进行全量同步。

3.5.2 故障模拟

a. 停止osd.x

  1. $ systemctl stop ceph-osd@x 

b. 间隔10分钟启动osd.x

  1. $ osd systemctl start ceph-osd@x 

c. 查看集群健康状态

  1. $ ceph health detail HEALTH_WARN Degraded data redundancy: 6/57927 objects degraded (0.010%), 1 pg unclean, 1 pg degraded PG_DEGRADED Degraded data redundancy: 6/57927 objects degraded (0.010%), 1 pg unclean, 1 pg degraded pg 3.7f is active+undersized+degraded+remapped+backfilling, acting [21,29] 

3.5.3 总结

无法根据记录的PGLog进行恢复数据时,就需要执行Backfill过程全量恢复数据。

如果超过osd_max_pg_log_entries=10000条, 这个时候需要全量恢复数据。

3.6 Stale

3.6.1 说明

  • mon检测到当前PG的Primary所在的osd宕机。
  • Primary超时未向mon上报pg相关的信息(例如网络阻塞)。
  • PG内三个副本都挂掉的情况。

3.6.2 故障模拟

a. 分别停止PG中的三个副本osd, 首先停止osd.23

  1. $ systemctl stop ceph-osd@23 

b. 然后停止osd.24

  1. $ systemctl stop ceph-osd@24 

c. 查看停止两个副本PG 1.45的状态

d. 在停止PG 1.45中第三个副本osd.10

  1. $ systemctl stop ceph-osd@10 

e. 查看停止三个副本PG 1.45的状态

f. 客户端IO操作

读写挂载磁盘IO 夯住

  1. ll /mnt/ 

故障总结:

先停止同一个PG内两个副本,状态是undersized+degraded+peered。

然后停止同一个PG内三个副本,状态是stale+undersized+degraded+peered。

3.6.3 总结

当出现一个PG内三个副本都挂掉的情况,就会出现stale状态。

此时该PG不能提供客户端读写,IO挂起夯住。

Primary超时未向mon上报pg相关的信息(例如网络阻塞),也会出现stale状态。

3.7 Inconsistent

3.7.1 说明

  • PG通过Scrub检测到某个或者某些对象在PG实例间出现了不一致

3.7.2 故障模拟

a. 删除PG 3.0中副本osd.34头文件

  1. $ rm -rf /var/lib/ceph/osd/ceph-34/current/3.0_head/DIR_0/1000000697c.0000122c__head_19785300__3 

b. 手动执行PG 3.0进行数据清洗

  1. $ ceph pg scrub 3.0 instructing pg 3.0 on osd.34 to scrub 

c. 检查集群监控状态

  1. $ ceph health detail HEALTH_ERR 1 scrub errors; Possible data damage: 1 pg inconsistent OSD_SCRUB_ERRORS 1 scrub errors PG_DAMAGED Possible data damage: 1 pg inconsistent pg 3.0 is active+clean+inconsistent, acting [34,23,1] 

d. 修复PG 3.0

故障总结:

当PG内部三个副本有数据不一致的情况,想要修复不一致的数据文件,只需要执行ceph pg repair修复指令,ceph就会从其他的副本中将丢失的文件拷贝过来就行修复数据。

3.7.3 故障模拟

  • 当osd短暂挂掉的时候,因为集群内还存在着两个副本,是可以正常写入的,但是 osd.34 内的数据并没有得到更新,过了一会osd.34上线了,这个时候osd.34的数据是陈旧的,就通过其他的OSD 向 osd.34 进行数据的恢复,使其数据为最新的,而这个恢复的过程中,PG的状态会从inconsistent ->recover -> clean,最终恢复正常。
  • 这是集群故障自愈一种场景。

3.8 Down

3.8.1 说明

Peering过程中,PG检测到某个不能被跳过的Interval中(例如该Interval期间,PG完成了Peering,并且成功切换至Active状态,从而有可能正常处理了来自客户端的读写请求),当前剩余在线的OSD不足以完成数据修复.

3.8.2 故障模拟

a. 查看PG 3.7f内副本数

  1. $ ceph pg dump | grep ^3.7f dumped all 3.7f 43 0 0 0 0 494927872 1569 1569 active+clean 2018-07-05 02:52:51.512598 21315'80115 21356:111666 [5,21,29] 5 [5,21,29] 5 21315'80115 2018-07-05 02:52:51.512568 6206'80083 2018-06-29 22:51:05.831219 

b. 停止PG 3.7f 副本osd.21

  1. $ systemctl stop ceph-osd@21 

c. 查看PG 3.7f状态

  1. $ ceph pg dump | grep ^3.7f dumped all 3.7f 66 0 89 0 0 591396864 1615 1615 active+undersized+degraded 2018-07-05 15:29:15.741318 21361'80161 21365:128307 [5,29] 5 [5,29] 5 21315'80115 2018-07-05 02:52:51.512568 6206'80083 2018-06-29 22:51:05.831219 

d. 客户端写入数据,一定要确保数据写入到PG 3.7f的副本中[5,29]

e. 停止PG 3.7f中副本osd.29,并且查看PG 3.7f状态

f. 停止PG 3.7f中副本osd.5,并且查看PG 3.7f状态

g. 拉起PG 3.7f中副本osd.21(此时的osd.21数据比较陈旧), 查看PG状态(down)

h. 客户端IO操作

此时客户端IO都会夯住

  1. ll /mnt/  

故障总结:

首先有一个PG 3.7f有三个副本[5,21,29], 当停掉一个osd.21之后, 写入数据到osd.5, osd.29。 这个时候停掉osd.29, osd.5 ,最后拉起osd.21。 这个时候osd.21的数据比较旧,就会出现PG为down的情况,这个时候客户端IO会夯住,只能拉起挂掉的osd才能修复问题。

3.8.3 结论

  • 典型的场景:A(主)、B、C

1. 首先kill B

2. 新写入数据到 A、C

3. kill A和C

4. 拉起B

  • 出现PG为Down的场景是由于osd节点数据太旧,并且其他在线的osd不足以完成数据修复。
  • 这个时候该PG不能提供客户端IO读写, IO会挂起夯住。

本文作者:李航,多年的底层开发经验,在高性能nginx开发和分布式缓存redis cluster有着丰富的经验,目前从事Ceph工作两年左右。 先后在58同城、汽车之家、优酷土豆集团工作。 目前供职于滴滴基础平台运维部 负责分布式Ceph集群开发及运维等工作。 个人主要关注的技术领域:高性能Nginx开发、分布式缓存、分布式存储。

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/279356.html<

(0)
运维的头像运维
上一篇2025-05-12 00:48
下一篇 2025-05-12 00:49

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注