Et voici le retour du lapin, Rabbitmq est un des moteurs de message queue les plus connus du marché. Gratuit bien sûr et opensource, cette technologie de plus en plus flexible permet de traiter différentes architectures. Dans cette nouvelle suite de tutorials, je vous propose de débuter rabbitmq.
Depuis plusieurs années, avec l’émergence des microservices et la modernisation des archiectures (event queuing, intégration de l’asynchrone…), les bus de messages ou queues de messages jouent un rôle fondamental. Par ailleurs avec l’arrivée de technologies facilitant le scaling (kubernetes, conteneurisation, compute dans le cloud etc), leur intégration devient comme une évidence. Ajouter des consommateurs de messages (consumers) par cette méthode n’est plus un problème grâce aux méthodes de first in first out.
Un des atouts de Rabbitmq c’est la facilité d’installation. Alors que le mode de haute disponibilité c’est accrue récemment avec notamment l’arrivée des quorum queues, Rabbitmq est une solution légère et très configurable. Kafka n’est pas aussi facile d’approche de ce côté, même si récemment la suppression d’un cluster zookeeper spécifique a donné un bon coup de pouce.
Rabbitmq apporte également différents modes de management comme l’interface graphique, son API ou encore la ligne de commande. Bref de sérieux atouts pour toutes les sysadmin, devops ou SRE en charge de gérer ce type de cluster.
Comment installer Rabbitmq ?
L’installation est très simple. Dans notre cas, nous le ferons sur une debian 11.2 en bullseye. Mais vous pouvez installer ce produit sur de nombreux OS (windows, MacOS) et autres distributions (redhat, ubuntu…).
Alors il faut savoir que Rabbitmq est développé sur un langage un peu moins courant : le Erlang. Eh oui c’est ainsi mais ce n’est pas pour autant que le produit n’est pas actif et qu’il est difficile à installer.
Donc premier pas, installons le dépôt APT pour erlang :
curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/gpg.E495BB49CC4BBE5B.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.cloudsmith.rabbitmq.E495BB49CC4BBE5B.gpg > /dev/null echo "deb [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.E495BB49CC4BBE5B.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-erlang/deb/debian bullseye main" | sudo tee -a /etc/apt/sources.list.d/rabbitmq.list
Ensuite même opération pour installer le dépôt apt pour rabbitmq :
curl -1sLf https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/gpg.9F4587F226208342.key | sudo gpg --dearmor | sudo tee /usr/share/keyrings/io.cloudsmith.rabbitmq.9F4587F226208342.gpg > /dev/null echo "deb [signed-by=/usr/share/keyrings/io.cloudsmith.rabbitmq.9F4587F226208342.gpg] https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/deb/debian bullseye main" | sudo tee -a /etc/apt/sources.list.d/rabbitmq.list
Derrière bien sûr nous allons enchainer avec une petite mise à jour de notre cache APT et l’installation d’un meta package pour erlang ainsi que rabbitmq-server.
sudo apt update sudo apt install -y erlang-nox rabbitmq-server dpkg -l | grep rabbitmq
Une autre méthode encore plus rapide est de directement télécharger le fichier .deb qui va faire sa petite installation trankilou :
sudo apt install erlang-nox wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.9.13/rabbitmq-server_3.9.13-1_all.deb sudo dpkg -i rabbitmq-server_3.9.13-1_all.deb
Ensuite on peu jeter un oeil à notre installation et vérifier que tout est bon.
sudo rabbitmq-diagnostics ping sudo rabbitmq-diagnostics status sudo rabbitmq-diagnostics cluster_status sudo rabbitmq-diagnostics environment
Enfin nous allons procéder à l’installation du plugin de management qui va nous permettre de bénéficier de l’interface graphique :
rabbitmq-plugins enable rabbitmq_management
Je vous propose maintenant de faire la même chose pour diposer de 3 serveurs rabbitmq au total car nous allons mettre en place notre cluster. Déroulez la même procédure y compris l’activation du plugin.
Installation du cluster rabbitmq
Bien maintenan on va installer notre premier cluster rabbitmq. Alors comme on débute on commence à se dire que c’est pas gagné et que l’on est partie pour une longue série de commandes dans la CLI.
Pas tout à fait car c’est extrêmement simple d’installer le cluster.
Première chose sur tous les noeuds du cluster nous allons permettre une écoute sur toutes les interfaces (vous pouvez restreindre bien sûr).
echo "YOATBIGKDHUSBLUSTOAW" | sudo tee /var/lib/rabbitmq/.erlang.cookie echo "listeners.tcp.1 = 0.0.0.0:5672" | sudo tee -a /etc/rabbitmq/rabbitmq.conf echo "management.tcp.port = 15672" | sudo tee -a /etc/rabbitmq/rabbitmq.conf systemctl restart rabbitmq-server
Notons que le port 15672 est le port de l’interface de management donc l’interface graphique.
Dans la première ligne nous avons définit le erlang cookie, c’est une sorte de token qui va permettre à tout nos noeuds de cluster de se vérifier et s’accepter.
Donc on applique tout cela sur chacune des machines.
Alors on peut ensuite préparer un utilisateur (xavki/password) et mettre en place quelques éléments relatifs à nos accès au cluster (on pourrait aussi le faire après la finalisation du cluster peu importe).
rabbitmqctl add_user xavki password
Par sécurité on peut aussi faire un
rabbitmqctl del_user guest
C’est un utilisateur par défaut c’est jamais terrible de les garder niveau sécurité ;).
Ajoutons des droits à notre utilisateur xavki :
rabbitmqctl set_permissions -p / xavki ".*" ".*" ".*"
et encore le statut d’adminitrateur via un tag :
rabbitmqctl set_user_tags xavki administrator
Bon ben on en finit avec la création de notre cluster en demandant aux serveurs 2 et 3 de rejoindre notre leader ou premier noeud, la vérification se faisant sur le erlang cookie :
rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@rmq1 rabbitmqctl start_app
Et enfin on peut vérifier les membres de notre cluster :
rabbitmqctl cluster_status --formatter=json | jq -r .running_nodes[]
Alors ce n’était pas compliqué.
Allez dans un prochain article, on s’amusera à mettre tout cela en place avec un bon Vagrantfile et un petit srcipt bash d’installation 🙂