Vuoi ridurre i carichi di lavoro e i tempi di consegna delle tue applicazioni? Risparmiati il mal di testa e configura un cluster RabbitMQ per la tua applicazione!
In questo tutorial imparerai come configurare il cluster RabbitMQ e avere un cluster RabbitMQ completamente funzionale con supporto ad alta disponibilità.
Pronto? Continua a leggere e inizia a ridurre i carichi di lavoro!
Prerequisiti
Per seguire questo tutorial, assicurati di disporre dei seguenti requisiti:
- Due o più server Linux nella stessa rete:questo tutorial utilizza tre server Debian 11 denominati node01, node02 e node03.
- Sudo privilegi di root o accesso all'account root/amministratore.
Configurazione di un file host
Il cluster RabbitMQ funziona con il nome host o il dominio locale. Devi assicurarti che ogni nome host si risolva nell'indirizzo IP del server modificando /etc/hosts file.
Apri il /etc/hosts
file su tutti i server utilizzando il tuo editor di testo preferito e aggiungi le seguenti righe al file.
Ricorda che la modifica del file /etc/hosts richiede un privilegio sudo.
Il formato di /etc/hosts la configurazione è IP-address hostname
.
Sostituisci i valori seguenti con gli indirizzi IP e i nomi host dei tuoi server, salva le modifiche ed esci dall'editor.
# /etc/hosts file RabbitMQ Servers
172.16.1.20 node01
172.16.1.21 node02
172.16.1.22 node03
Ora esegui il ping
comando seguente per verificare che ogni nome host si risolva nell'indirizzo IP corretto del server. Ogni -c 3
l'opzione rende ping
richiede tre volte, quindi termina le richieste.
# ping node01 node02 and node03
ping -c 3 node01
ping -c 3 node02
ping -c 3 node03
Se la tua configurazione è corretta, vedrai che ogni nome host è stato risolto nell'indirizzo IP corretto del server, come mostrato di seguito.

Installazione di RabbitMQ su tutti i server
Ora che hai configurato il /etc/hosts
file su tutti i server, è ora di installare i pacchetti RabbitMQ su tutti i server (nodo01, nodo02 e nodo03). Puoi installare RabbitMQ dal repository di distribuzione ufficiale per la maggior parte delle distribuzioni Linux.
Al momento della scrittura, il repository Debian e Ubuntu fornisce l'ultima versione stabile di RabbitMQ 3.8.9.
1. Esegui apt
comando seguente per aggiornare tutti gli indici dei pacchetti del tuo sistema.
sudo apt update
2. Quindi, esegui il seguente apt install
comando per installare RabbitMQ (rabbitmq-server
) sul tuo sistema.
Una volta completata l'installazione, il rabbitmq-server
il servizio viene avviato e abilitato automaticamente sul tuo sistema.
sudo apt install rabbitmq-server -y
3. Infine, esegui il comando seguente per verificare il rabbitmq-server
lo stato del servizio.
sudo systemctl status rabbitmq-server
Di seguito, puoi vedere che il servizio del server RabbitMQ è attivo (in esecuzione) e abilitato . Di conseguenza, i servizi si avviano automaticamente all'avvio/avvio del sistema.

Inoltre, puoi anche verificare la versione di RabbitMQ sul tuo sistema usando il comando seguente.
sudo rabbitmq-diagnostics server_version
La versione di RabbitMQ installata è 3.8.9 , come mostrato di seguito, ma il tuo potrebbe essere diverso.

Configurazione del cluster RabbitMQ
Dopo aver installato RabbitMQ, è il momento di configurare il cluster RabbitMQ. L'uso del cluster RabbitMQ previene la perdita di dati e la perdita tra le tue applicazioni. Il cluster RabbitMQ fornisce replica e disponibilità elevata su tutti i server.
RabbitMQ è un'applicazione scritta in Erlang e, per impostazione predefinita, fornisce un .erlang.cookie nella directory dei dati di RabbitMQ (/var/lib/rabbitmq) .
Per creare un cluster RabbitMQ, devi configurare un .erlang.cookie file in ogni server con lo stesso contenuto e deve essere di proprietà del rabbitmq
utente e gruppo.
1. Sul server node01, eseguire il comando seguente per verificare i file disponibili nella directory dei dati RabbitMQ (/var/lib/rabbitmq
). Il comando quindi stampa il contenuto del .erlang.cookie
file.
# List files and directories on /var/lib/rabbitmq
ls -lah /var/lib/rabbitmq
# Print content of the file .erlang.cookie
cat /var/lib/rabbitmq/.erlang.cookie
Copia l'output (UXPBSDKHLRMGJSOJVEAN ) alla tua nota perché aggiungerai questo output ai server node02 e node03 nei passaggi seguenti. Tieni presente che potresti ottenere un output diverso del .erlang.cookie.
file rispetto a quanto mostrato di seguito.

2. Quindi, passa al server node02 ed esegui il seguente comando su stop
il rabbitmq
servizio.
sudo systemctl stop rabbitmq-server
3. Modifica il /var/lib/rabbitmq/.erlang.cookie
file nel tuo editor di testo preferito. Sostituisci il contenuto originale con quello annotato nel passaggio uno, salva le modifiche ed esci dall'editor.
# content of .erlang.cookie from node01
UXPBSDKHLRMGJSOJVEAN
4. Ora, esegui il comando seguente per avviare rabbitmq-server
servizio.
sudo systemctl start rabbitmq-server
5. Passa al server node03 e ripeti i passaggi (da due a quattro) per modificare il /var/lib/rabbitmq/.erlang.cookie
file.
6. Esegui il seguente rabbitmqctl
comandi sui server node02 e node03 per aggiungerli al cluster RabbitMQ (node01).
# Stop RabbitMQ application
sudo rabbitmqctl stop_app
# Join the RabbitMQ node01
sudo rabbitmqctl join_cluster [email protected]
# Start the RabbitMQ application again
sudo rabbitmqctl start_app
Di seguito, puoi vedere che il server node02 è in cluster con il cluster RabbitMQ (node01) e lo stesso vale per il server node03.

7. Infine, esegui il rabbitmqctl
comando seguente per verificare lo stato del cluster RabbitMQ. Puoi eseguirlo da qualsiasi server (nodo01, nodo02 o nodo03).
sudo rabbitmqctl cluster_status
Puoi vedere nell'output sotto il nome del cluster ([email protected] ) e i nodi in esecuzione.

Configurazione di un utente amministratore per RabbitMQ
Dopo aver configurato il cluster RabbitMQ, creerai un nuovo utente amministratore per RabbitMQ ed eliminerai l'utente guest predefinito. L'utente amministratore RabbitMQ dispone dell'autorizzazione per configurare, leggere e scrivere qualsiasi entità disponibile nel cluster RabbitMQ.
1. Passa al server node01 ed esegui il rabbitmqctl
comando seguente per creare un nuovo utente chiamato admin
con la password impostata come AdminPassRabbitMQ
. Puoi impostare il nome utente e la password preferiti, ma assicurati di impostare una password complessa.
sudo rabbitmqctl add_user admin AdminPassRabbitMQ

2. Quindi, esegui il seguente comando per impostare (set_user_tags
) il nuovo utente (admin
) come administrator
per il cluster RabbitMQ.
sudo rabbitmqctl set_user_tags admin administrator

3. Esegui il comando seguente su set_permissions
al admin
utente con quanto segue:
- Consente (
-p /
)admin
utente per accedere a tutti i vhost sul cluster RabbitMQ. - Primo
".*"
– Consente all'utente di configurare i permessi per ogni entità e vhost. - Secondo
".*"
– Abilita l'autorizzazione di scrittura per l'utente per ogni entità e vhost. - Terzo
".*"
– Abilita l'autorizzazione di lettura per l'utente per ogni entità e vhost.
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

4. Ora, esegui il seguente comando per eliminare (delete_user
) l'utente predefinito (guest
) dal cluster RabbitMQ.
sudo rabbitmqctl delete_user guest

5. Infine, esegui il comando seguente per elencare tutti gli utenti disponibili (list_users
) sul cluster RabbitMQ.
sudo rabbitmqctl list_users
Di seguito puoi vedere un solo utente (admin) . Puoi anche verificare gli utenti di altri server (node02 e node03) e otterrai lo stesso output.

Creazione di un host virtuale e di un nuovo utente amministratore su RabbitMQ
Hai impostato il tuo cluster RabbitMQ e creato un utente amministratore su RabbitMQ. Ma ora creerai un host virtuale (vhost) e utenti su RabbitMQ, in modo che la tua applicazione possa connettersi a RabbitMQ.
Il concetto di base di un host virtuale (vhost) su RabbitMQ è simile a quello su Apache o sui blocchi server su NGINX. Ogni vhost ha entità come scambi, code, binding, autorizzazioni utente, autenticazione, ecc.
1. Esegui rabbitmqctl
comando seguente per creare un nuovo host virtuale (add_vhost
) denominato app-qa1
.
sudo rabbitmqctl add_vhost app-qa1

2. Quindi, esegui i seguenti comandi per creare un nuovo utente (add_user
) denominato alice
con la password AlicePassRabbitMQ
e tagga l'utente come administrator
. Puoi impostare il nome utente e la password come preferisci.
# create new user alice
sudo rabbitmqctl add_user alice AlicePassRabbitMQ
# set a tag administrator for user alice
sudo rabbitmqctl set_user_tags alice administrator

3. Esegui il comando seguente per impostare le autorizzazioni per l'utente alice
per gestire vhost app-qa1
. Queste autorizzazioni consentono all'utente alice
per configurare, leggere e scrivere tutte le entità sotto il vhost app-qa1
.
# set up permission for user alice
sudo rabbitmqctl set_permissions alice --vhost app-qa1 ".*" ".*" ".*"

4. Infine, esegui ogni comando di seguito per elencare i vhost disponibili (list_vhosts
) sul cluster RabbitMQ e sulle autorizzazioni (list_user_permissions
) del nuovo utente amministratore (alice
).
# check available vhosts on RabbitMQ
sudo rabbitmqctl list_vhosts
# check permissions for user alice
sudo rabbitmqctl list_user_permissions alice

Creazione di scambi, code e binding su RabbitMQ
Il tuo host virtuale e l'utente amministratore sono impostati, ma sono tutto ciò di cui hai bisogno per far funzionare la tua applicazione? Dovrai comunque creare entità, come scambi, code e collegamenti su RabbitMQ. Tali entità sono necessarie per far funzionare la tua applicazione con RabbitMQ.
1. Esegui il seguente rabbitmqadmin
comando per creare un nuovo scambio su RabbitMQ chiamato test_exchange
sotto il app-qa1
vhost e l'utente alice
. Puoi specificare il tipo di scambi con il type
opzione, che è direct
per questa demo.
# Create new exchange test_exchange
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare exchange name=test_exchange type=direct

2. Quindi, esegui ogni comando seguente per creare nuove code su RabbitMQ. In questa demo creerai il classic
predefinito (test_classic
) e il quorum
coda denominata test_quorum
.
# create quorum queue with option queue_type=quorum
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare queue name=test_quorum durable=true queue_type=quorum
# create default classic queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare queue name=test_classic durable=true

3. Esegui i comandi seguenti per creare l'associazione per entrambi test_classic
e test_quorum
code. Ogni associazione ha routing_key
diversi ma funziona ancora sullo stesso scambio (test_exchange
).
# create binding for test_quorum
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare binding source="test_exchange" destination_type="queue" destination="test_quorum" routing_key="test_routing_key_quorum"
# create binding for test_classic
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 declare binding source="test_exchange" destination_type="queue" destination="test_classic" routing_key="test_routing_key_classic"

4. Ora, esegui i seguenti comandi su publish
il hello, world
messaggio al test_exchange
. Assicurati di impostare il routing_key.
corretto
# publish message for the test_quorum queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 publish exchange=test_exchange routing_key=test_routing_key_quorum payload="hello world, Quorum Queue"
# publish message for the test_classic queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 publish exchange=test_exchange routing_key=test_routing_key_classic payload="hello world, Classic Queue"

5. Infine, esegui il seguente comando su get
il hello, world
messaggio da test_quorum
e test_classic
code.
# retrieve the message from test_quorum queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_quorum
# retrieve the message from test_classic queue
sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_classic
Come mostrato di seguito, saprai che le code funzionano se ricevi il hello, world
messaggio dal test_quorum
e test_classic
code.

Abilitazione del plug-in di gestione RabbitMQ
Finora sei riuscito a lavorare su RabbitMQ tramite un ambiente a riga di comando. Ma forse preferisci una GUI per interagire con i server e i cluster RabbitMQ. In tal caso, dovrai abilitare il plug-in di gestione RabbitMQ.
Il plug-in di gestione RabbitMQ fornisce un'interfaccia utente di gestione basata sul Web in esecuzione sulla porta predefinita 15672
e lo strumento di gestione della riga di comando [rabbitmqadmin]
Esegui il rabbitmq-plugins
comando seguente su tutti i server (nodo01, nodo02 e nodo03) per abilitare rabbitmq_management
collegare. Questo comando abilita automaticamente altri plugin necessari, come rabbitmq_management_agent
e rabbitmq_web_dispatch
.
sudo rabbitmq-plugins enable rabbitmq_management
Di seguito è riportato l'output simile che vedrai sullo schermo del tuo terminale.

Ora apri il tuo browser web e vai all'indirizzo IP del tuo server seguito dalla porta 15672
(http://172.16.1.20:15672/) per accedere all'interfaccia di gestione basata sul Web di RabbitMQ. Porta 15672
viene aperto automaticamente quando abiliti il plug-in di gestione RabbitMQ.
Accedi alla pagina di accesso dell'interfaccia utente di gestione di RabbitMQ con l'utente alice e password AlicePassRabbitMQ .

Nella dashboard di RabbitMQ, vedrai tutti i nodi disponibili nel cluster RabbitMQ.
Di seguito, puoi vedere tutti i nodi del cluster RabbitMQ in esecuzione senza problemi.

Verifica dell'elevata disponibilità della coda del quorum
In precedenza hai verificato che i nodi nel cluster RabbitMQ siano in esecuzione e le code funzionino, ed è fantastico. Ma cosa succede se uno dei nodi si spegne o si guasta? Verifica che la coda test_quorum fornisca disponibilità elevata e replica tra i server.
1. Nella dashboard di RabbitMQ, fai clic su Code scheda per accedere alle code disponibili nel cluster RabbitMQ.
Di seguito puoi vedere il test_classic
coda e test_quorum
coda.

2. Quindi, fai clic su test_classic coda per ottenere le sue informazioni dettagliate.
Come vedi sotto, il test_classic la coda è in esecuzione su [email protected] senza mirror/replica. Quando il nodo [email protected] è inattivo, il test_classic la coda diventa non disponibile.

3. Torna alla Coda menu, ma fai clic su test_quorum fare la fila questa volta.
Di seguito puoi vedere il test_quorum la coda è disponibile su [email protected] e fornisce anche mirror ad altri nodi del cluster. Questa configurazione manterrà il test_quorum coda in esecuzione anche quando node01 è inattivo.

4. Ora esegui il comando seguente per spegnere/spegnere node01
server. Con il server node01 inattivo.
# turnoff node01
sudo poweroff
5. Passa al server node02 ed esegui il comando seguente per controllare RabbitMQ cluster_status
# checking RabbitMQ cluster status
sudo rabbitmqctl cluster_status
Vedrai gli attuali Nodi in esecuzione sul cluster RabbitMQ sono node02 e nodo03 .

6. Quindi, esegui i seguenti comandi per ricevere il messaggio "hello world" dal test_classic
coda. Questo comando effettuerà cinque richieste al test_classic
coda usando il ciclo Bash.
# setup temporary environment variable CLASSIC
export CLASSIC="sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_classic"
# retrieve message from `test_classic` queue 5 times using bash loop
for i in {1..5}; do $CLASSIC; done
Riceverai il Non trovato output, come mostrato di seguito, perché il server node01 è inattivo.

7. Infine, esegui i seguenti comandi per recuperare il messaggio "hello world" dal test_quorum
coda.
Simile al test della coda test_classic, questo comando effettua cinque richieste al test_quorum
coda, ma questa volta riceverai il messaggio "hello world" anche il node01
è giù. Come mai? Il test_quorum
la coda viene automaticamente replicata/rispecchiata sui server node02 o node03.
# setup temporary environment variable QUORUM
export QUORUM="sudo rabbitmqadmin -u alice -p AlicePassRabbitMQ -V app-qa1 get queue=test_quorum"
# retrieve message from `test_quorum` queue 5 times using bash loop
for i in {1..5}; do $QUORUM; done

Conclusione
Questo tutorial mirava ad aiutarti nel processo di configurazione del cluster RabbitMQ su sistemi Debian/Ubuntu Linux. Hai anche imparato l'amministrazione di base del server RabbitMQ e come creare code che supportano l'alta disponibilità su RabbitMQ.
A questo punto hai impostato un cluster RabbitMQ completo. Allora, qual è il prossimo? Forse impari a implementare RabbitMQ nella tua applicazione?