当主节点崩溃并且它在不同的主机上时会发生什么?

What happens when the primary node crashes and it is on a different host?

我已阅读 Mongo 文档和一些帖子,但对我来说还不够清楚。我不明白当 Mongo 分布在不同的主机上时它是如何工作的

我想在不同的主机(EC2 实例)上开发一个带有副本集的集群(这样一个应用程序就可以解决网络和数据库问题)。让我们假设这种情况(基于 this tutorial ):

实例 A:10.0.0.1 上的主节点

实例 B:10.0.0.2 上的辅助节点

实例 C:10.0.0.3 上的仲裁程序

我的应用程序正常运行并连接到 A(IP 10.0.0.1 配置为环境变量)。突然 A 中的 Mongo 由于任何原因崩溃,然后 Mongo 执行它的操作,并且 C 选择 B 作为新的主节点。 我的应用程序连接到 A 会发生什么情况? Mongo 会自动重定向到 B 吗?当整个实例 (A) 宕机时会发生什么?我需要添加一些额外的代码来处理这个吗?

我一直只使用单个 mongo 实例,但这次我想做一些更大、更一致的事情,这让我很困惑。感谢您的回答。

... Mongo inside A crashes due to any reason, then Mongo does its stuff, and C chooses B as the new Primary. What will happen with my app that is connected to A? Does Mongo redirect to B automatically? What happens when the whole instance (A) is down? Do I need to add some additional code to handle this?

副本集有三个节点——A、B和一个仲裁器C。当节点A宕机时,从节点B被选为主节点。之前连接到A的app,在节点B被选为主之后,自动连接到B。参见 Primary with a Secondary and an Arbiter

所有应用程序都通过(或通过)驱动程序 软件连接到 MongoDB 数据库(mongod 实例)。例如,mongo shell 实用程序有自己的驱动程序。如果您的应用程序是 NodeJS 或 Java 应用程序,则有相应的驱动程序软件。这些驱动程序软件是 replica-set aware - 意味着驱动程序知道它正在连接到副本集的主节点,并且当 mongod 崩溃时它无法访问(阅读或写入)那个主节点并等待新的主节点被选出(选出一个新的主节点可能需要几十秒),然后连接到新的主节点。 这一切都是自动发生的。因此,应用程序开发人员无需在应用程序中进行任何特殊编程,以在主节点不可用时连接到新的主节点。

一般情况下,驱动程序还有以下功能:连接MongoDB数据库,将应用程序的数据格式转换为BSON格式存入MongoDB数据库(并返回)。请注意,数据以 BSON 格式存储在 MongoDB 数据库中。