Como configurar o MongoDB Cluster no Docker Desktop
- 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.

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 mongoClusterNo terminal do Docker desktop, irá aparecer:

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,mongo10Aqui, 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:

O comando executado no terminal aparecerá:

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,mongo20No terminal irá aparecer:

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,mongo30No terminal irá aparecer:

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

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
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.8Verifique se o container docker conectado está executando, com o comando:
db.runCommand ({hello:1})O retorno deverá ser parecido com:

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:

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
exitO resultado será:

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:





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]

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

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

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.

Para saber em que nó você está conectado, execute o seguinte comando:
rs.isMaster().primarySerá mostrado algo parecido como:

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:

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 mongo10Irá aparecer algo como:

Digite o comando abaixo para verificar o estado do cluster:
docker exec -it mongo20 mongosh --eval "rs.status()"O retorno será algo como:




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:

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)

Use o banco de dados CorporeSystem e faça a consulta de um registro
use CorporeSystem
db.cliente.findOne()Será retornado como algo:

Faça uma nova inserção de dados e vamos perceber que o cluster continuou ativo:
db.cliente.insertOne({codigo:7, nome: "Joao Cardoso"});
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,mongo10Será retornado algo como:

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:

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