【问题标题】:How to read/write to secondary member of a MongoDB replica-set?如何读取/写入 MongoDB 副本集的次要成员?
【发布时间】:2021-02-18 23:42:44
【问题描述】:

我目前正在规划一些服务器基础架构。我在不同的位置有两台服务器。我的应用程序(api 和东西)都在它们上面运行。客户端连接到最近的(最佳连接)。如果一台服务器发生故障,另一台服务器可以处理请求。我想在我的项目中使用 mongodb。第一个想法是使用副本集,因此我可以确保数据是一致的。如果一台服务器出现故障,数据仍然可以访问,并且辅助服务器切换到主服务器。当主服务器上的应用程序想要使用数据时,这很好,但其他服务器必须连接到主服务器才能处理数据(这将解决故障转移,但不是“最佳连接”问题)。在 Mongodb 中有一个从辅助服务器读取数据的选项,但是我必须确保插入(仅在主服务器上可能)在每个辅助服务器上都是一致的。这个“writeConcern”还有一个选项。是否有可能以某种方式指定“特定二级上的 writeConcern”?因为如果在没有应用程序的情况下添加第二个辅助节点,则不需要在每个辅助节点上“writeConcern”。如果我指定一个特定值,我真的不知道数据在哪个辅助节点上可用,对吧?

总结:我想在调用api时减少服务器之间的连接。

请分享一些想法或想法来解决我的问题。

【问题讨论】:

  • “如果一台服务器发生故障,数据仍然可以访问,并且辅助服务器切换到主服务器。” 在双节点副本集中,这是不可能的。首先,需要两个多数才能选出一个主节点(如果发生故障)。看看Primary-Secondary-Arbiter。看到这个帖子Does a replica-set with two members make sense?
  • 好吧,你说得对。我至少需要 3 台服务器,但问题还是一样。
  • 应用程序始终连接到 a 副本集 - 而不是副本集的特定成员。主节点将数据复制到其他成员(并且所有成员都已连接)。当一个成员(主节点)失败时,将在剩余的两个成员之间进行选举,并选出一个新的主节点。因此,应用程序连接到新选择的主节点进行写入。

标签: mongodb replicaset


【解决方案1】:

只能在初选上进行写入。

要控制读取定向到哪个二级,您可以使用max staleness 以及标签。

插入(仅可能在主节点上)在每个辅助节点上都是一致的。

我不明白你这句话是什么意思。

如果您有两个地理上分开的数据中心 A 和 B,那么在物理上不可能在 A 中写入数据并立即在 B 中看到它。您必须等待写入传播或等待读取从远程节点。

要在写入时支付费用,请将您的写入关注点设置为部署中的节点数(在您的提案中为 2)。要在读取时支付费用,请使用主读取。

请注意,仅将写入关注点设置为等于节点数并不能使所有节点始终具有相同的数据——它只会使您的应用程序仅在所有节点都收到数据时才认为写入成功。就所提交的操作而言,主节点仍然可以领先于特定的次节点。

而且,如 cmets 中所述,除非两个成员都可操作,否则双节点副本集将不接受写入,这就是为什么它通常不是一个有用的配置。

总结:我想在调用api时减少服务器之间的连接。

这与问题的其余部分无关,如果您真的表示这是一个过早的优化。

如果您想要更快的网络 I/O,我建议您考虑在您的应用程序和数据库之间设置更好的连接(例如,我认为 AWS 会在它们的各个区域之间提供相当好的连接)。

【讨论】:

    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多