2011-04-04 62 views
3

我正在使用pymongo運行大型數據更新。要運行更新,單個記錄使用collection.find_one(unique criteria)發現,更改,更新是成批的,並使用db.collection.save([long list of records to save])Mongo在數據查找期間找不到主數據庫

在我的本地機器塊最後送(運行1.6.3),進口做工精細。

在遠比我的本地機器快的遠程服務器(運行1.6.0)上,我可以通過插入的一部分很好,但在查找原始記錄時會突然出現以下錯誤:

connection = Connection(...) 
... 
raise AutoReconnect("could not find master/primary") 
pymongo.errors.AutoReconnect: could not find master/primary 

我可以通過的記錄數有所不同,但不是隨機的。

起初我以爲我遇到了連接限制。每次查找記錄後,我開始手動關閉連接:

collection.database.connection.disconnect() 

哪個沒有解決問題。我在正確的軌道上嗎?

+0

聽起來像間或有人關閉網絡通道之間的不可靠的網絡連接。防火牆嗎? – 2011-04-04 02:35:26

+0

我會檢查這個。兩者都在同一臺本地計算機上運行,​​並且正在連接到mongo localhost。 – 2011-04-04 15:24:37

回答

4

因此,有幾個潛在的問題在這裏:

raise AutoReconnect("could not find master/primary") 
pymongo.errors.AutoReconnect: could not find master/primary 

這錯誤表示現有的連接已經莫名其妙地被無效。這可能有多種原因。

發生這種情況的最常見原因是副本集的主節點已經關閉或失敗。在這種情況下,您的代碼需要:

  1. 捕獲(或陷阱)錯誤。
  2. 決定重試策略。 (失敗?重試一次?...)

你在做這個嗎? 您正在運行副本集或主/從? 你有沒有跟蹤這些服務器的性能? 他們有網絡問題嗎? 他們正在轉換角色嗎?

collection.database.connection.disconnect()

這並沒有解決問題。我在正確的軌道上嗎?

「發生」異常在哪裏?它來自連接本身還是保存命令?

上的遠程服務器(運行1.6.0)

在撰寫本文時,1.6.0是一個很老的版本的MongoDB。在隨後的1.6.x版本和1.7.x版本中修復了多個複製錯誤。 (我們已經在1.8.1rc-0)

我會先看看服務器發生了什麼,但這可能會導致您失敗。

2

我在pymongo的交互式python用法中遇到了這個問題,在這裏我將會話閒置並在返回時遇到AutoReconnect。我已經處理這樣說:

import functools 
import pymongo 
import time 

MAX_AUTO_RECONNECT_ATTEMPTS = 5 

def graceful_auto_reconnect(mongo_op_func): 
    """Gracefully handle a reconnection event.""" 
    @functools.wraps(mongo_op_func) 
    def wrapper(*args, **kwargs): 
    for attempt in xrange(MAX_AUTO_RECONNECT_ATTEMPTS): 
     try: 
     return mongo_op_func(*args, **kwargs) 
     except pymongo.errors.AutoReconnect as e: 
     wait_t = 0.5 * pow(2, attempt) # exponential back off 
     time.sleep(wait_t) 

    return wrapper 

@graceful_auto_reconnect 
def some_func_that_does_mongodb_ops(): 
    ... 
    ... 

因人而異

+0

方便的幫手功能。謝謝! – kgriffs 2011-10-20 15:55:47