Pivert's Blog

Remplacer un nœud MariaDB d’un cluster Galera


,
Reading Time: 3 minutes

Remplacer un nœud Galera est une opération particulièrement simple et rapide. Il n’y a que 2 fichiers à copier, et modifier l’IP et le hostname dans le second.

Contexte

  • Vous avez perdu un nœud, ou vous désirez réinstaller un nœud existant.
  • L’exemple se base sur un cluster Galera de 3 nœuds :
    • galera1 (192.168.10.51)
    • galera2 (192.168.10.52) : Le nœud à remplacer
    • galera3 (192.168.10.53)
  • Software :
    • Ubuntu 22.04.1 LTS
    • galera-4 (26.4.9-1build1)
    • mariadb-server-10.6 (1:10.6.7-2ubuntu1.1)

Prérequis

  • Votre cluster fonctionne toujours (puisque vous n’avez perdu qu’un seul nœud).
  • Vous pouvez accéder en « root » à au moins un des nœuds.
  • Dans l’exemple ci-dessous, les connections via le socket local sont autorisées en « root »
  • Le nœud à remplacer est supprimé et ne risque pas de reprendre l’IP ou d’essayer de se réintégrer au cluster.

Vérifications

mysql -uroot --execute="SHOW GLOBAL STATUS WHERE variable_name LIKE 'wsrep_%' OR variable_name LIKE 'innodb_rows%'" 

Vérifiez les variables suivantes :

| wsrep_desync_count            | 0
| wsrep_evs_state               | OPERATIONAL
| wsrep_local_state_comment     | Synced
| wsrep_cluster_weight          | 2
| wsrep_cluster_size            | 2
| wsrep_cluster_status          | Primary

Réinstallation

Hardware / Machine Virtuelle

Réinstallez le serveur avec les mêmes paramètres réseau et votre clef SSH.

galera2 infra

Dans l’exemple, j’utilise LXC pour une meilleure concentration et un volume SSD local (block) pour une performance optimale (« native »).

Logiciel

1. Connectez-vous sur le nouveau serveur « galera2 » et installez les paquets de la distribution
root@galera2:~# apt install auto-apt-proxy    # Uniquement si vous avez un proxy de type apt-cacher-ng dans le réseau local
root@galera2:~# apt update && apt upgrade -y && apt install mariadb-server mariadb-backup mariadb-client mycli galera-4 neovim
Remplacez le fichier de configuration de la DB depuis un nœud actif

Il se peut que le fichier utilisé soit différent sur votre installation, entre autre si vous utilisez MySQL au lieu de MariaDB, mais les configurations sont identiques. Vérifiez bien que le binlog_format soit à ROW. Voici un exemple :

root@galera2:~# grep -vE '^(#|$)' /etc/mysql/mariadb.conf.d/50-server.cnf
[server]
[mysqld]
user                    = mysql
pid-file                = /run/mysqld/mysqld.pid
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
lc-messages-dir         = /usr/share/mysql
lc-messages             = en_US
skip-external-locking
bind-address = 0.0.0.0
key_buffer_size        = 32M
max_allowed_packet     = 256M
max_connections        = 200
slow_query_log_file    = /var/log/mysql/mariadb-slow.log
log_bin                 = /var/log/mysql/mysql-bin.log
max_binlog_size         = 256M
binlog_format           = ROW
log-error               = /var/log/mysqld.log
default_storage_engine  = InnoDB
expire_logs_days    = 10
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci
innodb_buffer_pool_size = 1G
innodb_log_buffer_size = 8M
Recopiez et remplacez le fichier de configuration « /etc/mysql/mariadb.conf.d/60-galera.cnf » depuis un nœud actif, et adaptez les lignes “wsrep_node_address” et “wsrep_node_name”
#
# * Galera-related settings
#
# See the examples of server wsrep.cnf files in /usr/share/mysql
# and read more at https://mariadb.com/kb/en/galera-cluster/

[galera]
# Mandatory settings
wsrep_on                 = ON
wsrep_cluster_name       = "MariaDB Galera Cluster"
wsrep_cluster_address    = "gcomm://192.168.10.51,192.168.10.52,192.168.10.53"
wsrep_provider_options   = "evs.send_window=512;evs.user_send_window=512"
wsrep_provider           = /usr/lib/galera/libgalera_smm.so
innodb_autoinc_lock_mode = 2
wsrep_node_name          = galera1
wsrep_node_address       = "192.168.10.52"
wsrep_sst_method         = rsync

Démarrez et surveillez

Activez au boot et démarrez mariadb

root@galera2:~# systemctl restart mariadb && mysql -uroot --execute="SHOW GLOBAL STATUS WHERE variable_name LIKE 'wsrep_%' OR variable_name LIKE 'innodb_rows%'"

La commande peut prendre un peu de temps, car Galera va initier un « State Snapshot Transfer » (SST) pour copier la totalité de la DB via rsync. Vous devriez avoir :

| wsrep_local_state_comment     | Synced
| wsrep_cluster_weight          | 3 
| wsrep_cluster_size            | 3 
Activez au démarrage
systemctl enable mariadb

Astuces

Voilà, le nœud est remplacé en quelques minutes. Voici quelques commandes ou tests supplémentaires.

  • Si vous utilisez Prometheus, n’oubliez pas : apt install prometheus-node-exporter
  • Si vous utilisez le mysqld_exporter, réinstallez-le (https://github.com/prometheus/mysqld_exporter) ou copiez le binaire depuis un autre nœud
  • Vérifiez l’état des « Targets » dans Prometheus
  • SHOW DATABASES;
  • SELECT User, Host, Password FROM mysql.user;
  • Faites un test de connexion distante à la DB.
  • Vérifiez que le nœud est bien réintégré dans les « backends » de votre « load balancer ».
  • Si vous utilisez le mysqld_exporter et un « load balancer », vous pouvez ajouter le check : “mysql_global_status_wsrep_local_state == 4” en plus de check TCP sur le port 3306 pour définir la santé du « backend ».

Like it ?

Get notified on new posts (max 1 / month)
Soyez informés lors des prochains articles

Leave a Reply

Your email address will not be published. Required fields are marked *