MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Erro de seleção do servidor Docker e mongo-go-driver


Isso ocorre devido a hostname não resolvido do host Docker. No Docker, as instâncias mongo1 , mongo2 e mongo3 são alcançáveis ​​por esses nomes. No entanto, esses nomes não podem ser acessados ​​pelo host do Docker. Isso fica evidente nesta linha:
Addr: mongo2:27017, Type: Unknown, State: Connected, Average RTT: 0, Last error: dial tcp: lookup mongo2: no such host

O driver MongoDB tentará a server discovery de determinado(s) membro(s) do conjunto de réplicas; ele encontrará todos os outros nós dentro do conjunto de réplicas (via rs.conf ). O problema aqui é que o conjunto de réplicas é definido com o nome mongo<N> , o driver (executado no host do Docker) não poderá resolver esses nomes. Você pode confirmar isso tentando pingar mongo1 do host Docker.

Você pode tentar executar o aplicativo de outra instância do Docker compartilhando a mesma rede do Docker que o conjunto de réplicas. Ou modifique a rede do Docker como tal para permitir nomes de host resolvíveis.

ATUALIZAR:

Em relação ao seu comentário sobre por que usar mongo shell ou PyMongo funciona.

Isso se deve à diferença no modo de conexão. Ao especificar um único nó, ou seja, mongodb://node1:27017 no shell ou no PyMongo, a descoberta do servidor não está sendo feita. Em vez disso, ele tentará se conectar a esse nó único (não como parte de um conjunto de réplicas). O problema é que você precisa se conectar ao nó primário do conjunto de réplicas para gravar (você precisa saber qual). Se você quiser se conectar como um conjunto de réplicas, deverá definir o nome do conjunto de réplicas.

Ao contrário do mongo-go-driver , por padrão, ele realizaria a descoberta do servidor e tentaria se conectar como um conjunto de réplicas. Se você quiser se conectar como um único nó, precisará especificar connect=direct no URI de conexão. Consulte também Exemplo de conexão direta