MongoDB: Replica set (HA)

Como configurar um replica set de alta disponibilidade

Um replica set é um grupo de nós MongoDB que trabalham em conjunto para garantir alta disponibilidade e melhor desempenho, duplicando os dados por vários servidores. Com um replica set, a sua base de dados mantém-se acessível mesmo que um dos nós falhe, e pode lidar com mais pedidos ao distribuir a carga de trabalho.

Exemplo de um replica set com 3 nósExemplo de um replica set com 3 nós

Numa configuração de alta disponibilidade, se um nó ficar offline, os seus dados continuam disponíveis nos outros nós. O desempenho também é otimizado porque todas as operações de escrita são direcionadas para o nó primário, enquanto as operações de leitura podem ser distribuídas pelos nós secundários.

Se está a começar a trabalhar com replica sets, pode consultar a documentação oficial do MongoDB para obter mais informações.

Para configurar um replica set, vai precisar de pelo menos três nós MongoDB:

  1. Um nó atua como primary, gerindo todas as operações de escrita e, por defeito, também as de leitura.
  2. Os outros nós são secondaries. Estes replicam continuamente os dados do primary quase em tempo real.

Se um nó secundário ficar indisponível, a sua aplicação continua a funcionar normalmente. Quando o secundário regressa ao cluster, sincroniza os dados em falta e atualiza-se em relação ao resto do replica set.

Se o nó primário falhar, o replica set desencadeia automaticamente uma eleição para selecionar um novo primary. Este processo demora normalmente cerca de 10 segundos. Durante este período, o replica set fica em modo apenas de leitura. Assim que o novo primary é eleito, todas as operações retomam normalmente.

Exemplo de uma eleiçãoExemplo de uma eleição

Para criar um replica set na Stackhero, vai precisar de pelo menos três instâncias MongoDB. Eis um guia passo a passo:

  1. Inicie as suas três (ou mais) instâncias MongoDB a partir do dashboard da Stackhero.
  2. Depois das instâncias estarem em funcionamento, atualize as suas configurações no dashboard:
    1. Defina a mesma password de administrador em todas as instâncias.
    2. Ative a opção Ativar replica set.
    3. Escolha um nome do replica set e uma chave secreta que todos os nós irão partilhar. (Atenção: O nome do replica set não pode ser alterado após a criação. Se estiver em dúvida, rs-1 é uma boa opção por defeito.)

Lembre-se que TODAS as suas instâncias devem ter configurações idênticas (password de administrador, nome do replica set e chave secreta do replica set).

Depois de guardar a configuração, terá de definir todos os membros do seu replica set dentro do MongoDB. Veja como pode fazê-lo:

  1. Pode usar este comando para se ligar com o Mongo CLI:
mongo --quiet mongodb://admin@<XXXXXX>.stackhero-network.com/?tls=true

Se não tiver o Mongo CLI instalado, pode usar a imagem oficial Docker com este comando:

> docker run -it mongo /bin/bash

Este comando abre uma shell onde pode executar comandos Mongo diretamente.

  1. Depois de se ligar, pode iniciar o seu replica set com o seguinte comando. Certifique-se de substituir o _id pelo nome escolhido para o replica set e de atualizar os nomes dos hosts dos membros conforme necessário:
rs.initiate({
   _id: "rs-1",
   members: [
      { _id: 0, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 1, host: "<XXXXXX>.stackhero-network.com:27017" },
      { _id: 2, host: "<XXXXXX>.stackhero-network.com:27017" }
   ]
})

Se o comando for bem-sucedido, verá uma resposta semelhante a { "ok" : 1 }.

  1. Se quiser consultar a configuração do seu replica set, pode executar:
rs.conf()

Só precisa de aplicar esta configuração num dos nós. Os restantes são atualizados automaticamente.

O seu replica set MongoDB deverá agora estar operacional.

Para o ajudar a monitorizar o estado do seu replica set, criámos um script Node.js que verifica o estado a cada segundo. Pode encontrar este script no nosso repositório GitHub.

Captura de ecrã do scriptCaptura de ecrã do script

Se encontrar este erro, normalmente é porque a encriptação TLS não foi ativada. Pode resolver isto adicionando o parâmetro tls=true ao seu URL de ligação. Por exemplo:

mongodb://admin:PASSWORD@<XXXXXX>.stackhero-network.com:27017/admin?tls=true