0

我在 pymongo 3.4.0 上将以下连接字符串与 MongoClient 一起使用:

client = MongoClient("mongodb://username:password@10.0.5.170:27017,10.0.5.222:27017,10.0.6.16:27017/?replicaSet=enterprise", connect=False)

当我关闭我的主节点并尝试执行任何 CRUD 操作时,我收到一个 pymongo.errors.NetworkTimeout 错误。但是,当我使用相同的 uri 创建一个新的 MongoClient 并重试时,这个错误就会消失。如何确保无缝故障转移?

这是在主节点上运行的 db.isMaster() 的输出

{
    "hosts" : [
        "10.0.5.170:27017",
        "10.0.5.222:27017",
        "10.0.6.16:27017"
    ],
    "setName" : "enterprise",
    "setVersion" : 1,
    "ismaster" : true,
    "secondary" : false,
    "primary" : "10.0.5.170:27017",
    "me" : "10.0.5.170:27017",
    "electionId" : ObjectId("7fffffff0000000000000001"),
    "maxBsonObjectSize" : 16777216,
    "maxMessageSizeBytes" : 48000000,
    "maxWriteBatchSize" : 1000,
    "localTime" : ISODate("2017-02-14T17:38:38.647Z"),
    "maxWireVersion" : 4,
    "minWireVersion" : 0,
    "ok" : 1
}
4

1 回答 1

0

一旦 PyMongo 连接到所有副本集成员,它就会尝试尽可能长时间地继续使用相同的连接。因此,一旦它连接到主节点,它将继续使用该主节点连接进行后续操作。

如果关闭主节点,PyMongo 的下一个操作通常会重用旧的主节点连接并出现网络错误。(您是否收到错误或您看到的错误取决于时间和网络配置。)PyMongo 记录它必须重新发现主节点的事实,然后引发网络错误。

然而,之后的下一个操作,PyMongo 会重新发现新的主节点并使用其新的主节点连接进行操作。

有关更多详细信息,请参阅我的文章或我的 MongoDB World 演讲,前两个链接在这里:

https://emptysqua.re/blog/server-discovery-and-monitoring-in-mongodb-drivers/

于 2017-02-15T00:16:47.393 回答