Guia Passo a Passo para Implementar um Cluster Ativo-Passivo RabbitMQ

Aprenda a configurar um cluster RabbitMQ Ativo-Passivo robusto para alta disponibilidade. Este guia aborda a configuração de pré-requisitos, a sincronização essencial do Erlang cookie, a união dos nós do cluster e a aplicação de políticas de espelhamento (`ha-mode:all`) para garantir a consistência dos dados e um failover de serviço contínuo quando o nó ativo falhar.

43 visualizações

Guia Passo a Passo para Implementar um Cluster RabbitMQ Ativo-Passivo

Implementar alta disponibilidade (HA) para serviços de mensagens de missão crítica exige redundância robusta. Uma configuração de cluster RabbitMQ Ativo-Passivo é uma abordagem clássica para alcançar isso, garantindo que, se o nó ativo falhar, um nó passivo designado possa assumir rapidamente, minimizando o tempo de inatividade. Este guia fornece um processo abrangente, passo a passo, para configurar tal implementação, cobrindo pré-requisitos, configuração de nós e garantia de recursos de failover contínuos.

Este padrão de implantação depende da clusterização padrão do RabbitMQ combinada com um mecanismo externo (como Pacemaker ou scripts simples) para gerenciar a tomada de posse do endereço IP em caso de falha. Para este guia, focaremos no aspecto da clusterização do RabbitMQ que sustenta a configuração de HA.

Pré-requisitos para um Cluster Ativo-Passivo

Antes de iniciar a configuração, certifique-se de que os seguintes pré-requisitos sejam atendidos em todos os nós de cluster pretendidos (Nó A - Ativo, Nó B - Passivo):

  1. Versões de Software Idênticas: Todos os nós devem executar a versão exata do RabbitMQ Server e Erlang/OTP.
  2. Acessibilidade de Rede: Todos os nós devem ser capazes de se comunicar entre si pelas portas necessárias (padrão 5672 para AMQP, 25672 para clusterização).
  3. Resolução de Host: Configure o arquivo /etc/hosts (ou DNS) em todos os nós para que cada nó possa resolver o nome do host de todos os outros nós de forma confiável.
  4. Consistência do Cookie: O 'cookie mágico' do Erlang deve ser idêntico em todos os nós. Isso é crucial para que os nós confiem uns nos outros para a clusterização.

O cookie do Erlang determina se os nós podem se comunicar de forma segura. Ele deve ser copiado do primeiro nó inicializado para todos os outros.

No Nó A (O primeiro nó):

Localize o arquivo de cookie (geralmente /var/lib/rabbitmq/.erlang.cookie ou ~/.erlang.cookie, dependendo do método de instalação) e copie seu conteúdo.

No Nó B (e nós subsequentes):

  1. Pare o serviço RabbitMQ:
    bash sudo systemctl stop rabbitmq-server
  2. Substitua o arquivo de cookie existente pelo conteúdo copiado do Nó A, garantindo as permissões corretas (geralmente 400).
    bash # Exemplo usando echo (substitua o conteúdo conforme necessário) echo "YOUR_LONG_COOKIE_STRING" | sudo tee /var/lib/rabbitmq/.erlang.cookie sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie
  3. Inicie o serviço no Nó B:
    bash sudo systemctl start rabbitmq-server

Passo 1: Configurando Nomes de Host e Rede

Certifique-se de que os arquivos de host em ambos os Nós A e B mapeiem corretamente seus nomes de host.

Exemplo de /etc/hosts (em ambos os servidores):

192.168.1.10   rabbitmq-node-a
192.168.1.11   rabbitmq-node-b

Passo 2: Inicializando o Primeiro Nó do Cluster (Ativo)

O Nó A será o nó primário inicial, onde o cluster é estabelecido pela primeira vez.

  1. Inicie o serviço no Nó A (se ainda não estiver em execução):
    bash sudo systemctl start rabbitmq-server
  2. Verificar Status: Garanta que o nó esteja rodando corretamente.
    bash rabbitmqctl status

Passo 3: Juntando o Segundo Nó (Passivo) ao Cluster

Agora, instruímos o Nó B a se juntar ao cluster liderado pelo Nó A.

  1. Pare o Serviço no Nó B (se estiver em execução):
    bash sudo systemctl stop rabbitmq-server
  2. Comando de Junção: Execute o comando de junção no Nó B, especificando o nome do host do Nó A como o par (peer).
    bash rabbitmqctl join_cluster rabbit@rabbitmq-node-a
    Dica: Use o nome do host definido em /etc/hosts.

  3. Inicie o Serviço no Nó B:
    bash sudo systemctl start rabbitmq-server

Passo 4: Verificando a Formação do Cluster

Faça login no Nó A e verifique se ambos os nós se reconhecem.

rabbitmqctl cluster_status

Trecho do Resultado Esperado:

Você deve ver rabbitmq-node-a e rabbitmq-node-b listados em running_nodes.

Cluster status of node rabbit@rabbitmq-node-a ...
[{nodes,[{disc,[rabbit@rabbitmq-node-a,rabbit@rabbitmq-node-b]}]},
 {running_nodes,[rabbit@rabbitmq-node-a,rabbit@rabbitmq-node-b]},
 ...
]

Passo 5: Configurando Alta Disponibilidade (Clusterização de Filas)

A clusterização padrão do RabbitMQ permite que os nós compartilhem metadados (usuários, exchanges), mas as mensagens contidas nas filas geralmente não são replicadas automaticamente, a menos que políticas de HA específicas sejam aplicadas. Para um failover Ativo-Passivo verdadeiro, filas espelhadas (mirrored queues) devem ser usadas.

Definindo a Política

Uma política é aplicada a filas que correspondem a padrões específicos para definir quantas cópias da fila devem existir no cluster e onde elas devem ser promovidas.

Use o comando rabbitmqctl set_policy em qualquer nó para impor o espelhamento em todo o cluster ("^").

```bash

Define uma política chamada 'ha-all' que espelha filas correspondentes a qualquer nome ('^')

para todos os nós no cluster (3 nós no total), e define o comportamento de 'promover'.

rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"