Guida passo-passo per l'implementazione di un cluster RabbitMQ Active-Passive
L'implementazione dell'alta disponibilità (HA) per servizi di messaggistica mission-critical richiede una solida ridondanza. Una configurazione di cluster RabbitMQ Active-Passive è un approccio classico per raggiungere questo obiettivo, garantendo che se il nodo attivo fallisce, un nodo passivo designato possa subentrare rapidamente, minimizzando i tempi di inattività. Questa guida fornisce un processo completo, passo dopo passo, per configurare tale implementazione, coprendo i prerequisiti, la configurazione dei nodi e l'assicurazione di capacità di failover senza interruzioni.
Questo modello di implementazione si basa sul clustering RabbitMQ standard combinato con un meccanismo esterno (come Pacemaker o script semplici) per gestire il rilevamento dell'indirizzo IP in caso di guasto. Per questa guida, ci concentreremo sull'aspetto del clustering RabbitMQ che costituisce la base della configurazione HA.
Prerequisiti per un Cluster Active-Passive
Prima di iniziare la configurazione, assicurarsi che i seguenti prerequisiti siano soddisfatti su tutti i nodi del cluster previsti (Nodo A - Attivo, Nodo B - Passivo):
- Versioni Software Identiche: Tutti i nodi devono eseguire la versione esatta di RabbitMQ Server e Erlang/OTP.
- Accessibilità di Rete: Tutti i nodi devono essere in grado di comunicare tra loro attraverso le porte necessarie (default 5672 per AMQP, 25672 per il clustering).
- Risoluzione Host: Configurare il file
/etc/hosts(o il DNS) su tutti i nodi in modo che ciascun nodo possa risolvere in modo affidabile il nome host di tutti gli altri nodi. - Consistenza del Cookie: Il 'magic cookie' di Erlang deve essere identico su tutti i nodi. Questo è fondamentale affinché i nodi si fidino l'uno dell'altro per il clustering.
Stabilire la Consistenza del Cookie
Il cookie di Erlang determina se i nodi possono comunicare in modo sicuro. Deve essere copiato dal primo nodo inizializzato a tutti gli altri.
Sul Nodo A (Il primo nodo):
Individuare il file cookie (solitamente /var/lib/rabbitmq/.erlang.cookie o ~/.erlang.cookie a seconda del metodo di installazione) e copiarne il contenuto.
Sul Nodo B (e nodi successivi):
- Interrompere il servizio RabbitMQ:
bash sudo systemctl stop rabbitmq-server - Sostituire il file cookie esistente con il contenuto copiato dal Nodo A, assicurando i permessi corretti (solitamente
400).
bash # Esempio utilizzando echo (sostituire il contenuto come necessario) echo "YOUR_LONG_COOKIE_STRING" | sudo tee /var/lib/rabbitmq/.erlang.cookie sudo chmod 400 /var/lib/rabbitmq/.erlang.cookie - Avviare il servizio sul Nodo B:
bash sudo systemctl start rabbitmq-server
Passaggio 1: Configurazione dei Nomi Host e della Rete
Assicurarsi che i file host su entrambi i Nodi A e B mappino correttamente i loro nomi host.
Esempio di /etc/hosts (su entrambi i server):
192.168.1.10 rabbitmq-node-a
192.168.1.11 rabbitmq-node-b
Passaggio 2: Inizializzazione del Primo Nodo del Cluster (Attivo)
Il Nodo A sarà il nodo primario iniziale, dove viene stabilito per primo il cluster.
- Avviare il servizio sul Nodo A (se non è già in esecuzione):
bash sudo systemctl start rabbitmq-server - Verificare lo Stato: Assicurarsi che il nodo funzioni correttamente.
bash rabbitmqctl status
Passaggio 3: Aggiunta del Secondo Nodo (Passivo) al Cluster
Ora, istruiamo il Nodo B ad unirsi al cluster guidato dal Nodo A.
- Interrompere il Servizio sul Nodo B (se in esecuzione):
bash sudo systemctl stop rabbitmq-server -
Comando di Unione: Eseguire il comando di unione sul Nodo B, specificando il nome host del Nodo A come peer.
bash rabbitmqctl join_cluster rabbit@rabbitmq-node-a
Suggerimento: Utilizzare il nome host definito in/etc/hosts. -
Avviare il Servizio sul Nodo B:
bash sudo systemctl start rabbitmq-server
Passaggio 4: Verifica della Formazione del Cluster
Accedere al Nodo A e verificare che entrambi i nodi si riconoscano.
rabbitmqctl cluster_status
Estratto dell'Output Previsto:
Si dovrebbero vedere sia rabbitmq-node-a che rabbitmq-node-b elencati sotto 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]},
...
]
Passaggio 5: Configurazione dell'Alta Disponibilità (Accodamento di Code in Cluster)
Il clustering RabbitMQ standard consente ai nodi di condividere metadati (utenti, exchange), ma i messaggi residenti nelle code tipicamente non vengono replicati automaticamente a meno che non vengano applicate specifiche policy HA. Per un vero failover Active-Passive, devono essere utilizzate le code specchiate (mirrored queues).
Definizione della Policy
Una policy viene applicata alle code che corrispondono a specifici modelli per definire quante copie della coda dovrebbero esistere nel cluster e dove dovrebbero essere promosse.
Utilizzare il comando rabbitmqctl set_policy su uno dei nodi per forzare lo mirroring su tutto il cluster ("^").
```bash
Imposta una policy denominata 'ha-all' che specchia le code corrispondenti a qualsiasi nome ('^')
a tutti i nodi del cluster (3 nodi totali) e imposta il comportamento 'promote'.
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"'