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):
- Versões de Software Idênticas: Todos os nós devem executar a versão exata do RabbitMQ Server e Erlang/OTP.
- 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).
- 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. - 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.
Estabelecendo a Consistência do Cookie
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):
- Pare o serviço RabbitMQ:
bash sudo systemctl stop rabbitmq-server - 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 - 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.
- Inicie o serviço no Nó A (se ainda não estiver em execução):
bash sudo systemctl start rabbitmq-server - 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.
- Pare o Serviço no Nó B (se estiver em execução):
bash sudo systemctl stop rabbitmq-server -
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. -
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"