2 个节点的 MongoDB 复制问题

问题描述 投票:0回答:1

我已经配置了 2 个节点的 mongo DB 副本集(我们的用例不是故障转移案例),因此我们有一个主节点和一个无投票权的辅助节点,并且没有仲裁器。这个想法是让正常的应用程序流量进入主节点,一些与分析相关的查询进入辅助节点,还有一些外部数据分析团队将辅助节点用于只读目的。

我通过以下方式设置了默认的全局读写关注点。

db.adminCommand({
  "setDefaultRWConcern" : 1,
  "defaultWriteConcern" : {
    "w" : 2
  },
  "defaultReadConcern" : { "level" : "majority" }
})

我的连接详细信息如下:

await mongoose.connect(dbUrl,{replicaSet: 'replname', readPreference : 'primary'});

我的问题来了:

在节点 JS 代码中创建用户,如下所示

await User.create({ name: 'test-user'});

并立即阅读:

await User.findOne({name:'test-user'})

它给出 NULL 结果。

我们有两个问题==>

  1. 我的假设是,正如我们提到的“primary”作为连接 URL 中的默认 readPreference,查询应该始终从主数据库获取结果。看起来它正在尝试从辅助数据库获取结果。

  2. 因为我们将 writeConcern 设置为 ==> w:2,它表示将在 2 个节点完成复制后返回响应。因此,即使来自次要最新数据也应该出现而不是返回 NULL。

我们正在 ubuntu(20.04.4 LTS) VM 上使用 mongo DB 6.0.0。

如果我遗漏了什么,请告诉我。

谢谢

mongodb replication
1个回答
0
投票

有以下读写问题,

db.adminCommand({
  "setDefaultRWConcern" : 1,
  "defaultWriteConcern" : {
    "w" : 2
  },
  "defaultReadConcern" : { "level" : "majority" }
})

对 readConcerns 知之甚少,我们得出结论,为什么我会遇到这些问题。我刚刚在下面提到了它们及其原因。

问题1: 正如我所提到的,当我通过 ==>“majority”的 readConcern 读取数据时,我的 writeConcern 作为 ==> {w:2} 数据可能还没有持久化, 可能是因为我什至没有从主节点获取数据

问题2: 同样的情况也适用于Secondary,writeConcern 为 ==> {w:2},read Concern 为 ==>。 “大多数”您正在尝试从辅助设备读取持久数据。 当你尝试阅读时,它在中学可能已经不耐用了。

这样,readConcern 在读取数据时也发挥了重要作用。在我们的例子中,由于我们没有使用任何事务来存储数据,并且速度是主要关注点, {readConcern: ‘local’} 对我们来说更有意义。这样我们就可以更快地获取数据,因为我们不会考虑任何故障转移案例。

希望这有帮助。

更多信息在这里 ==> https://www.mongodb.com/community/forums/t/mongodb-replication-issues/240115/6

© www.soinside.com 2019 - 2024. All rights reserved.