更多ceph相关文章详见知乎ceph专栏:聊聊ceph
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_max_scrubs也没用,因为可能一大波正在等待scrub的pg占满了调大的资源,故而可以先关闭scrub(ceph osd set noscrub,ceph osd set nodeep-scrub)
要点
- osd有三副本,当不一致时修复时会以谁为权威?
以三副本的osd id排序,以id小的为主,如果id小的对应的不一致的文件能够stat得到,也没有其他什么异常,便会以其为权威。不一定以主为权威。
若权威副本损坏导致的不一致是不能直接使用ceph pg repair的,主副本损坏的修复可参见
- 主副本和从副本均有可能因为资源预约失败
- 初始调大为2,依然无效,调大为5,成功
更多ceph相关文章详见知乎ceph专栏:聊聊ceph