top of page

Como configurar o MongoDB Cluster no Docker Desktop

  • Foto do escritor: Rodrigo Saito
    Rodrigo Saito
  • 7 de mar.
  • 6 min de leitura

Atualizado: 8 de mar.

Fala Pessoal, tudo bem?


Já sabe trabalhar com o MongoDB em um único nó? Sim!


Vamos trabalhar com o MongoDB com o cluster configurado.


O propósito geral do MongoDB é trabalhar via web, mas vamos fazer essa estrutura no Docker Desktop, com Conjunto de Réplicas.


Conjunto de réplicas são grupos de servidores do MongoDB, chamados de nós, contendo copia de dados idênticas. Se um dos servidores falar, o outros irão assumir a carga enquanto o que caiu reinicia.


ree

Quando você cria uma instância do MongoDB no MongoDB Atlas, no banco de dados como serviço do MongoDB, um cluster é criado automaticamente para você, garantindo que você tenha a melhor experiência possível.


No entanto, se você precisar experimentar clusters do MongoDB, você pode usar o Docker para criar um cluster no seu computador pessoal.


Serão necessários 3 passos para criação do cluster:

  • Criação do Docker network

  • Iniciar três instancias do MongoDB

  • Inicializar o Conjunto de Replicas


Pré-requisitos

Estamos partindo do principio que voce já tenha instalado o Docker Desktop em Windows em seu computador e que voce já tenha uma imagem do MongoDB também baixado em seu Docker.


Ambas instalações podem ser encontradas no nosso blog!


Como Instalar o Docker Desktop no Windows:


Como configurar o MongoDB no Docker Desktop:


Criação do Docker Network


O primeiro passo é criar uma rede Docker. Essa rede permitirá que cada um dos seus contêineres em execução nessa rede vejam uns aos outros. Para criar uma rede, execute o comando:


docker network create mongoCluster

No terminal do Docker desktop, irá aparecer:


Comando no Terminal do Docker Desktop. ID criado
Comando no Terminal do Docker Desktop. ID criado

O parâmetro mongoCluster aqui é o nome da rede; você pode escolher um que seja apropriado para sua configuração.


Após executar o comando, você deve ver o id da rede que acabou de criar.


Observe que esse comando só precisa ser executado uma vez. Se você reiniciar seus contêineres depois, não precisará recriar essa rede.


Iniciar instâncias do MongoDB


Agora você está pronto para iniciar seu primeiro contêiner com o MongoDB. Para iniciar o contêiner, use o comando docker run.


docker run -d --rm -p 27017:27017 --name mongo10 --network mongoCluster mongodb/mongodb-community-server:latest --replSet myReplicaSet --bind_ip localhost,mongo10

Aqui, você diz ao docker para iniciar um contêiner com os seguintes parâmetros:


-d --> indica que este contêiner deve ser executado no modo desanexado (em segundo plano).

-p --> indica o mapeamento de porta. Qualquer solicitação de entrada na porta 27017 em sua máquina será redirecionada para a porta 27017 no contêiner.

--name --> indica o nome do contêiner. Este se tornará o nome do host desta máquina.

--network --> indica qual rede Docker usar. Todos os contêineres na mesma rede podem ver uns aos outros.

mongodb/mongodb-community-server:latest --> é a imagem que será usada pelo Docker. Esta imagem é o servidor MongoDB Community


Para verificar qual é a imagem que está no docker desktop, cique em cima da imagem e veja a versão que está que você está usando:


ree

O comando executado no terminal aparecerá:


ree

O restante desta instrução é o comando que será executado quando o contêiner for iniciado. Este comando cria uma nova instância mongod pronta para um conjunto de réplicas.


Se o comando foi executado com sucesso, você deve ver uma longa sequência hexadecimal representando o id do contêiner. Inicie dois outros contêineres. Você precisará usar um nome diferente e uma porta diferente para esses dois.


docker run -d --rm -p 27018:27017 --name mongo20 --network mongoCluster mongodb/mongodb-community-server:latest --replSet myReplicaSet --bind_ip localhost,mongo20

No terminal irá aparecer:

ree

Execute o comando para abaixo para instanciar o terceiro né:


docker run -d --rm -p 27019:27017 --name mongo30 --network mongoCluster mongodb/mongodb-community-server:latest --replSet myReplicaSet --bind_ip localhost,mongo30

No terminal irá aparecer:


ree

Nos containers do Docker, irá aparecer as tres instancias executando


ree

Configurar a inicialização do conjunto de réplicas:


O próximo passo é criar o conjunto de réplicas real com os três membros. Para fazer isso, você precisará usar o MongoDB Shell. Esta ferramenta CLI (interface de linha de comando) está disponível com a instalação padrão do MongoDB ou instalada independentemente.


No entanto, se você não tiver a ferramenta instalada no seu laptop, é possível usar o mongosh disponível dentro dos contêineres com o comando docker exec.


docker exec -it mongo10 mongosh
Comando para entrar no mongosh do container mongo10
Comando para entrar no mongosh do container mongo10

Salve a string "Connection To" em um bloco de notas para que voce possa utilizar depois, na string de conexão do MongoDB Compass:


mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.8

Verifique se o container docker conectado está executando, com o comando:

db.runCommand ({hello:1})

O retorno deverá ser parecido com:


execução do db.runCommand
execução do db.runCommand

Execute o comando rs.initiate (tudo em uma única linha)

rs.initiate ({ _id: "myReplicaSet", members:[{_id:0, host: "mongo10"}, {_id:1, host: "mongo20"}, {_id:3, host: "mongo30"}]})

Deverá ter um retorno como:

ree

Como parte do objeto de configuração que é passado para rs.initiate(), você precisará especificar o nome do conjunto de réplicas (myReplicaSet, neste caso), junto com a lista de membros que farão parte do conjunto de réplicas. Os nomes de host para os contêineres são os nomes dos contêineres conforme especificado pelo parâmetro --name no comando docker run. Você pode aprender mais sobre as opções possíveis para configurar um conjunto de réplicas na documentação.


Se o comando foi executado com sucesso, você deverá ver uma mensagem do mongosh CLI indicando os números de versão do MongoDB e do Mongosh, seguido por uma mensagem indicando:

{ ok: 1}


Dê o comando exit para sair do container shell


exit

O resultado será:


ree


Teste e verificação do conjunto de réplicas


Agora você deve ter um conjunto de réplicas em execução. Se quiser verificar se tudo foi configurado corretamente, você pode usar a ferramenta CLI mongosh para avaliar a instrução rs.status(). Isso fornecerá a você o status do seu conjunto de réplicas, incluindo a lista de membros.


docker exec -it mongo10 mongosh --eval "rs.status()"

O retorno será parecido com:


Parte 1
Parte 1

Parte 2
Parte 2
Parte 3
Parte 3
Parte 4
Parte 4

Parte 5
Parte 5

Para se conectar via MongoDB Compass


No MongoDB Compass, clique no botão [+ Add New Connection]. Cole a URL salva da conexao em URl e clique em [Save & Connect]


Imagem do MongoDB Compass de conexão com o Cluster
Imagem do MongoDB Compass de conexão com o Cluster

Clique em cima da conexão e pressione o botão [>_ Open MongoDB shell]

Conexão estabelecida do do ReplicaSet
Conexão estabelecida do do ReplicaSet

Será mostrado o Prompt do MongoSH, conectado ao myReplicaSet ao invés do Host diretamente:

Conexão com o nó primario
Conexão com o nó primario

Observe que os dados são criados dentro do armazenamento do contêiner e serão destruídos quando os contêineres forem removidos do sistema host.


A configuração Set Replica permite que voce só faça inserção de dados no nó primário.


ree

Para saber em que nó você está conectado, execute o seguinte comando:


rs.isMaster().primary

Será mostrado algo parecido como:

Conexao com o nó primario
Conexao com o nó primario


Para verificar se seu conjunto de réplicas está funcionando, você pode tentar parar um dos contêineres com docker stop e tentar ler do seu banco de dados novamente.


use CorporeSystem

db.cliente.insertOne({codigo:1, nome: "Ana Maria"});
db.cliente.insertOne({codigo:2, nome: "Maria Jose"});
db.cliente.insertOne({codigo:3, nome: "Jose Silva"});
db.cliente.insertOne({codigo:4, nome: "Luis Souza"});
db.cliente.insertOne({codigo:5, nome: "Fernanda Silva"});

db.cliente.find()

Algo será apresentado como:


Dados inseridos via comando Insert
Dados inseridos via comando Insert

Para verificar se seu conjunto de réplicas está funcionando, você pode tentar parar um dos contêineres com docker stop e tentar ler do seu banco de dados novamente.


docker stop mongo10

Irá aparecer algo como:

Parando o nó mongo10
Parando o nó mongo10

Digite o comando abaixo para verificar o estado do cluster:


docker exec -it mongo20 mongosh --eval "rs.status()"

O retorno será algo como:


Parte 1
Parte 1

Parte 2
Parte 2
Parte 3
Parte 3
Parte 4
Parte 4

Na mesma seção anterior da conexao do MongoDB Compass, tente dar um insert:


db.cliente.insertOne({codigo:6, nome: "Teresa Maria"});

Será retornado algo como:


Mensagem de erro ao tentar fazer a inserção
Mensagem de erro ao tentar fazer a inserção

Abra outra conexão com a porta do Cluster primário, de acordo com o que o MongoDB elegeu:


mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.3.8

(Esse é o caso do meu ambiente, onde o MongoDB elegeu esse Nó como primário)


Configuração do MongoDB Compass
Configuração do MongoDB Compass

Use o banco de dados CorporeSystem e faça a consulta de um registro


use CorporeSystem

db.cliente.findOne()

Será retornado como algo:

Retorno do MongoDB Compass conectado ao nó eleito como primário
Retorno do MongoDB Compass conectado ao nó eleito como primário

Faça uma nova inserção de dados e vamos perceber que o cluster continuou ativo:


db.cliente.insertOne({codigo:7, nome: "Joao Cardoso"});
Retorno da inserção do dado
Retorno da inserção do dado

Restabelecendo novamente o nó do cluster


Volte novamente o nó mongo10


docker run -d --rm -p 27017:27017 --name mongo10 --network mongoCluster mongodb/mongodb-community-server:latest --replSet myReplicaSet --bind_ip localhost,mongo10

Será retornado algo como:


ree

Digite o comando abaixo para verificar o estado do cluster:

docker exec -it mongo20 mongosh --eval "rs.status()"

Dessa vez, o nó mongo20 estará como secundário:

ree

Dessa forma, pudemos comprovar que o mongo se permaneceu disponível mesmo com a queda de um nó de cluster.






Esperamos que tenha gostado.


Obrigado e até !



Referencias:











 
 
 

Comentários


Nunca perca um post. Assine agora!

Caso queira receber noticias sobre o blog, assine!

© 2022 por datalib

  • Ícone do Facebook Cinza
  • Ícone do Linkedin Cinza
bottom of page