【问题标题】:mongodb - write operations are rejected when primary node downmongodb - 主节点关闭时写入操作被拒绝
【发布时间】:2022-01-08 21:18:17
【问题描述】:

我们在 mongo 上有一个主节点和两个辅助节点,在自动缩放期间,主节点关闭,辅助节点(以健康者为准)通过选举成为新的主节点。此时不允许写入操作,mongo 简单地拒绝写入查询并出现以下错误。

"errmsg": "not master",
"code": 10107,
"codeName": "NotWritablePrimary",

我们也遇到了错误not master and slaveOk=false,但在连接字符串中设置readPreference=primaryPreferred 后,在主服务器关闭期间允许读取。

自动缩放的原因是高峰时段的负载,这是预期的,因此它会自动缩放到更高的数字。经过探索发现下面的东西

Thread 1

如果主节点发生故障,新的主节点需要 当选。在举行选举的这段时间里,写 操作将失败,因为目前没有主要服务它们。

Thread 2

无法写入 MongoDB 副本集中的辅助节点。

问题:以前有人遇到过这种情况吗?如果这是一种已知行为,我们如何在这段时间内允许写操作?因为它会影响应用程序导致 500 错误。任何建议将不胜感激,在此先感谢!

注意:我们使用的是带有副本的 MongoDB 地图集。我们尝试了 Atlas 的 Test failover 来模拟自动缩放,然后进行了小负载测试以在 DB 上执行读取和写入。 我们正在使用以下

  • NodeJs:v12
  • NPM:v6
  • NestJS: v6
  • @nestjs/mongoose: v6.4

连接字符串选项是

retryWrites=true&w=majority&readPreference=primaryPreferred

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-atlas


    【解决方案1】:

    replicaSet readOnly 在选举期间(通常不超过 12 秒)的预期行为,您可以启用 retryable writes 以允许驱动程序在 serverSelectionTimeoutMS 毫秒(默认 30000 毫秒)之后再尝试一次

    【讨论】:

    • 感谢提示,retryWrites 已启用,更新问题 +1
    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2019-02-01
    • 2021-07-28
    相关资源
    最近更新 更多