Migration sans tracas de RabbitMQ vers Kubernetes

Migration sans tracas de RabbitMQ vers Kubernetes

RabbitMQ est un broker de messages Ă©crit en Erlang, qui permet d'organiser un cluster tolĂ©rant aux pannes avec rĂ©plication complĂšte des donnĂ©es sur plusieurs nƓuds, oĂč chaque nƓud peut traiter des requĂȘtes de lecture et d'Ă©criture. Avec de nombreux clusters Kubernetes en production, nous gĂ©rons un grand nombre d'installations de RabbitMQ et avons rencontrĂ© le besoin de migrer des donnĂ©es d'un cluster Ă  un autre sans temps d'arrĂȘt.

Cette opération était nécessaire dans au moins deux cas :

  1. Transférer des données d'un cluster RabbitMQ ne fonctionnant pas sous Kubernetes vers un nouveau cluster déjà 'kubernetisé' (c'est-à-dire fonctionnant dans des pods K8s).
  2. Migrer RabbitMQ au sein de Kubernetes d'un namespace à un autre (par exemple, si les contours sont délimités par des espaces de noms, pour transférer l'infrastructure d'un contour à un autre).

La recette proposĂ©e dans cet article est axĂ©e sur des situations (mais ne s'y limite pas) oĂč il existe un ancien cluster RabbitMQ (par exemple, avec 3 nƓuds), qui est soit dĂ©jĂ  dans K8s, soit sur d'anciens serveurs. Il est utilisĂ© par une application hĂ©bergĂ©e dans Kubernetes (dĂ©jĂ  lĂ  ou en perspective) :

Migration sans tracas de RabbitMQ vers Kubernetes


 et nous devons le migrer vers un nouvel environnement de production dans Kubernetes.

Nous allons d'abord dĂ©crire l'approche gĂ©nĂ©rale pour la migration, suivie des dĂ©tails techniques pour sa mise en Ɠuvre.

L'algorithme de migration

La premiĂšre Ă©tape, prĂ©liminaire, avant toute action, consiste Ă  vĂ©rifier que l'ancien dĂ©ploiement de RabbitMQ a le mode haute disponibilitĂ© activĂ© (HA). La raison est Ă©vidente : nous ne voulons pas perdre de donnĂ©es. Pour effectuer cette vĂ©rification, vous pouvez accĂ©der Ă  l'interface d'administration de RabbitMQ et, sous l'onglet Admin → Policies, vous assurer que la valeur est dĂ©finie sur ha-mode: all:

Migration sans tracas de RabbitMQ vers Kubernetes

L'Ă©tape suivante consiste Ă  dĂ©ployer un nouveau cluster RabbitMQ dans des pods Kubernetes (dans notre cas, par exemple, composĂ© de 3 nƓuds, mais leur nombre peut ĂȘtre diffĂ©rent).

AprĂšs cela, nous fusionnons l'ancien et le nouveau cluster RabbitMQ, formant un seul cluster (composĂ© de 6 nƓuds) :

Migration sans tracas de RabbitMQ vers Kubernetes

Le processus de synchronisation des donnĂ©es entre l'ancien et le nouveau cluster RabbitMQ est lancĂ©. Une fois que toutes les donnĂ©es sont synchronisĂ©es entre tous les nƓuds du cluster, nous pouvons rediriger l'application vers le nouveau cluster :

Migration sans tracas de RabbitMQ vers Kubernetes

AprĂšs ces opĂ©rations, il suffit de sortir les anciens nƓuds du cluster RabbitMQ, et le dĂ©mĂ©nagement peut ĂȘtre considĂ©rĂ© comme terminĂ© :

Migration sans tracas de RabbitMQ vers Kubernetes

Nous avons plusieurs fois appliqué ce schéma dans notre production. Cependant, pour notre propre commodité, nous l'avons réalisé au sein d'un systÚme spécialisé qui distribue des configurations types de RMQ sur de nombreux clusters Kubernetes. (pour ceux qui sont curieux : il s'agit de addon-operator, dont nous récemment, nous avons parlé). Ci-dessous, des instructions spécifiques seront présentées que chacun peut appliquer sur ses installations pour essayer la solution proposée en action.

Essayons en pratique

Exigences

Les prérequis sont trÚs simples :

  1. Un cluster Kubernetes (minikube conviendra aussi);
  2. Un cluster RabbitMQ (il peut ĂȘtre dĂ©ployĂ© sur du matĂ©riel nu ou créé comme un cluster normal dans Kubernetes Ă  partir du Helm chart officiel).

Pour l'exemple décrit ci-dessous, j'ai déployé RMQ dans Kubernetes et l'ai nommé rmq-old.

Préparation de l'environnement

1. Téléchargeons le Helm chart et modifions-le légÚrement :

helm fetch --untar stable/rabbitmq-ha

Pour notre commoditĂ©, dĂ©finissons un mot de passe, ErlangCookie et Ă©tablissons la politique ha-all, afin que par dĂ©faut, les files d'attente soient synchronisĂ©es entre tous les nƓuds du cluster RMQ :

rabbitmqPassword: guest
rabbitmqErlangCookie: mae9joopaol7aiVu3eechei2waiGa2we
definitions:
policies: |-
  {
    "name": "ha-all",
    "pattern": ".*",
    "vhost": "\/",
    "definition": {
      "ha-mode": "all",
      "ha-sync-mode": "automatic",
      "ha-sync-batch-size": 81920
    }
  }

2. Installons le chart :

helm install . --name rmq-old --namespace rmq-old

3. Connectons-nous à l'interface d'administration de RabbitMQ, créons une nouvelle file d'attente et ajoutons quelques messages. Ils seront nécessaires pour nous assurer qu'aprÚs la migration, toutes les données sont conservées et que rien n'est perdu :

Migration sans tracas de RabbitMQ vers Kubernetes

L'environnement de test est prĂȘt : nous avons un RabbitMQ « ancien » avec des donnĂ©es Ă  transfĂ©rer.

Migration du cluster RabbitMQ

1. Tout d'abord, dĂ©ployons un nouveau RabbitMQ dans un autre un espace de noms avec les mĂȘmes ErlangCookie et mot de passe pour l'utilisateur. Pour cela, exĂ©cutons les opĂ©rations dĂ©crites ci-dessus, en modifiant la commande finale d'installation de RMQ comme suit :

helm install . --name rmq-new --namespace rmq-new

2. Maintenant, il faut joindre le nouveau cluster Ă  l'ancien. Pour cela, nous entrons dans chacun des pod’ de du nouveau RabbitMQ et exĂ©cutons les commandes :

export OLD_RMQ=rabbit@rmq-old-rabbitmq-ha-0.rmq-old-rabbitmq-ha-discovery.rmq-old.svc.cluster.local && 
  rabbitmqctl stop_app && 
  rabbitmqctl join_cluster $OLD_RMQ && 
  rabbitmqctl start_app

Dans la variable OLD_RMQ indique l'adresse d'un des nƓuds de l'ancien cluster RMQ.

Ces commandes arrĂȘteront le nƓud actuel du nouveau du cluster RMQ, l'ajouteront Ă  l'ancien cluster et le redĂ©marreront.

3. Le cluster RMQ composĂ© de 6 nƓuds est prĂȘt :

Migration sans tracas de RabbitMQ vers Kubernetes

Vous devez attendre que les messages soient synchronisĂ©s entre tous les nƓuds. Il est facile de deviner que le temps de synchronisation des messages dĂ©pend de la puissance du matĂ©riel sur lequel le cluster est dĂ©ployĂ© et du nombre de messages. Dans le scĂ©nario dĂ©crit, il n'y en a que 10, donc les donnĂ©es se sont synchronisĂ©es instantanĂ©ment, mais avec un nombre de messages suffisamment Ă©levĂ©, la synchronisation peut durer des heures.

Alors, le statut de synchronisation :

Migration sans tracas de RabbitMQ vers Kubernetes

Ici +5 signifie que les messages se trouvent dĂ©jĂ  encore sur 5 nƓuds (en plus de celui indiquĂ© dans le champ NƓud). Ainsi, la synchronisation a rĂ©ussi.

4. Il ne reste plus qu'à changer l'adresse RMQ dans l'application pour le nouveau cluster (les actions spécifiques ici dépendent de la pile technologique que vous utilisez et d'autres spécificités de l'application), aprÚs quoi vous pouvez faire vos adieux au précédent.

Pour la derniĂšre opĂ©ration (c'est-Ă -dire le aprĂšs changement d'application vers le nouveau cluster), connectez-vous Ă  chaque nƓud de l'ancien du cluster et exĂ©cutez les commandes :

rabbitmqctl stop_app
rabbitmqctl reset

Le cluster a « oubliĂ© » les anciens nƓuds : vous pouvez supprimer l'ancien RMQ, ce qui conclura le dĂ©mĂ©nagement.

Remarque: Si vous utilisez RMQ avec des certificats, rien ne change fondamentalement — le processus de dĂ©mĂ©nagement se fera exactement de la mĂȘme maniĂšre.

Conclusions

Le schĂ©ma dĂ©crit convient pratiquement Ă  tous les cas oĂč nous devons transfĂ©rer RabbitMQ ou simplement dĂ©mĂ©nager vers un nouveau cluster.

Dans notre cas, des difficultĂ©s n'ont surgi qu'une fois, lorsque RMQ Ă©tait consultĂ© depuis de nombreux endroits, et nous n'avions pas la possibilitĂ© de changer l'adresse RMQ sur chacun d'eux. Alors, nous avons lancĂ© un nouveau RMQ dans le mĂȘme espace de noms avec les mĂȘmes Ă©tiquettes, afin qu'il s'intĂšgre aux services et Ingress existants, et en lançant le pod manuellement, nous avons manipulĂ© les Ă©tiquettes, en les supprimant d'abord pour que les requĂȘtes n'atteignent pas le RMQ vide, puis en les ajoutant Ă  nouveau aprĂšs la synchronisation des messages.

Nous avons appliquĂ© la mĂȘme stratĂ©gie lors de la mise Ă  jour de RabbitMQ vers une nouvelle version avec une configuration modifiĂ©e — tout a fonctionnĂ© comme sur des roulettes.

P.S.

Comme suite logique à ce matériau, nous préparons des articles sur MongoDB (migration d'un serveur physique vers Kubernetes) et MySQL (comment nous préparons ce SGBD dans Kubernetes). Ils seront publiés dans les mois à venir.

P.P.S.

Lisez aussi dans notre blog :

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster