mongodb - 多数关注的新成员添加期间二级数据过时
问题描述
给定一个由 1 个主要 + 1 个辅助 + 1 个仲裁器组成的基本副本集,启用了 mongo 4.0 和多数,我们遇到了一个我们还无法解释的奇怪问题
我们想向副本集添加一个新的辅助节点。所以我们启动了一个新的VM,安装并配置了mongod,然后将节点添加到replicaSet。新成员以 STARTED2 状态出现,并正在与现有集群同步。到目前为止,一切都很好。
但是我们注意到了一些事情:我们从辅助节点(readPref:secondaryPreferred,readConcern:majority)读取的应用程序之一正在读取陈旧数据(从同步开始之日起)。看着rs.status()
,确实lastCommittedOpTime
是卡在了过去。正如预期的那样,主节点的wiredtiger缓存使用量开始增加,达到15~20%的区域,并开始减慢主节点的速度。
我们最终通过在同步时将成员声明为隐藏来解决问题,但是:为什么会发生这种情况?
我的理解是,在大多数成员承认所述数据之前,数据不会提交到“主要”区域。但是对于 3 个数据成员(主要 + 次要 + 新次要),大多数应该已经与现有成员会面。为什么添加新成员会导致这种行为?
解决方案
“多数”是指多数投票节点。
在原始集群中,Primary、Secondary 和 Arbiter 各有 1 票,因此多数为 2。一旦写入主节点和辅助节点,写入就被视为多数已提交。
添加新节点后,有 4 个投票,Primary、原始 Secondary、新 Secondary、Arbiter。
这意味着 2 不再是多数,而只是一半。因此,为了被认为是多数提交,它必须被写入 3 个投票节点,即主节点和两个辅助节点。
每个复制的节点都以相同的顺序保存操作日志,并记录已知已提交给大多数节点的最新操作。这称为多数提交点。任何请求多数读取关注的读取都将使用截至多数提交点的数据快照。
一旦添加了新节点,大多数写入将无法完成,直到它完成初始同步并开始应用 oplog。在那之前,所有多数读取都将是最近的多数提交点,就在添加该节点之前。
简单修复:删除仲裁器。这将使集群返回到 3 个投票节点,并且大多数写入将能够在只有主节点和一个辅助节点确认写入的情况下完成。
推荐阅读
- python - 初始化算子 TensorFlow 的新对象
- c# - 将参数值传递给客户端
- excel - 用未知数量的单元格按降序对列进行排序
- html - 我需要在标签 HTML/CSS 旁边放一个 20x20 的小图像,图像一直在它下面。我应该使用 div 吗?
- javascript - 将增量键添加到对象数组
- netlogo - 建立从代理到代理集的无向链接
- nginx - VPS 2GB RAM 内存和 Symfony 3 - 内存不足
- spring - weblogic上的spring boot应用程序部署抛出404错误
- javascript - 动态贝宝快速结帐按钮
- javascript - 如何对多个目标使用相同的弹出框?