Вопрос или проблема
Ошибка 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 о проблемах с конкретно названным репликационным набором.
Буду признателен за любые советы.
Я решил свою проблему.
Оказалось, чтобы изменить, с какой базой данных я запускаю код, мне нужно сделать следующее:
- Убить все
ssh
сессии на Vagrant, чтобы закрыть любые существующие туннели. - Остановить локальный
mongod
сервис:service mongod stop
- Если открывается новый туннель: выполните нужную
ssh
команду на Vagrant, чтобы создать нужный туннель. Если подключаетесь локально, ничего не делайте. - Перезапустите
mongod
:service mongod start
Теперь мой код будет подключаться без ошибок.
Возможно, есть лучший способ достичь этого, но это позволяет мне сделать то, что я хотел.
Ответ или решение
Вы столкнулись с ошибкой ServerSelectionTimeoutError: No replica set members available for replica set name "abc"
в MongoDB, которая указывает на то, что клиент не может найти доступные члены репликации с указанным именем набора реплик. Эта проблема может возникнуть по нескольким причинам, и я рад, что вы уже нашли частичное решение. Тем не менее, позволю себе чуть более подробно описать возможные шаги для диагностики и решения данной проблемы.
Возможные причины и решения
-
Проблемы с SSH-туннелем:
- Убедитесь, что ваши SSH-туннели настроены правильно и активны. Если они некорректны, ваш клиент не сможет подключиться к серверам.
- Проверьте, что в SSH-команде указаны правильные порты и адреса для каждого члена репликации.
-
Проверка конфигурации MongoDB:
- Убедитесь, что все члены репликации находятся в состоянии "выполняется" и доступны. Вы можете сделать это, подключившись к одному из членов репликации напрямую (например, через
mongo
shell) и выполнив командуrs.status()
. - Убедитесь, что репликация и доступ к сети настроены правильно. Иногда брандмауэры или сетевые настройки могут блокировать порты, используемые MongoDB (по умолчанию 27017).
- Убедитесь, что все члены репликации находятся в состоянии "выполняется" и доступны. Вы можете сделать это, подключившись к одному из членов репликации напрямую (например, через
-
Проверка имени набора реплик:
- Проверьте, точно ли вы указали имя набора реплик в вашем коде. Ошибка в написании может привести к тому, что клиент не сможет найти необходимый набор.
-
Логи MongoDB:
- Проверьте журналы MongoDB на всех серверах репликации. Логи могут содержать сообщения об ошибках, которые помогут вам лучше понять, что происходит.
-
Ожидание на соединение:
- Попробуйте увеличить тайм-аут соединения. Если сеть медленная, клиент может не успеть установить связь до истечения времени. Вы можете сделать это, установив параметр
serverSelectionTimeoutMS
при создании клиента.
- Попробуйте увеличить тайм-аут соединения. Если сеть медленная, клиент может не успеть установить связь до истечения времени. Вы можете сделать это, установив параметр
-
Перезапуск служб:
- Как вы уже сделали, перезапустите все SSH-сессии и службы MongoDB. Это может очистить любые состояния сессий, которые могут мешать подключению.
- Обновление драйвера:
- Убедитесь, что вы используете последнюю версию 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!