Я использую Docker Swarm для создания кластера веб-приложений и баз данных.
] У меня работает четыре контейнера, три из них представляют собой один набор реплик mongodb, а последний - asp. Опубликованный порт: 80-> 80
Mongo1: Опубликованный порт: 1234-> 27017
Mongo2: Опубликованный порт: 1235-> 27017
Mongo3: Опубликованный порт: 1236-> 27017
Строка подключения выглядит следующим образом:
"mongodb: // admin: password @ mongo1 , mongo2, mongo3 / replicaSet = example & authSource = admin"
Для поддержки аварийного переключения и реконфигурации набора реплик клиенты с подключением набора реплик используют имена хостов, настроенные в наборе реплик , в соответствии с требованиями MongoDB Server Discovery и спецификация мониторинга (SDAM) . Это гарантирует, что клиентское представление набора реплик согласуется с конфигурацией и состоянием набора реплик.
Я могу подключаться к каждому узлу индивидуально, а не как набор реплик извне.
Это ожидаемое поведение если внешний хост / порт отличается от конфигурации набора реплик. Если вы подключаетесь к Единому серверу (т.е. без указания соединения с набором реплик), клиенты не обнаруживают серверов. Это может быть полезно для подключения к определенному члену набора реплик в целях резервного копирования или администрирования, или для предотвращения обнаружения сервера, когда вы подключаетесь через перенаправленное имя хоста или комбинацию портов, которая не соответствует конфигурации набора реплик.
С подключением набора реплик клиенты подключаются и запускают команду isMaster
, чтобы узнать текущую конфигурацию и состояние набора реплик. В соответствии со спецификацией SDAM клиенты затем настраивают мониторинг набора реплик, поэтому любые изменения в конфигурации или состоянии будут автоматически обнаруживаться клиентом.
Mongo1: Опубликованный порт: 1234-> 27017 Mongo2: опубликованный порт: 1235-> 27017 Mongo3: Опубликованный порт: 1236-> 27017
Чтобы использовать соединение набора реплик с открытыми портами Docker, вам необходимо:
Mongo1
, Mongo2
, Mongo3
) можно разрешить в контейнере, из которого вы пытаетесь подключиться. Похоже, разрешение имен уже работает правильно, если вы можете подключиться из контейнера приложения, но порты в конфигурации набора реплик не соответствуют тому, что вы открыли через Docker .