如果够你执行ceph health,ceph -s 或 ceph -w 命令,你可能会发现集群并不总是返回HEALTH OK 状态。在检查完OSDs是否运行之后,你还需要检查PG状态。在以下情况下,集群不返回HEALTH OK:
- 刚创建pool,PG还没peer完成
- PG正在恢复
- 刚添加或删除一个OSD
- 刚修改CRUSH map并且PG正在迁移
- 不同副本的PG存在不一致数据
- ceph正在scrubbing PGs 副本
- ceph没有足够的空间完成backfilling操作
如果前述情况之一引起ceph返回HEALTH WARN,不要惊慌。在多数情况下,集群能自愈。在一些情况下需要采取行动。监控PGs的一个重要方面是确保当集群运行且所有的PG较好的处于active+clean状态。查看PG状态运行下面的命令:
ceph pg stat
返回的结果会告诉你PGs总数,有多少PG处于某个特定状态,存储了多少数据
注意:一般来说Ceph会报告多种PGs状态
除了PGs状态,ceph存储使用空间,剩余多少容量,总容量等。这些数据在下列情况相当重要:
- 你将达到 near full ratio 或 full ratio
- 因为一些CRUSH配置错误导致你的数据没有分布在集群中
PG IDs
PGs IDs由池号(不是池名)跟着(.) 和 PG ID -- 一个十六数组成。你可以通过 ceph osd lspools 输出查看。例如,默认池rdb返回池号0。一个完整合格的PG ID包括下列各式:
{pool-num}.{pg-id}
典型的是这样:
0.1f
检索PGs列表,执行下面:
ceph pg dump
你也可以使用JSON格式输出并保留至文件:
ceph pg dump -o {filename} --format=json
执行下面命令查询特定PG:
ceph pg {poolname}.{pg-id} query
Ceph会以JSON格式输出查询结果。
接下来的部分详细讲解PG状态。
CREATING
当你创建一个池,就会创建指定数量的PG。当创建一个个或多个PG时,Ceph会返回creating。一旦创建完成,OSDs作位PGs Acting Set的一部分将执行peer。peer一执行完PG状态就是 active+clean,这就意味着ceph client可以开始写PG了
PEERING
当ceph Peering 一个PG, 在一个PG中,Ceph会使存储PG副本的OSDs进入对象和元数据的协商一致状态。当Ceph完成peering,这意味着存储PG的OSDs对当前PG状态达成一致。然而,完成peering过程并不意味着每一个副本中都有最新的内容。
权威历史
ceph不允许client写操作直到acting set中所有的OSDs坚持写操作。这种方式确保了自上一次成功peering操作后,acting set中至少有个有一个成员会记录所有的写许可操作。
有了对写许可操作的精确记录,Ceph能够建立并扩散一个新PG权威历史--一个完整,有完全操作顺序的集合,一执行,就能让一个OSD的PG备份更新
CLEAN
当一个PG处于clean状态,主OSD和副本OSDs会成功peered,并且PG中不会有孤立副本。Ceph在PG中复制所有的对象正确的次数。
DEGRADED
当一个client写入一个对象进主OSD,主OSD 负责将副本写入副本OSDs中。在主OSD将对象写入存储后,PG保持degraded状态,一直到主OSDs接收到副本OSDs创建对象成功的确认
PG可能会出现 active+degraded 的原因是一个OSD可能是active状态即使它没有包含所有的对象。如果一个OSD down了,ceph会将分配给这个OSD的所有PG标记成degraded状态。这些OSDs回复在线时,必须再次peer。然而,client依然可以将新对象写入degraded PG,只要PG active。
如果一个OSD down 并且 degraded 状态持续,ceph 可能会把 OSD 标记为down,之后标记为out,使它离开集群,同时重映射数据从down OSD 到正常OSD。标记为down和out之间的时间
一个PG可能也会是degraded,因为ceph不能发现一个或多个它认为应该在PG中的对象。虽然你不能读写没有找到的对象,但你在degraded PG中仍能访问所有其它对象。
BACK FILLING
当一个新的OSD加入集群,CRUSH会在集群新旧OSD间重新分配PG。强制新OSD立即接受重新分配PG会使新OSD的承受大量负载。用PG Back filling OSD 允许这个过程在后台开始。一旦back filling 完成,准备好之后就能为请求提供服务了