3

所以我最近遇到了以下问题:

我有一个 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,如何防止这种情况发生?

先感谢您!

4

1 回答 1

3

您正在使用版本 3.2.x 和 protocolVersion=1(您可以使用 rs.conf() -command 进行检查)?因为投票存在“错误”。您可以通过(选择一项或两项)来防止此错误:

  • 将协议版本更改为 0。cfg = rs.conf(); cfg.protocolVersion=0; rs.reconfig(cfg);

  • 将所有优先级更改为相同的值

编辑:这些是解释的票..或多或少.. 票1 票2

于 2016-11-03T05:12:58.813 回答