ceph pg inconsistent不一致,ceph pg repair无效

ceph pg repair指令执行后,无效原因分析

ceph pg repair这一操作会先进行pg scrub,得到该PG中不一致的对象,然后再进行recovery。
pg scrub时主副本和从副本均会进行资源预约,只有当scrubs_pending + scrubs_active < cct->_conf->osd_max_scrubs时scrub才能继续进行,也即repair才能进行,否则,repair会失效。

其中:

scrubs_pending: 该osd已经预约成功,即将进行scrub的pg
scrubs_active: 该osd正在进行scrub的对象
osd_max_scrubs: 一个osd同一时刻默认只能有一个pg做Scrub

资源预约的函数如下,倘若预约失败,主副本或从副本的日志中便会打印出相关日志

bool OSDService::inc_scrubs_pending()
{
    if (scrubs_pending + scrubs_active < cct->_conf->osd_max_scrubs)   //osd_max_scrubs默认是1
    {
        ....  
    }
    else
    {
        dout(20) << "inc_scrubs_pending " << scrubs_pending << " + " << scrubs_active << " active >= max " << cct->_conf->osd_max_scrubs << dendl;
    }
}

解决办法:

把三副本的osd的osd_max_scrubs都先调大,等到修复好后再调回为1

要点

  • osd有三副本,当不一致时修复时会以谁为权威?
    以三副本的osd id排序,以id小的为主,如果id小的对应的不一致的文件能够stat得到,也没有其他什么异常,便会以其为权威。不一定以主为权威。

若权威副本损坏导致的不一致是不能直接使用ceph pg repair的,主副本损坏的修复可参见

  • 主副本和从副本均有可能因为资源预约失败
  • 初始调大为2,依然无效,调大为5,成功

你可能感兴趣的:(Ceph运维支持)