共同点是这些丢失的日志被持久化之后,紧接着节点收到snapshot消息并且应用,随后节点重启,就无法读到部分日志。
比如某个节点日志为{index:898,term:18}, {index:899 term:18}, stabledIndex=899
收到的snapshot.TruncatedIndex=897,并且附带了index 898之后的日志{index:898,term:18}, {index:899 term:18}, {index:900,term:18},{index:901, term:22}… 因为898、899两条本来已经有了,所以节点从900开始追加日志并持久化和提交。
然后重启之后节点初始化时就只能读到900之后的日志,898和899不见了。
我反复跑了很多次,每次出错的时候日志基本都是上面描述的过程,而且通常这些丢失的日志都是好几个term之前的。最开始猜想会不会是应用snapshot的时候删除了日志,但是去看region_task.go applySnap函数,里面应该只删了engines.KV的数据,没有对engines.Raft进行操作;然后我想有没有可能是持久化日志的时候没有成功,但是在write_batch里打印显示持久化应该是成功了。实在没有头绪了。
哪部分的操作可能导致已经持久化的日志丢失,有什么建议吗