如果我有一个 MongoDB 副本集,其中我有 3 个节点(Primary、Secondary、Arbiter)并且主节点出现故障,现在辅助节点假设为主节点,您如何动态处理客户端中的更改,以便他们现在将写入主节点?
我在开发环境中经历了这一点,并开始考虑处理这个问题的最佳方法。这不是一个分片集群,只是一个独立的副本集。
您是否检查了诸如“IsPrimary”之类的连接中的某些内容,以便如果不是,则更改您的写作位置?
任何建议,将不胜感激。
谢谢,
小号
到目前为止,我的发现让我相信,真正正确引导这一点的是司机。我认为我的 C# 驱动程序设置是正确的,但我通过 Python 客户端 (PyMongo) 连接的方式不正确。我应该使用类似 pymongo.ReplicaSetConnection 的东西
显示在这里。
我会继续挖掘,但想分享我到目前为止发现的东西。
编辑:
C# - 驱动程序正确处理连接非常好
Python:需要像我上面所说的那样修改我的连接,以便它将写入路由到新的主节点
Python(pymongo)代码:
from pymongo.replica_set_connection import ReplicaSetConnection
MongoConnection = ReplicaSetConnection('localhost:27017',replicaSet='myReplSet')
--S
一旦你建立了连接,驱动程序应该足够聪明,可以确定数据应该发送到哪个节点。
要连接到副本集,请通过提供多个以逗号分隔的主机名(和端口号,如果需要)来指定种子列表。例如:
mongodb://server1,server2:27017,server2:27018
可以使用普通的 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 参数来指示这不是与单个节点的连接。只要至少有一个种子在线,驱动程序就能够“发现”集合中的所有节点并连接到当前的主节点。