3

我正在使用 pymongo 运行大型数据更新。要运行更新,使用 找到单个记录collection.find_one(unique criteria),进行更改,批量更新,最后使用块发送db.collection.save([long list of records to save])

在我的本地机器(运行 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()

哪个没有解决问题。我在正确的轨道上吗?

4

2 回答 2

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)

我会先看看你的服务器发生了什么,但这很可能会引导你走上升级之路。

于 2011-04-04T19:24:04.237 回答
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():
  ...
  ...

YMMV

于 2011-09-25T07:08:22.617 回答