【问题标题】:readPreference secondaryPreferred is not only reading from Secondary nodesreadPreference secondaryPreferred 不仅从辅助节点读取
【发布时间】:2017-11-17 14:25:57
【问题描述】:

我有 3 个在 AWS 上运行的 mongo 实例,1 个主实例和 2 个辅助实例。我们希望所有读取查询都转到辅助节点,因此我们在创建 mongoose 连接时使用这些配置选项:

options = {
    db: {
       readPreference: 'secondaryPreferred',
       native_parser: true
    },
    replset: {
        strategy: 'ping',
        auto_reconnect: false,
    }
};
mongoose.connect(databaseUrl, options);

问题:使用这些设置,读取查询会同时到达 PrimarySecondary 节点,而 2 个辅助节点正在运行。

当我们使用readPreference: 'secondary' 时,它按我们预期的方式工作:所有读取查询都只发送到辅助节点。

请帮我解释一下,因为 mongo 文档提到:

secondaryPreferred:在大多数情况下,操作从次要成员中读取,但如果没有次要成员可用,则从主要成员中读取操作。

顺便说一句,我看到了一些相同的问题,但所有这些问题仍然没有明确的解决方案。 :(

我们正在使用:

  • 猫鼬:v4.9.5
  • Mongo 服务器:v3.2
  • 节点:v5.12.0

【问题讨论】:

  • 你真的应该只从“主要”阅读,除非你真的明白这意味着什么以及所有的含义。如果您必须提出这个问题,那么您可能应该坚持从初级阅读。似乎偏好设置按设计工作。
  • 我需要配置为从secondary 读取,因为primary 当前由write 操作员满载。如果设置按设计工作,为什么它从primarysecondary 读取。
  • 光靠这个理由还不够。如果您的主要负载很重,那么“分片”是您应该首先考虑的地方。二次读取“按设计”意味着不能保证数据是最新的。只有当您接受您的应用程序可以接受的既定事实时,它才是真正有效的选择。二次读取不是为了扩展,就像复制不能代替备份一样。
  • 是的,我明白了。看来reads from Secondary 是主要满载问题的糟糕解决方案。
  • 嗨 Huy Tran - 你能检查你的 databaseUrl,以确保它正确指定了副本集吗?也许这可能与您看到的问题有关?

标签: mongodb mongoose


【解决方案1】:

对于有同样问题的人, 我确认此行为源自节点驱动程序,Python 驱动程序和 Java 驱动程序似乎没有表现出这种情况。 Mongo 开发人员修复了该错误并等待合并到 master。你可以签到这张票:https://jira.mongodb.org/browse/NODE-1049

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    相关资源
    最近更新 更多