Contêiner do Docker incapaz de se conectar ao conjunto de réplica do MongoDB

1

Estou usando o Docker Swarm para criar um cluster de aplicativos da Web e bancos de dados.

Eu tenho quatro contêineres em execução, três deles são um único conjunto de réplicas mongodb e o último é um aplicativo núcleo asp.net que se conecta ao conjunto de réplicas.

Todos os quatro contêineres são acessíveis publicamente e estão conectados à mesma rede de estivadores.

O conjunto de réplicas pode conectar-se internamente entre si a quais nomes de host, como: mongo1, mongo2 e mongo3.

O aplicativo asp.net, no entanto, não consegue se conectar ao conjunto de réplicas.

  • Eu posso me conectar ao mongo db através do shell mongo do contêiner do docker asp.net bem.
  • Consigo me conectar a cada nó individualmente, não apenas como um conjunto de réplicas de fora.

Exceção

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

Serviços do Docker:

aplicativo da Web: Porta publicada: 80- > 80

Mongo1: Porta publicada: 1234- > 27017

Mongo2: Porta publicada: 1235- > 27017

Mongo3: Porta publicada: 1236- > 27017

A string de conexão é semelhante à seguinte:

"mongodb://admin:password@mongo1,mongo2,mongo3/replicaSet=example&authSource=admin"

    
por Jamie 02.02.2018 / 14:19

1 resposta

0

Para oferecer suporte ao failover e à reconfiguração do conjunto de réplicas, os clientes com uma conexão de conjunto de réplicas use os nomes de host conforme configurado no conjunto de réplicas conforme exigido pelo Server Discovery do MongoDB e Monitoramento (SDAM) . Isso garante que a visualização do cliente do conjunto de réplicas seja consistente com a configuração e o status do conjunto de réplicas.

I'm able to connect to each node individually, just not as a replica set from outside.

Esse é o comportamento esperado se o host / porta externa for diferente da configuração do conjunto de réplicas. Se você se conectar a um servidor único (ou seja, não especificar uma conexão de conjunto de réplicas), os clientes não farão nenhuma descoberta de servidor. Isso pode ser útil para conectar-se a um membro específico do conjunto de réplicas para fins de backup ou administração ou evitar a descoberta do servidor quando você estiver se conectando por meio de uma combinação de nome ou host encaminhado que não corresponda à configuração do conjunto de réplica.

Com uma conexão de conjunto de réplicas, os clientes se conectam e executam o isMaster command para descobrir o configuração atual e estado do conjunto de réplicas. De acordo com a especificação do SDAM, os clientes configuram o monitoramento do conjunto de réplicas para que quaisquer alterações na configuração ou no status sejam detectadas automaticamente pelo cliente.

Mongo1: Published port: 1234->27017 Mongo2: Published port: 1235->27017 Mongo3: Published port: 1236->27017

Para usar uma conexão de conjunto de réplicas com as portas do Docker expostas, você precisará:

  • Verifique se os nomes de host usados na configuração do conjunto de réplicas ( Mongo1 , Mongo2 , Mongo3 ) podem ser resolvidos no contêiner do qual você está tentando se conectar.
  • Torne as portas nas imagens do Docker exclusivas e exponha as mesmas portas em seu ambiente de host (por exemplo: 27017, 27018, 27019).

Parece que você já tem resolução de nome funcionando corretamente se puder se conectar a partir do contêiner de seu aplicativo, mas as portas na sua configuração de conjunto de réplicas não correspondem ao que você expôs por meio do Docker.

    
por 03.02.2018 / 23:59