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:
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:
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:
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.