如何 read/write 成为 MongoDB 副本集的次要成员?

How to read/write to secondary member of a MongoDB replica-set?

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

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

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

写入只能在初选上完成。

要控制将读取定向到哪个辅助设备,您可以使用 max staleness 以及标签。

that the inserts (only possible on primary) are consistent on every secondary.

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

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

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

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

并且,如评论中所述,双节点副本集将不会接受写入,除非两个成员都在运行,这就是为什么它通常不是一个有用的配置。

Summary: I want to reduce the connections between the servers when the api is called.

这与问题的其余部分无关,如果你真的意味着这是一个过早的优化。

如果您想要更快的网络 I/O 我建议考虑在您的应用程序和数据库之间建立更好的连接(例如,我想 AWS 会在其各个区域之间提供非常好的连接)。