我有一个非常简单的 PyMongo 配置,连接到两个主机:
from pymongo import MongoClient
host = os.getenv('MONGODB_HOST', '127.0.0.1')
port = int(os.getenv('MONGODB_PORT', 27017))
hosts = []
for h in host.split(','):
hosts.append('{}:{}'.format(h, port))
cls.client = MongoClient(host=hosts, replicaset='replicatOne')
Run Code Online (Sandbox Code Playgroud)
MONGODB_HOST由两个ip的列表组成,如“primary_mongo, secondary_mongo”
它们被配置为副本集。
我注意到的问题是,在当前配置中,如果secondary_mongo出现故障,我的整个代码将停止工作。
我相信提供一个主机列表MongoClient会告诉它“使用有效的主机,从第一个开始”,但它似乎不正确。
出了什么问题,如何确保MongoClient正确连接到primary_mongo第一个,如果失败,则转到secondary_mongo?
为了拥有一个完全运行的 MongoDB ReplicaSet,您必须有一个 PRIMARY 成员。只有在所有成员中获得多数票的情况下才能选举出主要成员。2 中的 1 并不是大多数,因此如果一个节点发生故障,您的 MongoDB ReplicaSet 就会宕机。
\n当您连接到 MongoDB 时,您可以连接到 ReplicaSet,例如
\nmongo "mongodb://localhost:27037,localhost:27137,localhost:27237/?replicaSet=repSet"\nRun Code Online (Sandbox Code Playgroud)\n或者直接连接,例如
\nmongo "mongodb://localhost:27037,localhost:27137"\nRun Code Online (Sandbox Code Playgroud)\n当您连接到 ReplicaSet 并且 PRIMARY 出现故障时(或者当它由于某种原因降级为 SECONDARY 时)并且另一个成员成为 PRIMARY 时,通常客户端会自动重新连接到新的 PRIMARY。然而,连接到ReplicaSet 需要一个PRIMARY 成员,即大多数成员必须可用。
\n当您直接连接时,您还可以连接到 SECONDARY 成员并以只读/只读模式使用 MongoDB。但是,如果连接的成员出现故障,您将没有任何故障转移/重新连接功能。
\n您可以在其中一个节点上创建一个 ARBITER 成员。然后,如果另一个节点出现故障,应用程序仍然完全可用。请记住,通过此设置,您只能丢失“第二个”主机,而不会丢失其中任何一个。在最好的情况下,您可以在独立的第三方位置配置 ARBITER。
\n来自Shannon Bradshaw、Eoin Brazil、Kristina Chodorow 的《MongoDB:权威指南》:第 III 部分 - 复制,第 9 章 - 设置副本集:
\n\n\n如何设计一套
\n要规划您的副本集,您必须熟悉\n某些副本集概念。下一章将更详细地介绍这些内容,但最重要的是\n副本集都与多数有关:您需要大多数成员才能选举主成员,\n主节点只有在达到多数成员的情况下才能保持主成员身份,并且当它\xe2\x80\x99s被复制到大多数时,写入是安全的。该多数被定义为超过集合中所有成员的一半,如表 9-1 所示。
\n
| 集合中的成员数量 | 集合中的大多数 |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 2 |
| 4 | 3 |
| 5 | 3 |
| 6 | 4 |
| 7 | 4 |
\n\n\n请注意,\xe2\x80\x99 有多少成员已关闭或不可用并不重要,因为大多数\n基于 set\xe2\x80\x99s 配置。
\n例如,假设我们有一个包含 5 个成员的集合,其中有 3 个成员被删除,如图 9-1 所示。还有两名成员在。这两个成员无法达到\na 集合的多数成员(至少三个成员),因此他们无法选举主要成员。如果其中一个是初选,那么一旦它发现自己无法获得多数席位,它就会下台。几秒钟后,您的集合将由两个辅助成员和三个无法访问的成员组成。
\n
\n\n\n许多用户对此感到沮丧:为什么\xe2\x80\x99t 剩下的两个成员无法选出主要成员?\n问题是\xe2\x80\x99s 可能其他三个成员\xe2\x80\x99t 没有下台,这就是发生故障的网络,如图 9-2 所示。在这种情况下,左边的三名成员将选出一名初选成员,因为他们可以达到该组的多数成员(五名成员中的三名)。
\n在网络分区的情况下,我们不希望分区的两侧都选择一个主节点:否则该集合将有两个主节点。然后,两个初选都将写入数据,并且数据集将出现分歧。要求多数人选举或维持初选是避免出现多个初选的好方法。
\n
\n\n以这样的方式配置您的设备非常重要,以便您\xe2\x80\x99 通常能够拥有一个\n主要设备。例如,在上述五成员集中,如果成员 1、2 和 3\n 位于一个数据中心,而成员 4 和 5 位于另一个数据中心,则几乎总是\n第一个数据中心中有多数可用 (数据中心之间的网络中断比数据中心内部的网络中断的可能性更大)。
\n