Cómo configurar un clúster RabbitMQ en Ubuntu 20.04

RabbitMQ es un software de intermediario de mensajería gratuito, de código abierto y multiprotocolo, escrito en el lenguaje de programación Erlang. Un corredor de mensajes se utiliza para almacenar mensajes para una aplicación. Cuando una aplicación envía datos a otra aplicación, ésta publica el mensaje en el corredor de mensajes. RabbitMQ admite varios protocolos de mensajería y puede desplegarse fácilmente en configuraciones distribuidas. El corredor de mensajes actúa como intermediario para varias aplicaciones web y se utiliza para reducir las cargas y el tiempo de entrega de las aplicaciones web.

En este tutorial, vamos a configurar un clúster RabbitMQ de tres nodos en un servidor Ubuntu 20.04.

Requisitos previos

  • Tres servidores ejecutando Ubuntu 20.04.
  • Una contraseña de root configurada en cada servidor.

Cómo empezar

Antes de empezar, necesitarás actualizar los paquetes de tu sistema a la última versión. Puedes actualizarlos ejecutando el siguiente comando en cada nodo:

apt-get update -y

Una vez actualizados todos los paquetes, tendrás que configurar el archivo /etc/hosts en cada nodo. Para que puedan comunicarse entre sí por nombre de host.

Edita el archivo /etc/hosts en cada nodo con el siguiente comando:

nano /etc/hosts

Añade las siguientes líneas:

192.168.0.10 node1
192.168.0.11 node2
192.168.0.12 node3

Guarda y cierra el archivo cuando hayas terminado. A continuación, puedes proceder al siguiente paso.

Instalar el Servidor RabbitMQ

A continuación, tendrás que instalar el paquete RabbitMQ Server en cada nodo. Puedes instalarlo simplemente ejecutando el siguiente comando:

apt-get install rabbitmq-server -y

Una vez instalado, inicia el servicio RabbitMQ y habilítalo para que se inicie al reiniciar el sistema con el siguiente comando:

systemctl start rabbitmq-server
systemctl enable rabbitmq-server

También puedes verificar el estado del servicio RabbitMQ con el siguiente comando:

systemctl status rabbitmq-server

Deberías obtener la siguiente salida:

? rabbitmq-server.service - RabbitMQ Messaging Server
     Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-07-21 06:25:07 UTC; 19min ago
   Main PID: 2565 (beam.smp)
     Status: "Initialized"
      Tasks: 87 (limit: 2353)
     Memory: 83.5M
     CGroup: /system.slice/rabbitmq-server.service
             ??2551 /bin/sh /usr/sbin/rabbitmq-server
             ??2565 /usr/lib/erlang/erts-10.6.4/bin/beam.smp -W w -A 64 -MBas ageffcbf -MHas ageffcbf -MBlmbcs 512 -MHlmbcs 512 -MMmcs 30 -P 1>
             ??2828 erl_child_setup 65536
             ??2921 inet_gethost 4
             ??2922 inet_gethost 4

Jul 21 06:24:58 node1 systemd[1]: Starting RabbitMQ Messaging Server...
Jul 21 06:25:07 node1 systemd[1]: rabbitmq-server.service: Supervising process 2565 which is not our child. We'll most likely not notice when >
Jul 21 06:25:07 node1 systemd[1]: Started RabbitMQ Messaging Server.

En este punto, el servidor RabbitMQ está instalado y funcionando en cada nodo. Ahora puedes proceder al siguiente paso.

Habilitar los plugins de gestión de RabbitMQ

El plugin de gestión de RabbitMQ proporciona una API basada en HTTP que puede utilizarse para monitorizar y gestionar nodos y clusters de RabbitMQ a través de un navegador web. Por defecto, se ejecuta en el puerto TCP 15672.

Puedes activar el complemento de gestión de RabbitMQ ejecutando el siguiente comando en cada nodo:

rabbitmq-plugins enable rabbitmq_management

Deberías ver la siguiente salida:

Enabling plugins on node rabbit@node1:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@node3...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

started 3 plugins.

A continuación, reinicia el servicio RabbitMQ para aplicar los cambios:

systemctl restart rabbitmq-server

Puedes verificar el puerto de escucha con el siguiente comando:

netstat -tunelp | grep 15672

Deberías ver la siguiente salida:

tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      109        23155      2565/beam.smp

Configurar el Cluster RabbitMQ

Por defecto, el archivo /var/lib/rabbitmq/.erlang.cookie es el mismo en cada nodo. Para configurar el clúster RabbitMQ, tendrás que copiar el archivo /var/lib/rabbitmq/.erlang.cookie del nodo1 a los otros nodos.

En el nodo1, ejecuta el siguiente comando para copiar el archivo /var/lib/rabbitmq/.erlang.cookie a los otros nodos.

scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/
scp /var/lib/rabbitmq/.erlang.cookie [email protected]:/var/lib/rabbitmq/

A continuación, tendrás que configurar el nodo1 y el nodo2 para que se unan al nodo1 del clúster.

Primero, reinicia el servicio RabbitMQ y detén la aplicación con el siguiente comando tanto en el nodo2 como en el nodo3:

systemctl restart rabbitmq-server
rabbitmqctl stop_app

En el nodo2, únete al clúster del nodo1 ejecutando el siguiente comando:

rabbitmqctl join_cluster rabbit@node1

Deberías ver la siguiente salida:

Clustering node rabbit@node2 with rabbit@node1

En el nodo2, inicia la aplicación con el siguiente comando:

rabbitmqctl start_app

Deberías ver el siguiente resultado:

Starting node rabbit@node2 ...
 completed with 3 plugins.

En el nodo3, únete al clúster en el nodo1 ejecutando el siguiente comando:

rabbitmqctl join_cluster rabbit@node1

Deberías ver el siguiente resultado:

Clustering node rabbit@node3 with rabbit@node1

En el nodo3, inicia la aplicación con el siguiente comando:

rabbitmqctl start_app

Deberías ver la siguiente salida:

Starting node rabbit@node3 ...
 completed with 3 plugins.

Una vez que hayas terminado con éxito, comprueba el estado del clúster ejecutando el siguiente comando en el nodo1:

rabbitmqctl cluster_status

Deberías ver la siguiente salida:

Cluster status of node rabbit@node1 ...
Basics

Cluster name: rabbit@node3

Disk Nodes

rabbit@node1
rabbit@node2
rabbit@node3

Running Nodes

rabbit@node1
rabbit@node2
rabbit@node3

Versions

rabbit@node1: RabbitMQ 3.8.2 on Erlang 22.2.7
rabbit@node2: RabbitMQ 3.8.2 on Erlang 22.2.7
rabbit@node3: RabbitMQ 3.8.2 on Erlang 22.2.7

Alarms

(none)

Network Partitions

(none)

Listeners

Node: rabbit@node1, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node1, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node1, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node2, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node2, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node2, interface: [::], port: 15672, protocol: http, purpose: HTTP API
Node: rabbit@node3, interface: [::], port: 25672, protocol: clustering, purpose: inter-node and CLI tool communication
Node: rabbit@node3, interface: [::], port: 5672, protocol: amqp, purpose: AMQP 0-9-1 and AMQP 1.0
Node: rabbit@node3, interface: [::], port: 15672, protocol: http, purpose: HTTP API

Feature flags

Flag: drop_unroutable_metric, state: disabled
Flag: empty_basic_get_metric, state: disabled
Flag: implicit_default_bindings, state: enabled
Flag: quorum_queue, state: enabled
Flag: virtual_host_metadata, state: enabled

Configurar usuario administrador

A continuación, tendrás que crear un nuevo usuario administrador para el servidor RabbitMQ y eliminar el usuario «invitado» por defecto.

Puedes crear un nuevo usuario llamado «hitesh» y contraseña «password» ejecutando el siguiente comando en nodo1:

rabbitmqctl add_user hitesh password

Deberías ver la siguiente salida:

Adding user "hitesh" ...

A continuación, configura el usuario hitesh como administrador con el siguiente comando:

rabbitmqctl set_user_tags hitesh administrator

Deberías ver el siguiente resultado:

Setting tags for user "hitesh" to [administrator] ...

A continuación, concede al usuario hitesh permiso para modificar, escribir y leer todos los vhosts.

rabbitmqctl set_permissions -p / hitesh ".*" ".*" ".*"

Deberías ver el siguiente resultado:

Setting permissions for user "hitesh" in vhost "/" ...

A continuación, elimina el usuario invitado con el siguiente comando:

rabbitmqctl delete_user guest

Deberías obtener el siguiente comando:

Deleting user "guest" ...

Ahora puedes listar todos los usuarios con el siguiente comando:

rabbitmqctl list_users

Deberías obtener la siguiente salida:

Listing users ...
user	tags
hitesh	[administrator]

El usuario que has creado en el nodo1 se replicará automáticamente a todos los nodos del clúster.

Configuración de RabbitMQ Replicación de Colas

Por defecto, el contenido de una cola se encuentra en un único nodo. Por lo tanto, tendrás que configurar el clúster «política ha» para la réplica de colas y la replicación a todos los nodos del clúster.

Para ello, crea una política ha llamada ‘ha-all’ que reflejará todas las colas del cluster RabbitMQ a todos los nodos del cluster.

rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all"}'

Salida:

Setting policy "ha-all" for pattern ".*" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...

A continuación, crea una política ha llamada ‘ha-two’ en la que todas las colas cuyo nombre empiece por ‘two.’ se reflejarán en los dos nodos del clúster.

rabbitmqctl set_policy ha-two "^two\." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'

Resultado:

Setting policy "ha-two" for pattern "^two\." to "{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}" with priority "0" for vhost "/" ...

A continuación, crea una política de alta disponibilidad llamada ‘ha-nodos’ que contendrá todas las colas cuyo nombre empiece por ‘nodos’. Haremos una réplica en dos nodos concretos ‘nodo2’ y ‘nodo3’ del clúster.

rabbitmqctl set_policy ha-nodes "^nodes\." '{"ha-mode":"nodes","ha-params":["rabbit@node2", "rabbit@node3"]}'

Resultado:

Setting policy "ha-nodes" for pattern "^nodes\." to "{"ha-mode":"nodes","ha-params":["rabbit@node2", "rabbit@node3"]}" with priority "0" for vhost "/" ...

Ahora puedes listar todas las políticas configuradas ejecutando el siguiente comando:

rabbitmqctl list_policies;

Deberías ver la siguiente salida:

Listing policies for vhost "/" ...
vhost	name	pattern	apply-to	definition	priority
/	ha-all	.*	all	{"ha-mode":"all"}	0
/	ha-two	^two\.	all	{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}	0
/	ha-nodes	^nodes\.	all	{"ha-mode":"nodes","ha-params":["rabbit@node2","rabbit@node3"]}	0

Una vez que hayas terminado, puedes pasar al siguiente paso.

Acceder al Cluster RabbitMQ

Ahora puedes acceder a la interfaz web de RabbitMQ escribiendo la dirección IP de cualquier nodo en tu navegador web con el puerto 15672 como http://192.168.0.10:15672/. Deberías ver la página de inicio de sesión de RabbitMQ:

Inicio de sesión en RabbitMQ

Proporciona tu nombre de usuario y contraseña de administrador y pulsa el botón Iniciar sesión. Deberías ver el panel de RabbitMQ en la siguiente pantalla:

Panel de RabbitMQ

A continuación, haz clic en el menú de la pestaña«Admin«, y haz clic en el menú«Políticas«. Deberías ver todas las políticas de RabbitMQ ha que hemos creado en la siguiente pantalla:

Políticas de RabbitMQ

Conclusión

Enhorabuena! has configurado con éxito un clúster RabbitMQ de tres nodos en un servidor Ubuntu20.04. Ahora tu clúster comparte la información de configuración, incluyendo la topología y la información de seguridad en todos los nodos.

Scroll al inicio