3

如果我有一个 MongoDB 副本集,其中我有 3 个节点(Primary、Secondary、Arbiter)并且主节点出现故障,现在辅助节点假设为主节点,您如何动态处理客户端中的更改,以便他们现在将写入主节点?

我在开发环境中经历了这一点,并开始考虑处理这个问题的最佳方法。这不是一个分片集群,只是一个独立的副本集。

您是否检查了诸如“IsPrimary”之类的连接中的某些内容,以便如果不是,则更改您的写作位置?

任何建议,将不胜感激。

谢谢,

小号

4

2 回答 2

2

到目前为止,我的发现让我相信,真正正确引导这一点的是司机。我认为我的 C# 驱动程序设置是正确的,但我通过 Python 客户端 (PyMongo) 连接的方式不正确。我应该使用类似 pymongo.ReplicaSetConnection 的东西

显示在这里

我会继续挖掘,但想分享我到目前为止发现的东西。

编辑:

C# - 驱动程序正确处理连接非常好

Python:需要像我上面所说的那样修改我的连接,以便它将写入路由到新的主节点

Python(pymongo)代码:

from pymongo.replica_set_connection import ReplicaSetConnection

MongoConnection = ReplicaSetConnection('localhost:27017',replicaSet='myReplSet')

--S

于 2012-08-16T17:50:42.727 回答
1

一旦你建立了连接,驱动程序应该足够聪明,可以确定数据应该发送到哪个节点。

对于 C# 驱动程序

要连接到副本集,请通过提供多个以逗号分隔的主机名(和端口号,如果需要)来指定种子列表。例如:

mongodb://server1,server2:27017,server2:27018

对于 Python 驱动程序

可以使用普通的 Connection() 构造函数建立与副本集的连接,指定该集合的一个或多个成员。例如,以下任何一项都将创建与我们刚刚创建的集合的连接:

Connection("morton.local", replicaset='foo')
Connection([u'morton.local:27019', 'morton.local:27017', u'morton.local:27018'])
Connection("morton.local:27018", replicaset='foo')
Connection([u'morton.local:27019', u'morton.local:27017', 'morton.local:27018'])
Connection("morton.local", 27019, replicaset='foo')
Connection(['morton.local:27019', u'morton.local:27017', u'morton.local:27018'])
Connection(["morton.local:27018", "morton.local:27019"])
Connection(['morton.local:27019', u'morton.local:27017', 'morton.local:27018'])
Connection("mongodb://morton.local:27017,morton.local:27018,morton.local:27019")
Connection(['morton.local:27019', 'morton.local:27017', 'morton.local:27018'])

传递给 Connection() 的节点称为种子。如果只指定了一个主机,则必须使用 replicaset 参数来指示这不是与单个节点的连接。只要至少有一个种子在线,驱动程序就能够“发现”集合中的所有节点并连接到当前的主节点。

于 2012-08-17T12:29:25.290 回答