2017-02-14 139 views
0

我使用下面的連接字符串與我MongoClient上pymongo 3.4.0:pymongo replicaset NetworkTimeout錯誤

client = MongoClient("mongodb://username:[email protected]: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 
} 
+0

與主,你可以與外殼連接,做到「db.isMaster()」 ,並將該輸出添加到問題中? –

+0

@Saleem我從來沒有說過我把網絡關了,我說我把主節點放下了。請仔細閱讀這個問題 – masterforker

+0

@ A.JesseJiryuDavis我編輯了我的問題來添加輸出 – masterforker

回答

0

運行一次PyMongo連接到所有的副本集成員,它會嘗試繼續使用,只要有可能相同的連接。所以,一旦它連接到主服務器,它將繼續使用該主連接進行後續操作。

如果關閉了小學,PyMongo的下一個操作將會通常重複使用舊的主要連接並且出現網絡錯誤。 (無論您遇到錯誤還是出現什麼錯誤都取決於時間和網絡配置。)PyMongo記錄了它必須重新發現主節點的事實,然後引發網絡錯誤。

然後,接下來的操作,PyMongo重新發現新的主要並使用其新的主要連接的操作。

欲瞭解更多詳情,請參閱我的文章或我的MongoDB的世界講,這裏的前兩個環節:

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