ceph pg incomplete状态处理方案




产生原因:

  1. 单副本运行一段时间,有IO写入
  2. 单副本osd磁盘故障,无法启动
  3. 将该osd标记为lost,之后就可能导致部分pg进入incomplete状态

原因是无法选出包含权威日志的osd。可参考:https://blog.csdn.net/a1454927420/article/details/79007144

解决方案:

该方案属于最终兜底方案,只能在没有其他修复方法时使用,该方案可能会导致数据丢失。

修复原理是将所有导致pg的past_intervals全部清空重新写入pg info持久化到硬盘(就是这些past_intervals中包含故障磁盘的osd,导致pg无法通过peering的GetLog阶段)。

使用新版本的 ceph-objectstore-tool 工具,强制将pg状态置为正常(在主osd上执行,需要先停止osd进程):

$ ceph-objectstore-tool –data-path /var/lib/ceph/osd/ceph-16/ –journal-path /var/lib/ceph/osd/ceph-16/journal –pgid $pg –op mark-complete

我们当前的0.94.6版本代码没有mark-complete功能,社区相关改动代码(0.94.7加入):

https://github.com/ceph/ceph/pull/7702/commits/0fe3dfe8768b27743189add73cde9a44095f2a62#diff-6ace6eced75ec25c9d512cb71e03d384

backport过来,然后编译就可以使用了。

新版本已经默认支持了,所以可以直接使用这个工具。