在添加新成员期间次要数据过时,大多数人都关心

Stale data on secondary during addition of new member with majority concern

给定一个由 1 个主节点 + 1 个辅助节点 + 1 个仲裁节点组成的基本副本集,并启用 mongo 4.0 和多数,我们 运行 遇到了一个我们无法解释的 st运行ge 问题还

我们想向副本集添加一个新的辅助节点。所以我们启动了一个新的 VM,安装并配置了 mongod,然后将节点添加到 replicaSet。新成员出现时状态为 STARTED2,并且正在与现有集群同步。到目前为止一切顺利。

但是我们注意到了一些事情:我们的一个从辅助节点读取的应用程序(readPref:secondaryPreferred,readConcern:majority)正在读取陈旧数据(从同步开始之日起)。并且查看 rs.status(),确实 lastCommittedOpTime 卡在了过去。 正如预期的那样,主节点的 wiredtiger 缓存使用率开始增加,达到 15~20% 区域,并开始减慢主节点的速度。

我们最终通过在同步时将成员声明为隐藏来解决问题,但是:为什么会这样?

我的理解是,在大多数成员确认所述数据之前,数据不会提交到“主要”区域。但是对于 3 个数据成员(主要+次要+新次要),大多数人应该已经与现有成员会面。为什么添加新成员会导致此行为?

“多数”表示投票节点的多数。

在原始集群中,Primary、Secondary 和 Arbiter 各有 1 票,因此多数票为 2。写入一旦写入到 primary 和 secondary 就被视为多数提交。

添加新节点后,有4票,Primary,原Secondary,新Secondary,Arbiter。

这意味着2不再是多数,它只是一半。因此,为了被视为多数提交,必须将其写入 3 个投票节点,即主要节点和两个次要节点。

每个复制的节点都以相同的顺序保存操作日志,并记录已知已提交给大多数节点的最近操作。这称为多数提交点。任何请求多数读取关注的读取都将使用截至多数提交点的数据快照。

添加新节点后,大多数写入将无法完成,直到它完成初始同步并开始应用操作日志。在那之前,所有多数读取都将是最近的多数提交点,就在添加该节点之前。

简单修复:移除仲裁器。 这将 return 集群到 3 个投票节点,多数写入将能够完成,只有主节点和一个辅助节点确认写入。