所以我最近遇到了以下问题:
我有一个 5 成员集副本集(优先级)
- 1 x 初级 (2)
- 2 x 二级 (0.5)
- 1 x 隐藏备份 (0)
- 1 x 仲裁器 (0)
具有 0.5 优先级的辅助副本之一(我们称之为B)遇到了一些网络问题,并且与副本集的其余部分存在间歇性连接。然而,尽管拥有比现有主节点(我们称之为A)更旧的数据和更低的优先级,但它承担了主节点角色:
[ReplicationExecutor] VoteRequester:没有从 xxx 获得投票,因为:候选人的数据比我的更旧,resp:{ term: 29, voteGranted: false, reason: "candidate's data is staler than mine", ok: 1.0 }
[ReplicationExecutor] 选举成功,在第 29 学期担任主要角色
[ReplicationExecutor] 过渡到 PRIMARY
对于A,尽管与副本集的其余部分没有任何连接问题:
[ReplicationExecutor] 从 primary 下台,因为一个新的任期已经开始:29
所以问题 1是,在这种情况下,这怎么可能?
继续前进,A(现在是次要的)开始回滚数据:
[rsBackgroundSync] 由于 OplogStartMissing 开始回滚:我们最后一次获取的操作时间:(术语:28,时间戳:xxx)。来源的 GTE: (term: 29, timestamp: xxx) hashes: (xxx/xxx)
[rsBackgroundSync] 开始回滚
[rsBackgroundSync] 回滚 0
[ReplicationExecutor] 过渡到 ROLLBACK
这导致被写入的数据被删除。所以问题 2 是: OplogStart 是如何丢失的?
最后但同样重要的是,问题 3,如何防止这种情况发生?
先感谢您!