Ошибка ServerSelectionTimeoutError в MongoDB: нет доступных участников репликации для имени репликационного набора “abc”

Вопрос или проблема

Ошибка ServerSelectionTimeoutError в MongoDB: нет доступных участников репликации для имени репликационного набора “abc”

Я опытный программист, но новичок в Python, Ubuntu и Linux. Прошу прощения, если этот вопрос лучше задать в другом форуме.

Я работаю над проектом на Python с использованием PyCharm, код выполняется в окружении Ubuntu в Vagrant. Необходимо подключиться к базе данных MongoDb.

Когда база данных локальная, у меня нет никаких сложностей. Я также могу подключиться к одной удаленной базе данных. Однако база данных, к которой я больше всего хочу подключиться, является частью репликационного набора, и, похоже, в этом проблема.

(Я должен сказать, что база данных с репликационным набором работает прекрасно в своей фактической роли. Похоже, проблема только у меня.)

Мы настроили несколько ssh туннелей, используя следующие рекомендации:

Подключение к репликационному набору Mongo через SSH

Мы правильно настроили hosts и ifconfig.

Теперь мой supervisor может подключаться с минимальными трудностями. Я же продолжаю получать следующее сообщение:

pymongo.errors.ServerSelectionTimeoutError: Нет доступных членов репликационного набора для имени репликационного набора "abc"

Информация о подключении включает в себя все 3 сервера репликационного набора в строке host, плюс указано название репликационного набора и ReadPreference.PRIMARY.

Стек вызовов выглядит так:

Файл "/usr/local/src/dashboard/dashboard/dashboard/app/tasks/exports/__init__.py", строка 95, в get_sections
    sections = CourseSection.objects(**params)
Файл "/apps/dashboard-env/lib/python3.4/site-packages/mongoengine/queryset/manager.py", строка 37, в __get__
    queryset = queryset_class(owner, owner._get_collection())
Файл "/apps/dashboard-env/lib/python3.4/site-packages/mongoengine/document.py", строка 198, в _get_collection
    cls.ensure_indexes()
Файл "/apps/dashboard-env/lib/python3.4/site-packages/mongoengine/document.py", строка 878, в ensure_indexes
  collection.create_index(fields, background=background, **opts)
Файл "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/collection.py", строка 1753, в create_index
    self.__create_index(keys, kwargs, session, **cmd_options)
Файл "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/collection.py", строка 1641, в __create_index
    with self._socket_for_writes() as sock_info:
Файл "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/collection.py", строка 193, в _socket_for_writes
    return self.__database.client._socket_for_writes()
Файл "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/mongo_client.py", строка 965, в _socket_for_writes
    server = self._get_topology().select_server(writable_server_selector)
Файл "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/topology.py", строка 224, в select_server
    address))
Файл "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/topology.py", строка 183, в select_servers
    selector, server_timeout, address)
Файл "/apps/dashboard-env/lib/python3.4/site-packages/pymongo/topology.py", строка 199, в _select_servers_loop
    self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: Нет доступных членов репликационного набора для имени репликационного набора "abc"

Конкретное сообщение Нет доступных членов репликационного набора для имени репликационного набора "abc" кажется относительно редким, так как я не нашел упоминаний в Google о проблемах с конкретно названным репликационным набором.

Буду признателен за любые советы.

Я решил свою проблему.

Оказалось, чтобы изменить, с какой базой данных я запускаю код, мне нужно сделать следующее:

  1. Убить все ssh сессии на Vagrant, чтобы закрыть любые существующие туннели.
  2. Остановить локальный mongod сервис: service mongod stop
  3. Если открывается новый туннель: выполните нужную ssh команду на Vagrant, чтобы создать нужный туннель. Если подключаетесь локально, ничего не делайте.
  4. Перезапустите mongod: service mongod start

Теперь мой код будет подключаться без ошибок.

Возможно, есть лучший способ достичь этого, но это позволяет мне сделать то, что я хотел.

Ответ или решение

Вы столкнулись с ошибкой ServerSelectionTimeoutError: No replica set members available for replica set name "abc" в MongoDB, которая указывает на то, что клиент не может найти доступные члены репликации с указанным именем набора реплик. Эта проблема может возникнуть по нескольким причинам, и я рад, что вы уже нашли частичное решение. Тем не менее, позволю себе чуть более подробно описать возможные шаги для диагностики и решения данной проблемы.

Возможные причины и решения

  1. Проблемы с SSH-туннелем:

    • Убедитесь, что ваши SSH-туннели настроены правильно и активны. Если они некорректны, ваш клиент не сможет подключиться к серверам.
    • Проверьте, что в SSH-команде указаны правильные порты и адреса для каждого члена репликации.
  2. Проверка конфигурации MongoDB:

    • Убедитесь, что все члены репликации находятся в состоянии "выполняется" и доступны. Вы можете сделать это, подключившись к одному из членов репликации напрямую (например, через mongo shell) и выполнив команду rs.status().
    • Убедитесь, что репликация и доступ к сети настроены правильно. Иногда брандмауэры или сетевые настройки могут блокировать порты, используемые MongoDB (по умолчанию 27017).
  3. Проверка имени набора реплик:

    • Проверьте, точно ли вы указали имя набора реплик в вашем коде. Ошибка в написании может привести к тому, что клиент не сможет найти необходимый набор.
  4. Логи MongoDB:

    • Проверьте журналы MongoDB на всех серверах репликации. Логи могут содержать сообщения об ошибках, которые помогут вам лучше понять, что происходит.
  5. Ожидание на соединение:

    • Попробуйте увеличить тайм-аут соединения. Если сеть медленная, клиент может не успеть установить связь до истечения времени. Вы можете сделать это, установив параметр serverSelectionTimeoutMS при создании клиента.
  6. Перезапуск служб:

    • Как вы уже сделали, перезапустите все SSH-сессии и службы MongoDB. Это может очистить любые состояния сессий, которые могут мешать подключению.
  7. Обновление драйвера:
    • Убедитесь, что вы используете последнюю версию PyMongo. Иногда проблемы могут быть вызваны ошибками в более старых версиях драйвера.

Пример кода для подключения

Вот пример того, как вы можете подключиться к вашему кластеру:

from pymongo import MongoClient
from pymongo import ReadPreference

# Укажите параметры подключения
uri = "mongodb://user:password@host1:port,host2:port,host3:port/?replicaSet=abc&readPreference=primary"

client = MongoClient(uri, serverSelectionTimeoutMS=5000)

try:
    # Проверяем подключение
    client.admin.command('ping')
    print("Подключение успешно выполнено")
except Exception as e:
    print(f"Ошибка подключения: {e}")

Заключение

Я рад видеть, что вы смогли решить свою проблему с помощью перезапуска SSH-сессий и MongoDB. Если вы столкнетесь с другими проблемами или у вас возникнут дополнительные вопросы, не стесняйтесь задавать их. Успехов вам в работе с MongoDB!

Оцените материал
Добавить комментарий

Капча загружается...