Я использую Docker Swarm для создания кластера веб-приложений и баз данных.
У меня работает четыре контейнера, три из них представляют собой один набор реплик mongodb, а последний - это базовое приложение asp.net, которое подключается к набору реплик.
Все четыре контейнера общедоступны и подключены к одной сети докеров.
Набор реплик может внутренне подключаться друг к другу с такими именами хостов, как: mongo1, mongo2 и mongo3.
Однако приложение asp.net не может подключиться к набору реплик.
Исключение
Connection id "0HLBA78J6QB27", Request id "0HLBA78J6QB27:00000001": An unhandled exception was thrown by the application.
System.TimeoutException: A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "Unspecified/mongo1;mongo2;mongo3:27017" }", EndPoint: "Unspecified/mongo1;mongo2;mongo3:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address
Докер-сервисы:
Веб-приложение: опубликованный порт: 80-> 80
Mongo1: опубликованный порт: 1234-> 27017
Mongo2: опубликованный порт: 1235-> 27017
Mongo3: опубликованный порт: 1236-> 27017
Строка подключения выглядит следующим образом:
"mongodb: // admin: пароль @ mongo1, mongo2, mongo3 / replicaSet = example & authSource = admin"
Для поддержки аварийного переключения и реконфигурации набора реплик клиенты с подключением набора реплик используйте имена хостов, настроенные в наборе реплик в соответствии с требованиями MongoDB Спецификация обнаружения и мониторинга серверов (SDAM). Это гарантирует, что клиентское представление набора реплик согласуется с конфигурацией и состоянием набора реплик.
Я могу подключиться к каждому узлу индивидуально, а не как к набору реплик извне.
Это ожидаемое поведение, если внешний хост / порт отличается от конфигурации набора реплик. Если вы подключаетесь к Единому серверу (т.е. без указания соединения с набором реплик), клиенты не обнаруживают серверов. Это может быть полезно для подключения к определенному члену набора реплик в целях резервного копирования или администрирования или для предотвращения обнаружения сервера при подключении через перенаправленное имя хоста или комбинацию портов, которая не соответствует конфигурации набора реплик.
При подключении с набором реплик клиенты подключаются и запускают isMaster
команда чтобы узнать текущую конфигурацию и состояние набора реплик. В соответствии со спецификацией SDAM клиенты затем настраивают мониторинг набора реплик, поэтому любые изменения в конфигурации или статусе будут автоматически обнаруживаться клиентом.
Mongo1: Опубликованный порт: 1234-> 27017 Mongo2: Опубликованный порт: 1235-> 27017 Mongo3: Опубликованный порт: 1236-> 27017
Чтобы использовать соединение набора реплик с открытыми портами Docker, вам необходимо:
Mongo1
, Mongo2
,Mongo3
) можно разрешить в контейнере, из которого вы пытаетесь подключиться.Похоже, что разрешение имен уже работает правильно, если вы можете подключиться из контейнера приложения, но порты в вашей конфигурации набора реплик не соответствуют тому, что вы открыли через Docker.