PG异常状态详解及故障总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PG异常状态详解及故障总结相关的知识,希望对你有一定的参考价值。
参考技术A这里PG状态指PG外部状态,即能被用户所直接看到的状态。
可以通过 ceph pg stat 命令查看PG当前状态,健康状态为“active + clean”.
下面给出部分常见的PG外部状态。(参考《Ceph 之Rados设计原理与实现》6.3节)
下面给出部分PG异常状态(需要人为修复)介绍。
一般情况下,存储池设置为3副本,也就是1个PG会存储到3个OSD。正常情况,PG状态显示为“active + clean”
如果说你的集群小于三副本,例如只有2个OSD,那么你可能会所有OSD都处于 up 和 in状态,但是PG始终无法达到 “active + clean”,这可能是因为 osd pool size/min_size设置了大于2的值。
可以看出,osd pool min_size是必须满足的OSD副本数,osd pool size则是建议满足的OSD副本数。前者是必须满足的条件,否则该pool无法读写;后者可以不满足,只是集群会报出警告。可以通过设置合理的osd pool size 和osd pool min size来解决上述问题。
CRUSH MAP 错误
PG 达不到 clean 状态的另一个可能的原因就是集群的 CRUSH Map 有错误,导致 PG 不能映射到正确的地方。
最常见的PG故障都是由于某个或者多个OSD进程挂掉导致的。一般重启OSD后恢复健康。
可以通过 ceph -s 或者 ceph osd stat 检查是否有OSD down。
尝试停掉一个或多个OSD(3副本集群,总共4个OSD),观察集群状态。
重启所有停掉的OSD,集群会慢慢恢复健康。
这里罗列一下集群不能读写的PG状态:
stale和peered状态上文已经演示过,通过停止OSD服务达到。
down的一个经典场景:A(主)、B、C
此时存活的B数据陈旧(不含新数据),而且集群中也没有其他OSD可以帮助其完成数据迁移,因此会显示down,参考链接: https://zhuanlan.zhihu.com/p/138778000#:~:text=3.8.3%20PG%E4%B8%BADown%E7%9A%84OSD%E4%B8%A2%E5%A4%B1%E6%88%96%E6%97%A0%E6%B3%95%E6%8B%89%E8%B5%B7
down的解决方法依然是重启失败的OSD。
参考链接: https://ceph.com/geen-categorie/ceph-manually-repair-object/
一般手动修复损坏的PG即可,使用 ceph pg repair pgid
PG状态为inconsistent时,说明PG中存在对象不一致的情况。有可能时某个OSD磁盘损坏,或者磁盘上的数据发生静默错误。
下面手动构造一个PG数据损坏的例子,并修复它。
如果 ceph pg repair pgid 命令无法修复PG,可以使用ceph-objectstore-tool导入整个PG的方式。
参考链接: https://www.jianshu.com/p/36c2d5682d87#:~:text=%E8%B5%B7%E5%A4%AF%E4%BD%8F%E3%80%82-,3.9%20Incomplete,-Peering%E8%BF%87%E7%A8%8B%E4%B8%AD
构造故障
使用ceph-objectstore-tool修复
上述介绍了重启OSD的方法来解决集群故障,但有时会遇到OSD down却无法重启的状况。
遇到以上问题,有以下三种方案:
下面给出手动删除OSD再重新创建OSD的例子:
重建OSD需要注意的是,如果你的集群中对crush map做了特别定制,那么还需要去检查crush map。
在OSD恢复过程中,可能会影响集群对外提供的io服务。这里给出以下可修改配置。
为了避免pg开始迁移后造成较大的压力导致osd挂掉,先在配置文件global中写入如下配置
磁盘恢复速度配置,其实默认的速度已经比较写了,如果想要加快迁移速度,可以尝试调制下列参数
附上配置操控命令
一般来说,集群三副本的情况下不太可能出现PG丢失的情况,如果一旦出现了,那也就意味着这丢失的数据无法找回。
注意:不要使用单副本的集群。
出现“1 pools have many more objects per pg than average”警告时,说明集群中某个pool的PG数量配置过少,其每个PG承载的对象高于集群平均PG承载对象10倍以上,最简单的解决方法就是增加pool的pg数即可。
ceph pg degraded#yyds干货盘点#
问题描述
创建 pool 时,副本数 设置为 非1 时,会出现 "degraded" 告警信息
2、pg归置组异常状态
pg归置组异常,目前主要分为两种情况
1) 单节点的时候pg归置组 unclean 或者 degraded
2) 多个节点的时候pg归置组 unclean 或者 degraded
3、单节点 pg归置组
单节点 pg归置组问题解决流程
1) osd 数量,一般为 奇数
2) 副本数是多少,副本的最小值是多少
3) 还有故障域是不是osd
3.1 osd数量
通过添加 或者 删除 osd的方式,将 osd 设置为奇数 \\
目前通过 设置 osd节点数量 未解决此问题
#sudo ceph osd tree |
3.2 副本数
副本数的最小值 必须 小于等于 副本数;将副本数 设置为 1 ,则解决此问题
3.2.1 副本数设置
副本数设置,目前主要分为 两 步
1) 查看当前副本数、副本数最小值
2) 设置当前副本数、副本数最小值
3.3 故障域
目前有两种解决办法
1) 修改故障域设置
- 设置配置文件osd crush chooseleaf type = 0 (默认为1,是host)
- 重新编译crush map 找到 chooseleaf 出 然后修改为 osd
2) 添加故障域
添加故障域最直接的办法,就是在另一台机器上创建 新的 osd节点
4、多节点 pg归置组
...暂未遇到
这个时候就麻烦了,需要查看log日志,以及osd的dump信息,看一个池子和mds是不是正常,以及对象是否有丢失,最重要就是根据报警信息解决问题
可以使用ceph -s 以及 ceph -w 已经 ceph health detail 以及 ceph osd dump 等查看具体原因
以上是关于PG异常状态详解及故障总结的主要内容,如果未能解决你的问题,请参考以下文章