MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment arrêter ou accélérer l'opération SST sur un cluster Galera

Le transfert d'instantané d'état (SST) est l'un des deux moyens utilisés par Galera pour effectuer la synchronisation initiale lorsqu'un nœud rejoint un cluster, jusqu'à ce que le nœud soit déclaré synchronisé et fasse partie du « composant principal ». En fonction de la taille de l'ensemble de données et de la charge de travail, SST peut être rapide comme l'éclair ou être une opération coûteuse qui mettra votre service de base de données à genoux.

Le SST peut être effectué en utilisant 3 méthodes différentes :

  • mysqldump
  • rsync (ou rsync_wan)
  • xtrabackup (ou xtrabackup-v2, mariabackup)

La plupart du temps, xtrabackup-v2 et mariabackup sont les options préférées. Nous voyons rarement des personnes s'exécuter sur rsync ou mysqldump dans les clusters de production.

Le problème

Lorsque SST est lancé, plusieurs processus sont déclenchés sur le nœud jointeur, qui sont exécutés par l'utilisateur "mysql" :

$ ps -fu mysql
UID         PID   PPID  C STIME TTY          TIME CMD
mysql    117814 129515  0 13:06 ?        00:00:00 /bin/bash -ue /usr//bin/wsrep_sst_xtrabackup-v2 --role donor --address 192.168.55.173:4444/xtrabackup_sst//1 --socket /var/lib/mysql/mysql.sock --datadir
mysql    120036 117814 15 13:06 ?        00:00:06 innobackupex --no-version-check --tmpdir=/tmp/tmp.pMmzIlZJwa --user=backupuser --password=x xxxxxxxxxxxxxx --socket=/var/lib/mysql/mysql.sock --galera-inf
mysql    120037 117814 19 13:06 ?        00:00:07 socat -u stdio TCP:192.168.55.173:4444
mysql    129515      1  1 Oct27 ?        01:11:46 /usr/sbin/mysqld --wsrep_start_position=7ce0e31f-aa46-11e7-abda-56d6a5318485:4949331

Sur le nœud donneur :

mysql     43733      1 14 Oct16 ?        03:28:47 /usr/sbin/mysqld --wsrep-new-cluster --wsrep_start_position=7ce0e31f-aa46-11e7-abda-56d6a5318485:272891
mysql     87092  43733  0 14:53 ?        00:00:00 /bin/bash -ue /usr//bin/wsrep_sst_xtrabackup-v2 --role donor --address 192.168.55.172:4444/xtrabackup_sst//1 --socket /var/lib/mysql/mysql.sock --datadir /var/lib/mysql/  --gtid 7ce0e31f-aa46-11e7-abda-56d6a5318485:2883115 --gtid-domain-id 0
mysql     88826  87092 30 14:53 ?        00:00:05 innobackupex --no-version-check --tmpdir=/tmp/tmp.LDdWzbHkkW --user=backupuser --password=x xxxxxxxxxxxxxx --socket=/var/lib/mysql/mysql.sock --galera-info --stream=xbstream /tmp/tmp.oXDumYf392
mysql     88827  87092 30 14:53 ?        00:00:05 socat -u stdio TCP:192.168.55.172:4444

SST contre un grand ensemble de données (des centaines de Go) n'est pas amusant. Selon le matériel, le réseau et la charge de travail, cela peut prendre des heures. Les ressources du serveur peuvent être saturées pendant l'opération. Bien que la limitation soit prise en charge dans SST (uniquement pour xtrabackup et mariabackup) à l'aide des options --rlimit et --use-memory, nous sommes toujours exposés à un cluster dégradé lorsque vous manquez de nœuds actifs majoritaires. Par exemple, si vous avez la malchance de vous retrouver avec un seul nœud sur trois en cours d'exécution. Par conséquent, il est conseillé d'effectuer le SST pendant les heures calmes. Vous pouvez cependant éviter SST en prenant certaines mesures manuelles, comme décrit dans cet article de blog.

Arrêter un SST

L'arrêt d'un SST doit être effectué à la fois sur les nœuds donneur et jointeur. Le menuisier déclenche SST après avoir déterminé la taille de l'écart lors de la comparaison du seqno Galera local avec le seqno du cluster. Il exécute la wsrep_sst_{wsrep_sst_method} commande. Cela sera choisi par le donateur choisi, qui commencera à diffuser des données vers le menuisier. Un nœud donneur n'a pas la capacité de refuser de servir le transfert d'instantané, une fois sélectionné par la communication de groupe Galera, ou par la valeur définie dans wsrep_sst_donor variable. Une fois que la synchronisation a commencé et que vous souhaitez annuler la décision, il n'y a pas de commande unique pour arrêter l'opération.

Le principe de base lors de l'arrêt d'un SST est de :

  • Faire en sorte que le membre ait l'air mort du point de vue de la communication du groupe Galera (arrêt, clôture, blocage, réinitialisation, débranchement du câble, liste noire, etc.)
  • Tuer les processus SST sur le donneur

On pourrait penser que tuer le processus innobackupex (kill -9 {innobackupex PID}) sur le donneur serait suffisant, mais ce n'est pas le cas. Si vous tuez les processus SST sur le donneur (ou le jointeur) sans clôturer le jointeur, Galera peut toujours voir le jointeur comme actif et marquera le processus SST comme incomplet, réapparaissant ainsi un nouvel ensemble de processus pour continuer ou recommencer. Vous serez de retour à la case départ. Il s'agit du comportement attendu du script /usr/bin/wsrep_sst_{method} pour protéger le fonctionnement SST qui est vulnérable aux délais d'attente (par exemple, s'il est long et gourmand en ressources).

Prenons un exemple. Nous avons un nœud de jointure en panne que nous aimerions rejoindre le cluster. Nous commencerions par exécuter la commande suivante sur le menuisier :

$ systemctl start mysql # or service mysql start

Une minute plus tard, nous avons découvert que l'opération était trop lourde à ce moment précis, et avons décidé de la reporter plus tard pendant les heures de faible trafic. Le moyen le plus simple d'arrêter une méthode SST basée sur xtrabackup consiste simplement à arrêter le nœud jointeur et à tuer les processus liés à SST sur le nœud donneur. Alternativement, vous pouvez également bloquer les ports entrants sur le menuisier en exécutant la commande iptables suivante sur le menuisier :

$ iptables -A INPUT -p tcp --dport 4444 -j DROP
$ iptables -A INPUT -p tcp --dport 4567:4568 -j DROP

Ensuite, sur le donneur, récupérez le PID des processus SST (listez les processus appartenant à l'utilisateur "mysql") :

$ ps -u mysql
   PID TTY          TIME CMD
117814 ?        00:00:00 wsrep_sst_xtrab
120036 ?        00:00:06 innobackupex
120037 ?        00:00:07 socat
129515 ?        01:11:47 mysqld

Enfin, tuez-les tous sauf le processus mysqld (vous devez faire extrêmement attention à ne PAS tuer le processus mysqld sur le donneur !) :

$ kill -9 117814 120036 120037

Ensuite, dans le journal des erreurs MySQL du donneur, vous devriez remarquer que la ligne suivante apparaît après environ 100 secondes :

2017-10-30 13:24:08 139722424837888 [Warning] WSREP: Could not find peer: 42b85e82-bd32-11e7-87ae-eff2b8dd2ea0
2017-10-30 13:24:08 139722424837888 [Warning] WSREP: 1.0 (192.168.55.172): State transfer to -1.-1 (left the group) failed: -32 (Broken pipe)

À ce stade, le donateur doit revenir à l'état "synchronisé" comme indiqué par wsrep_local_state_comment et le processus SST est complètement arrêté. Le donateur est de retour à son état opérationnel et est en mesure de servir les clients à pleine capacité.

Pour le processus de nettoyage sur le menuisier, vous pouvez simplement vider la chaîne iptables :

$ iptables -F

Ou supprimez simplement les règles avec l'indicateur -D :

$ iptables -D INPUT -p tcp --dport 4444 -j DROP
$ iptables -D INPUT -p tcp --dport 4567:4568 -j DROP

Une approche similaire peut être utilisée avec d'autres méthodes SST telles que rsync, mariabackup et mysqldump.

Limitation d'un SST (méthode xtrabackup uniquement)

En fonction de l'activité du donateur, il est judicieux de limiter le processus SST afin qu'il n'ait pas d'impact significatif sur le donateur. Nous avons vu un certain nombre de cas où, lors de pannes catastrophiques, les utilisateurs cherchaient désespérément à ramener un cluster défaillant sous la forme d'un seul nœud amorcé, et à laisser le reste des membres rattraper leur retard plus tard. Cette tentative réduit le temps d'arrêt du côté de l'application, cependant, elle crée une charge supplémentaire sur ce "cluster à un nœud", tandis que les membres restants sont toujours en panne ou en cours de récupération.

Xtrabackup peut être limité avec --throttle= pour limiter simplement le nombre d'opérations d'E/S si vous craignez qu'il ne sature vos disques, mais cette option n'est applicable que lors de l'exécution de xtrabackup en tant que processus de sauvegarde, pas en tant qu'opérateur SST. Des options similaires sont disponibles avec rlimit (limite de débit) et peuvent être combinées avec --use-memory pour limiter l'utilisation de la RAM. En configurant des valeurs sous la directive [sst] dans le fichier de configuration MySQL, nous pouvons nous assurer que l'opération SST n'imposera pas trop de charge au donneur, même si cela peut prendre plus de temps. Sur le nœud donneur, définissez ce qui suit :

[sst]
rlimit=128k
inno-apply-opts="--use-memory=200M"

Plus de détails sur la page de documentation Percona Xtrabackup SST.

Cependant, il y a un hic. Le processus peut être si lent qu'il ne rattrapera jamais les journaux de transactions qu'InnoDB écrit, de sorte que SST peut ne jamais se terminer. Généralement, cette situation est très rare, sauf si vous avez vraiment une charge de travail très intensive en écriture ou si vous allouez des ressources très limitées à SST.

Conclusion

SST est critique mais lourd, et pourrait potentiellement être une opération de longue durée en fonction de la taille de l'ensemble de données et du débit du réseau entre les nœuds. Quelles que soient les conséquences, il existe encore des possibilités d'arrêter l'opération afin que nous puissions avoir un meilleur plan de reprise à un meilleur moment.