как подключить mongodb с URL-адресом replicaset?

Я использую MongoDB с репликацией (bitnami) в Azure.
Я создал три узла mongodb (1 основной, 1 дополнительный и 1 арбитр). Когда я пытаюсь подключиться с URI подключения MongoDB (mongodb://username:password@ip01:27017,ip02:27017,ip03:27017/?readPreference=primary&replicaSet=replicaset), возникает ошибка типа pymongo.errors.ServerSelectionTimeoutError: 10.0.0.5:27017: timed out,10.0.0.6:27017: [Errno 113] No route to host,10.0.0.4:27017: timed out,10.0.0.7:27017: timed out
Я предпочитаю этот Официальная документация (Bitnami) для URL-адреса подключения.

connectionString = "mongodb://root:Root123@*.*.*.*:27017,*.*.*.*:27017,*.*.*.*:27017/?replicaSet=replicaset"
client= MongoClient(connectionString)
db = client['mongo_collection']
data = db.xyz.find({"x": 10})
for d in data:
    print d

person Tailor Devendra    schedule 05.08.2017    source источник
comment
Учитывая, что 10.x.x.x на самом деле является частным диапазоном IP-адресов, я бы предложил на самом деле предоставить общедоступные адреса для каждого узла, чтобы что-то за пределами сети могло его достичь. Либо так, либо вам нужно настроить правила маршрутизации, которые разрешают доступ с клиентского узла к каждому из этих экземпляров. Похоже на вопрос к serverfault.com или, возможно, в службу поддержки Azure. Но не вопрос программирования, для чего и существует StackOverflow.   -  person Neil Lunn    schedule 05.08.2017
comment
@NeilLunn Я указываю DNS-имя в URL-адресе подключения и думаю, что DNS-имя доступно извне.   -  person Tailor Devendra    schedule 05.08.2017
comment
DNS-имена действительно не имеют значения в том, какой IP-адрес они фактически разрешают. Как уже говорилось, это проблема сети, а не проблема программирования. Существует соответствующий сайт, на котором можно задать вопросы о конфигурации сети. Вот что значит недостижимый хост. Так что дело не в коде, а в доступности сети.   -  person Neil Lunn    schedule 05.08.2017
comment
Хорошо, спасибо @NeilLunn, я задам этот вопрос serverfault.com   -  person Tailor Devendra    schedule 05.08.2017


Ответы (1)


Согласно предоставленному вами официальному документу.

Убедитесь, что приложение может подключиться к каждому узлу кластера, используя его общедоступный или частный IP-адрес. Чтобы обеспечить подключение, у вас есть два варианта:

Разместите приложение в той же сети, что и кластер MongoDB, чтобы оно могло обращаться к каждому узлу, используя его частный IP-адрес. Это рекомендуемая конфигурация для производственных сред. Разместите приложение в другой сети и назначьте общедоступные IP-адреса с соответствующими правилами брандмауэра узлам кластера (если они еще не назначены по умолчанию), чтобы приложение могло обращаться к каждому узлу, используя его общедоступный IP-адрес. Эта конфигурация не рекомендуется для производственных сред.

Таким образом, при тестировании в той же виртуальной сети Azure можно использовать частный IP-адрес (пример 10.0.0.6). Я тестирую в своей лаборатории, я использую python с этим примером.

import pymongo
client = pymongo.MongoClient("mongodb://root:<passsword>@10.0.0.6:27017,10.0.0.4:27017,10.0.0.5:27017/?replicaSet=replicaset")

db = client.test
>>> db.name
u'test'
>>> db.my_collection
Collection(Database(MongoClient(host=['10.0.0.5:27017', '10.0.0.6:27017', '10.0.0.4:27017'], document_class=dict, tz_aware=False, connect=True, replicaset='replicaset'), u'test'), u'my_collection')
>>> db.my_collection.insert_one({"x": 10}).inserted_id
ObjectId('5987cc0b9e90d52dd1860ac3')

Обновлять:

Если вы хотите подключить свои узлы mongodb, вам нужно пропинговать частный IP-адрес. Это дизайнерское поведение.

Если вы хотите использовать mongodb из своего приложения или локально, вам необходимо создать VPN-подключение типа «сеть-сеть» или VPN-соединение «точка-сеть».

person Shui shengbao    schedule 07.08.2017
comment
Извините за мою ошибку, если ваш клиент не находится в виртуальной сети Azure, вам нужно создать VPN-подключение или использовать общедоступный IP-адрес для подключения к mongodb. Я обновляю свой ответ, вы можете проверить. - person Shui shengbao; 08.08.2017
comment
@Tailor Devendra Привет, если возможно, не могли бы вы поделиться своим результатом? Вы решаете эту проблему? - person Shui shengbao; 09.08.2017
comment
Привет, это работает, если у вас есть какие-либо вопросы по этому поводу, я очень рад их решить. - person Shui shengbao; 11.08.2017
comment
Привет, @walter-MSFT, я уже сделал то, что вы предложили выше, но я получаю ту же ошибку, о которой я упоминал в своем вопросе, в дополнение к сообщению об ошибке, мои узлы набора реплик недоступны. как вы думаете, это как-то связано с конфигурацией набора реплик? - person Tailor Devendra; 11.08.2017
comment
@TailorDevendra Нет, это проблема с сетью? Что вы тестируете? На вашей виртуальной машине узла базы данных или на вашем локальном компьютере? При тестировании вы должны убедиться, что можете telnet ip 27017. - person Shui shengbao; 11.08.2017
comment
@TailorDevendra Основная причина в том, что вы не можете получить доступ к сервису. Когда вы используете telnet для тестирования, вы получите ошибку тайм-аута. Я уверен. - person Shui shengbao; 11.08.2017
comment
@TailorDevendra На виртуальной машине узла базы данных выполните команду netstat -ant|grep 27017. Убедитесь, что порт прослушивается на всех узлах. - person Shui shengbao; 11.08.2017
comment
@TailorDevendra Привет, я много раз тестировал в своей лаборатории, у меня все работает. Я предлагаю вам telnet проверить, можете ли вы получить доступ к сервису и использовать API для доступа к базе данных. - person Shui shengbao; 11.08.2017
comment
Я пробовал все вышеперечисленные решения. telnet работает нормально, и порт прослушивает все узлы. - person Tailor Devendra; 11.08.2017
comment
Я встречаю тот же журнал ошибок с вами. Когда я тестирую узлы db, это работает, но когда я тестирую другую виртуальную машину, это не удается. - person Shui shengbao; 14.08.2017
comment
@TailorDevendra В вашей тестовой среде вы должны пропинговать 10.0.0.4/5/6. Возможно, вам нужно создать site-to-site VPN. - person Shui shengbao; 14.08.2017
comment
@TailorDevendra Это дизайнерское поведение. Вы не можете получить mongodb с общедоступным IP-адресом. См. вопрос. Драйвер MongoDB не поддерживает это. - person Shui shengbao; 14.08.2017
comment
@TailorDevendra Когда я тестирую узлы mogodb, ваш скрипт работает для меня. Но когда я тестирую вне виртуальной сети, это не работает. Вы встречаете тот же результат? - person Shui shengbao; 14.08.2017
comment
Разработчик Bitnami здесь. Если вы хотите использовать базу данных за пределами виртуальной сети, то, как говорит @walter-msft, вам следует создать VPN. - person Javier Salmeron; 14.08.2017
comment
@TailorDevendra Как сказал Хавьер, вам нужно создать VPN, вы можете создать точка-точка VPN или VPN между сайтами. - person Shui shengbao; 15.08.2017
comment
Спасибо @Walter-MSFT и Хавьеру Салмерону. Это сработало - person Tailor Devendra; 16.08.2017
comment
Мне удалось подключить мой план службы приложений (группа ресурсов) к набору реплик Bitnami (другой группе ресурсов) с помощью пиринга виртуальной сети. Это лучший вариант имхо. - person Alberto Dallaporta; 10.01.2018