Клиентским библиотекам mongodb не удается подключиться к набору реплик
Используя последние клиентские библиотеки (pymongo 3.4, mongodb (nodejs) 2.2.27), у меня возникают проблемы с подключением к моим серверам mongodb с репликацией. Конфигурация репликационного набора содержит либо внутренние ips серверов, либо имена хостов. Я получаю следующую ошибку:
pymongo.errors.ServerSelectionTimeoutError: mongodbdriver20151129-arbiter-1:27017: [Errno 8] nodename nor servname provided, or not known,mongodbdriver20151129-instance-1:27017: [Errno 8] nodename nor servname provided, or not known,mongodbdriver20151129-instance-2:27017: [Errno 8] nodename nor servname provided, or not known
или же
pymongo.errors.ServerSelectionTimeoutError: 10.0.0.5:27017: timed out,10.0.0.6:27017: timed out,10.0.0.4:27017: timed out
В настоящее время я работаю над этим, изменяя конфигурацию replicaset, чтобы она содержала внешние ips для серверов, но я предполагаю, что это замедлит межсерверную связь. Как я могу подключиться к своим серверам из внешнего местоположения с оригинальным rsconf?
[обновление] Примечание: я пытаюсь подключиться к внешнему ip сервера, и это работало нормально при использовании pymongo 2.8 или mongodb (js) 2.1.4
[обновить] Следуйте этому чату для более подробной информации / примеров
1 ответ
Более поздние версии всех официально поддерживаемых драйверов MongoDB (включая драйвер узла) соответствуют спецификации обнаружения и мониторинга сервера (SDAM), которая предписывает всем драйверам отслеживать все узлы в наборе реплик (см. Мониторинг).
Причина такого мониторинга заключается в том, чтобы иметь возможность постоянно находить состояние всей реплики и повторно подключаться к новому первичному серверу, если текущий первичный сервер по какой-либо причине переходит в автономный режим. Посмотрите, в чем смысл периодического мониторинга
Чтобы иметь возможность отслеживать все узлы в наборе реплик, драйвер должен иметь доступ к каждому члену набора реплик. Поскольку ваш набор реплик определяется с использованием внутренних IP-адресов, недоступных для драйвера, драйвер не может подключиться к ним. Это причина ошибки, которую вы видите.
Есть несколько способов решить эту проблему:
- Используйте IP-адреса или имена хостов для конфигурации набора реплик, которые доступны для драйвера (рекомендуется).
- Соединитесь с одним из узлов без указания набора реплик, по существу рассматривая узел как автономный (не рекомендуется).
Если более старый драйвер может подключиться без жалоб, то драйвер либо сильно устарел, либо не соответствует надлежащим спецификациям SDAM и не должен использоваться, поскольку его поведение не может быть гарантировано. MongoDB публикует спецификацию SDAM и обязывает всех драйверов следовать ей по уважительной причине.