首先我们从字面意思理解下这2个pg状态。
Incomplete : 没完成
inconsistent : 不一致
那么是什么没完成和不一致呢? 简单来说Incomplete是pg peering没完成。inconsistent 是pg三副本中的数据不一致
一, Incomplete解说
pg Incomplete的实验方式:设置min_size足够大并且
osd_allow_recovery_below_min_size为false。 当设置好上述两个条件以后,那么需要将集群变为peering状态,这时只需要手动将一个osd down掉即可,然后ceph -s 发现集群有imcomplete状态了
pg Incomplete状态常见于ceph集群在peering状态下,来回重启服务器,或者掉电。peering本来是ceph一个全自动化的过程,为什么会造成没有完成?任何程序都会走到未知的异常流程里,也就是说这个异常是不符合逻辑的,根据逻辑是不会产生的,但他确实产生了,下面我们来看看Incomplete状态在什么时候抛出。
1,Incomplete状态在peering-->getLog状态中出现,也就是说,在选择权威日志的时候,权威日志没法完成,或者权威日志完成后和本地日志对比逻辑不正常,此时抛出Incomplete状态
getLog里有2处地方抛出Incomplete。第1处地方是选择权威日志,如果选择权威日志失败,并且want_acting为空,那么就Incomplete。 第2处,如果权威日志选择成功,但是本地日志最后一次更新小于权威日志的日志尾,那就说明本地日志和权威日志不能重叠,那就有矛盾了,既然权威日志能选出来,那肯定日志重叠的,所以抛出Incomplete。
我们再看第1处,为什么权威日志不能选出来?原因如下(暂时不考虑EC):
Getlog()调用choose_acting()来选择权威日志,choose_acting()调用find_best_info()选择权威日志,如果find_best_info()选择权威日志失败,那么创建临时pg,要么保持want_acting为空。 而这2个条件必然导致Getlog()里触发Incomplete。
我们再看find_best_info()为什么会没有选出权威日志