Login Logout

Réplication MySQL avec Galera

Aperçu

Galera est un module de réplication synchrone et multi-master avec une tolérance de panne transparente. Il se base sur la Write-Set Replication API (wsrep API) de MySQL.

La réplication est totalement transparente pour l’application, aucun potentiel délai de réplication ou gestion des locks entre les serveurs n’est à prévoir. Cependant les tables non-transactionnelles de type MyISAM ne sont pas supportées par la réplication et ne seront donc pas répliquées !

Il est conseillé d’avoir au minimum 3 serveurs en cas de conflit de réplication, mais 2 peuvent suffire.

Documentation officielle (MariaDB ≥ 10.1) : https://mariadb.com/kb/en/library/galera-cluster/

Documentation officielle (MariaDB < 10.1) : http://galeracluster.com/documentation-webpages/gettingstarted.html

Installation

# apt install galera-3 mariadb-server rsync

Note : pour Debian jessie, il est nécessaire d’installer le paquet mariadb-galera-server. Depuis stretch, qui contient MariaDB 10.1, le plugin de réplication a été inclus dans le paquet de standard mariadb-server.

Configuration réseau

La réplication Galera utilise des ports réseau dédiés. Il est donc nécessaire d’autoriser les ports suivant dans les pare-feu des machines :

  • 4567/tcp, 4567/udp
  • 4568/tcp
  • 4444/tcp

Mise en place

Ajouter la configuration suivante dans le fichier /etc/mysql/mariadb.conf.d/galera.cnf, sur toutes les machines du cluster :

[mysqld]

# The following MySQL options are mandatory for Galera to work

bind-address=0.0.0.0

default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=<votre innodb_buffer_pool_size actuel + ~ 5% pour Galera>

binlog_format=ROW

# Galera cluster configuration

wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"

wsrep_cluster_name="<nom arbitraire du cluster"
wsrep_cluster_address="gcomm://<liste des adresses IP des machines du cluster, séparées par des virgules>"

wsrep_sst_method=rsync

wsrep_node_address="<adresse IP de la machine>"
wsrep_node_name="<nom de la machine>"
wsrep_retry_autocommit=4

Note : seul wsrep_node_address et wsrep_node_name sont différents d’une machine à l’autre.

Bien s’assurer que le fichier est lisible par MariaDB :

# chmod 644 /etc/mysql/mariadb.conf.d/galera.cnf

Ensuite pour initialiser le nouveau cluster, il est nécessaire de démarrer l’une des machines avec l’option --wsrep-new-cluster.

Avant tout, s’assurer que MySQL est éteint sur chaque serveur :

# /etc/init.d/mysql stop

MariaDB 10.1 (Debian stretch) vient avec le script galera_new_cluster, il est préférable de l’utiliser pour la première initialisation. À faire sur un des serveurs uniquement :

# galera_new_cluster

Pour les versions précédentes, on peut utiliser le script /usr/bin/mysqld_bootstrap :

# mysqld_bootstrap

Sur les autres serveurs, simplement démarrer MySQL de manière habituelle :

# /etc/init.d/mysql start

Administration

Vérifier l’état du cluster :

mysql> SHOW STATUS LIKE 'wsrep_%';
+---------------------------+------------+
| Variable_name             | Value      |
+---------------------------+------------+
...
| wsrep_local_state_comment | Synced (6) |
| wsrep_cluster_size        | 3          |
| wsrep_ready               | ON         |
+---------------------------+------------+

wsrep_cluster_size indique ici le nombre de machine dans le cluster.

Récupération d’un cluster complètement arrêté.

Dans certains cas, on peut se retrouver dans une situation ou tous les nœuds du cluster sont arrêtés et il devient impossible de rejoindre le cluster, car il n’existe plus.

Cela nécessite de réamorcer manuellement le cluster. Commencer par inspecter le fichier /var/lib/mysql/grastate.dat pour identifier le nœud qui contient la version la plus avancée de la base de donnée.

Si tous les nœuds ont bien été arrêtés, c’est donc le nœud avec le “seqno” le plus grand qui contient la dernière version de la base. C’est lui qui doit servir de point de départ.

Il se peut que seqno soit à -1. Dans ce cas-là, le nœud n’a pas été arrêté proprement. On peut alors récupérer le numéro de séquence avec la commande mysqld --wsrep-recover. L’information peut être récupéré dans /var/log/mysql/error.log

Voici les étapes pour réamorcer manuellement à partir du nœud le plus à jour:

  • Modifier /etc/mysql/mariadb.conf.d/galera.cnf pour définir wsrep_cluster_address="gcomm://"
  • Démarrer mariadb : systemctl start mariadb
  • Rétablir la configuration du cluster dans /etc/mysql/mariadb.conf.d/galera.cnf (Un redémarrage n’est pas nécessaire)

Après le démarrage correct du premier nœud, on peut démarrer un à un les autres nœuds du cluster