我已经配置了 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 结果。
我们有两个问题==>
我的假设是,正如我们提到的“primary”作为连接 URL 中的默认 readPreference,查询应该始终从主数据库获取结果。看起来它正在尝试从辅助数据库获取结果。
因为我们将 writeConcern 设置为 ==> w:2,它表示将在 2 个节点完成复制后返回响应。因此,即使来自次要最新数据也应该出现而不是返回 NULL。
我们正在 ubuntu(20.04.4 LTS) VM 上使用 mongo DB 6.0.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