Mongo не может найти мастера во время поиска данных - PullRequest
3 голосов
/ 04 апреля 2011

Я запускаю большое обновление данных с помощью 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()

Что не решило проблему. Я на правильном пути?

Ответы [ 2 ]

4 голосов
/ 04 апреля 2011

Таким образом, здесь есть несколько потенциальных проблем:

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 голосов
/ 25 сентября 2011

Я столкнулся с этой проблемой при использовании интерактивного питона с pymongo, когда я оставляю сеанс без дела и сталкиваюсь с 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

...