L'auteur a décidé que le Free and Open Source Fund recevrait une donation dans le cadre du programme Write for Donations.

Introduction

Créer des clusters ajoute une haute disponibilité à votre base de données en distribuant les modifications sur différents serveurs. En cas d'échec de l'une des instances, les autres sont rapidement disponibles pour continuer à servir.

Les clusters se présentent sous deux configurations générales, active-passive et active-active. Dans les clusters actifs-passifs, toutes les écritures sont effectuées sur un seul serveur actif, puis copiées sur un ou plusieurs serveurs passifs qui ne sont prêts à prendre le relais qu'en cas de défaillance d'un serveur actif. Certains clusters actifs-passifs permettent également les opérations SELECT sur les nœuds passifs. Dans un cluster actif-actif, chaque nœud est en lecture-écriture et une modification apportée à l'un d'entre eux est répliquée à tous.

MySQL est un système de gestion de base de données relationnelle open source très populaire pour les bases de données SQL. Galera est une solution de création de clusters pour bases de données qui permet de configurer des clusters multi-maîtres en utilisant la réplication synchrone. Galera gère automatiquement le maintien de la synchronisation des données sur les différents nœuds tout en vous permettant d'envoyer des requêtes en lecture et en écriture à n'importe lequel des nœuds du cluster. Vous pouvez en apprendre plus sur Galera sur la page de documentation officielle.

Dans ce guide, vous allez configurer un cluster MySQL Galera actif-actif. À des fins de démonstration, vous allez configurer et tester trois Droplets de Ubuntu 18.04 qui serviront de nœuds dans le cluster. Cette quantité de nœuds constitue le plus petit cluster configurable.

Conditions préalables

Pour poursuivre, vous aurez besoin d'un compte DigitalOcean, en plus des éléments suivants :

Bien que les étapes de ce tutoriel aient été écrites et testées pour les Droplets DigitalOcean, la plupart d'entre elles seront également applicables aux serveurs autres que DigitalOcean dotés d'un réseau privé activé.

Étape 1 - Ajoutez les référentiels MySQL à tous les serveurs

Au cours de cette étape, vous ajouterez les référentiels de packages MySQL et Galera pertinents à chacun de vos trois serveurs afin de pouvoir installer la bonne version de MySQL et Galera utilisée dans ce tutoriel.

Remarque : Codership, l'entreprise derrière Galera Cluster, gère le référentiel Galera, mais sachez que tous les référentiels externes ne sont pas fiables. Veillez à n'installer qu'à partir de sources fiables.

Dans ce tutoriel, vous utiliserez la version 5.7 de MySQL. Vous commencerez par ajouter le référentiel externe Ubuntu maintenu par le projet Galera à vos trois serveurs.

Une fois les référentiels mis à jour sur les trois serveurs, vous serez prêt à installer MySQL en même temps que Galera.

Tout d'abord, sur vos trois serveurs, ajoutez la clé du référentiel Galera avec la commande apt-key, que le gestionnaire de paquets APT utilisera pour vérifier que le paquet est authentique :

  • sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

Après quelques secondes, vous recevrez le résultat suivant :

Output
Executing: /tmp/apt-key-gpghome.RG5cTZjQo0/gpg.1.sh --keyserver keyserver.ubuntu.com --recv BC19DDBA gpg: key D669017EBC19DDBA: public key "Codership Oy <info@galeracluster.com>" imported gpg: Total number processed: 1 gpg: imported: 1

Une fois que vous avez ajouté la clé fiable dans la base de données de chaque serveur, vous pouvez ajouter les référentiels. Pour ce faire, créez un nouveau fichier appelé galera.list dans le répertoire /etc/apt/sources.list.d/ de chaque serveur :

  • sudo nano /etc/apt/sources.list.d/galera.list

Dans l'éditeur de texte, ajoutez les lignes suivantes, qui mettront les référentiels appropriés à la disposition du gestionnaire de paquets APT :

/etc/apt/sources.list.d/galera.list
deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main
deb http://releases.galeracluster.com/galera-3/ubuntu bionic main

Enregistrez et fermez les fichiers sur chaque serveur (appuyez sur CTRL + X, Y, puis ENTER).

Les référentiels Codership sont désormais disponibles pour vos trois serveurs. Cependant, il est important que vous demandiez à apt de préférer les référentiels de Codership aux autres afin de vous assurer qu'il installe les versions patchées des logiciels nécessaires à la création d'un cluster Galera. Pour ce faire, créez un autre nouveau fichier appelé galera.pref dans le répertoire /etc/apt/preferences.d/ de chaque serveur :

  • sudo nano /etc/apt/preferences.d/galera.pref

Ajoutez les lignes suivantes à l'éditeur de texte :

/etc/apt/preferences.d/galera.pref
# Prefer Codership repository
Package: *
Pin: origin releases.galeracluster.com
Pin-Priority: 1001

Enregistrez et fermez ce fichier, puis exécutez la commande suivante sur chaque serveur afin d'inclure les manifestes de paquets des nouveaux référentiels :

  • sudo apt update

Maintenant que vous avez ajouté avec succès le référentiel de paquets sur vos trois serveurs, vous êtes prêt à installer MySQL dans la section suivante.

Étape 2 - Installez MySQL sur tous les serveurs

Au cours de cette étape, vous installerez le package MySQL sur vos trois serveurs.

Exécutez la commande suivante sur les trois serveurs afin d'installer une version de MySQL patchée pour fonctionner avec Galera, ainsi que le package Galera.

  • sudo apt install galera-3 mysql-wsrep-5.7

Il vous sera demandé de confirmer si vous souhaitez procéder à l'installation. Tapez Y pour poursuivre l'installation. Lors de l'installation, il vous sera également demandé de définir un mot de passe pour l'utilisateur administratif de MySQL. Définissez un mot de passe fort et appuyez sur ENTER pour poursuivre.

Une fois MySQL installé, vous désactiverez le profil AppArmor par défaut pour garantir le bon fonctionnement de Galera, conformément à la documentation officielle de Galera. AppArmor est un module du noyau pour Linux qui fournit une fonctionnalité de contrôle d'accès aux services par le biais de profils de sécurité.

Désactivez AppArmor en exécutant l'action suivante sur chaque serveur :

  • sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

Cette commande ajoute un lien symbolique du profil MySQL au répertoire disable, qui désactive le profil au démarrage.

Ensuite, exécutez la commande suivante pour supprimer la définition de MySQL qui a déjà été chargée dans le noyau.

  • sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

Une fois que vous avez installé MySQL et désactivé le profil AppArmor sur votre premier serveur, répétez ces étapes pour vos deux autres serveurs.

Maintenant que vous avez installé MySQL avec succès sur chacun des trois serveurs, vous pouvez passer à l'étape de configuration dans la section suivante.

Étape 3 - Configurez le premier noeud

Au cours de cette étape, vous allez configurer votre premier nœud. Chaque nœud du cluster doit avoir une configuration presque identique. De ce fait, vous effectuerez toute la configuration sur votre première machine, puis vous la copierez sur les autres nœuds.

Par défaut, MySQL est configuré pour vérifier le répertoire /etc/mysql/conf.d afin d'obtenir des paramètres de configuration supplémentaires à partir des fichiers se terminant par .cnf. Sur votre premier serveur, créez un fichier dans ce répertoire avec toutes les directives spécifiques à votre cluster :

  • sudo nano /etc/mysql/conf.d/galera.cnf

Ajoutez la configuration suivante dans le fichier. La configuration spécifie différentes options de cluster, des détails sur le serveur actuel et les autres serveurs du cluster, ainsi que des paramètres liés à la réplication. Notez que les adresses IP dans la configuration sont les adresses privées de vos serveurs respectifs ; remplacez les lignes surlignées par les adresses IP appropriées.

/etc/mysql/conf.d/galera.cnf
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so

# Galera Cluster Configuration
wsrep_cluster_name="test_cluster"
wsrep_cluster_address="gcomm://First_Node_IP,Second_Node_IP,Third_Node_IP"

# Galera Synchronization Configuration
wsrep_sst_method=rsync

# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
  • La première section modifie ou réaffirme les paramètres de MySQL qui permettront au cluster de fonctionner correctement. Par exemple, Galera ne fonctionnera pas avec MyISAM ou d'autres moteurs de stockage non transactionnels similaires, et mysqld ne doit pas être lié à l'adresse IP de localhost. Vous pouvez en apprendre davantage sur les paramètres dans la page de configuration du système Galera Cluster.
  • La section “Galera Provider Configuration”configure les composants MySQL qui fournissent une API de réplication WriteSet. Dans votre cas, cela renvoie à Galera, puisque Galera est un fournisseur wsrep (WriteSet Replication) Vous spécifiez les paramètres généraux pour configurer l'environnement de réplication initial. Cela ne nécessite aucune personnalisation, mais vous pouvez en apprendre davantage sur les options de configuration de Galera dans la documentation.
  • La section “Galera Cluster Configuration” définit le cluster, identifiant les membres du cluster par adresse IP ou nom de domaine résolvant et créant un nom pour le cluster afin de garantir que les membres rejoignent le groupe approprié. Vous pouvez modifier wsrep_cluster_name pour quelque chose de plus significatif que test_cluster ou le laisser tel quel, mais vous devez mettre à jour wsrep_cluster_address avec les adresses IP privées de vos trois serveurs.
  • La section Galera Synchronization Configuration définit la façon dont le cluster communiquera et synchronisera les données entre les membres. Elle est uniquement utilisée pour le transfert d'état qui se produit lorsqu'un nœud est mis en ligne. Pour votre configuration initiale, vous utilisez rsync, car il est facilement disponible et permettra de faire ce dont vous aurez besoin pour l'instant.
  • La section Galera Node Configuration clarifie l'adresse IP et le nom du serveur actuel. C'est utile pour tenter de diagnostiquer les problèmes dans les journaux et pour référencer chaque serveur de multiples façons. La wsrep_node_address doit correspondre à l'adresse de la machine sur laquelle vous vous trouvez, mais vous pouvez choisir n'importe quel nom afin de vous aider à identifier le nœud dans les fichiers journaux.

Lorsque vous êtes satisfait de votre fichier de configuration du cluster, copiez le contenu dans votre presse-papiers, puis enregistrez et fermez le fichier.

Maintenant que vous avez configuré votre premier nœud avec succès, vous pouvez passer à la configuration des autres nœuds dans la section suivante.

Étape 4 - Configurez les noeuds restants

Au cours de cette étape, vous allez configurer les deux nœuds restants. Sur votre deuxième nœud, ouvrez le fichier de configuration :

  • sudo nano /etc/mysql/conf.d/galera.cnf

Collez la configuration que vous avez copiée du premier nœud, puis mettez à jour la Galera Node Configuration pour utiliser l'adresse IP ou le nom de domaine adapté au nœud spécifique que vous configurez. Enfin, mettez à jour son nom, que vous pouvez régler sur quoi que ce soit qui vous aidera à identifier le nœud dans vos fichiers journaux :

/etc/mysql/conf.d/galera.cnf
. . .
# Galera Node Configuration
wsrep_node_address="This_Node_IP"
wsrep_node_name="This_Node_Name"
. . .

Enregistrez et quittez le fichier.

Une fois que vous avez terminé ces étapes, répétez-les sur le troisième nœud.

Vous êtes presque prêt à mettre en place le cluster, mais avant cela, assurez-vous que les ports appropriés sont ouverts dans votre pare-feu.

Étape 5 - Ouvrez le pare-feu sur chaque serveur

Au cours de cette étape, vous configurerez votre pare-feu de manière à ce que les ports requis pour la communication entre les nœuds soient ouverts. Sur chaque serveur, vérifiez l'état du pare-feu en l'exécutant :

  • sudo ufw status

Dans ce cas, seuls les SSH sont autorisés à passer :

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

Comme seul le trafic SSH est autorisé dans ce cas, vous devrez ajouter des règles pour le trafic MySQL et Galera. Si vous tentiez de démarrer le cluster, il échouerait à cause de ces règles de pare-feu.

Galera peut utiliser quatre ports :

  • 3306 Pour les connexions client MySQL et le transfert d'instantanés d'état qui utilisent la méthode mysqldump.
  • 4567 Pour Pour le trafic de réplication de Galera Cluster. La réplication multidiffusion utilise à la fois le transport UDP et TCP sur ce port.
  • 4568 Pour le transfert progressif d'état.
  • 4444 Pour tous les autres transferts d'instantanés d'état

Dans cet exemple, vous allez ouvrir les quatre ports pendant que vous réalisez votre configuration. Une fois que vous avez confirmé que la réplication fonctionne, vous voudrez fermer les ports que vous n'utilisez pas et limiter le trafic aux seuls serveurs du cluster.

Ouvrez les ports à l'aide des commandes suivantes :

  • sudo ufw allow 3306,4567,4568,4444/tcp
  • sudo ufw allow 4567/udp

Remarque : en fonction de ce qui est exécuté par ailleurs sur vos serveurs, vous pourriez vouloir restreindre l'accès immédiatement. Le guide UFW Essentials : Règles et commandes communes pour les pare-feux peut vous être utile.

Après avoir configuré votre pare-feu sur le premier nœud, créez les mêmes paramètres de pare-feu sur le deuxième et le troisième nœud.

Maintenant que vous avez configuré les pare-feux avec succès, vous êtes prêt à lancer le cluster dans la prochaine étape.

Étape 6 - Démarrez le cluster

Au cours de cette étape, vous allez démarrer votre cluster MySQL Galera. Mais d'abord, vous allez activer le service MySQL systemd, de sorte que MySQL se lancera automatiquement à chaque fois que le serveur sera reconnecté.

Autorisez MySQL à se lancer au démarrage sur les trois serveurs

Utilisez la commande suivante sur les trois serveurs pour activer le service MySQL systemd :

  • sudo systemctl enable mysql

Vous verrez la sortie suivante, qui montre que le service a été lié avec succès à la liste des services de démarrage :

Output
Created symlink /etc/systemd/system/multi-user.target.wants/mysql.service → /lib/systemd/system/mysql.service.

Maintenant que vous avez autorisé mysql à se lancer au démarrage sur tous les serveurs, vous êtes prêt à procéder à la configuration du cluster.

Configurez le premier nœud

Pour configurer le premier nœud, vous devez utiliser un script de démarrage spécial. De la manière dont vous avez configuré votre cluster, chaque nœud mis en ligne essaiera de se connecter à au moins un autre nœud spécifié dans son fichier galera.cnf pour obtenir son état initial. Sans l'utilisation du script mysqld_bootstrap qui autorise systemd à accepter le paramètre --wsrep-new-cluster, un systemctl start mysql normal échouerait parce qu'il n'y a pas de nœuds en cours d'exécution auquel le premier nœud pourrait se connecter.

Exécutez ce qui suit sur votre premier serveur :

  • sudo mysqld_bootstrap

Cette commande n'affichera aucune sortie en cas d'exécution réussie. Lorsque ce script réussit, le nœud est enregistré comme faisant partie du cluster, et vous pouvez le voir avec la commande suivante :

  • mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Après avoir entré votre mot de passe, vous verrez le résultat suivant, indiquant qu'il y a un nœud dans le cluster :

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+

Sur les nœuds restants, vous pouvez lancer mysql normalement. Ils rechercheront n'importe quel membre de la liste du cluster qui est en ligne, et lorsqu'ils en trouveront un, ils rejoindront le cluster.

Configurez le deuxième nœud

Maintenant, vous pouvez configurer le deuxième nœud. Lancez mysql :

  • sudo systemctl start mysql

Aucune sortie ne sera affichée en cas d'exécution réussie. Vous verrez la taille de votre cluster augmenter à chaque fois qu'un nœud sera mis en ligne :

  • mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Vous verrez la sortie suivante indiquant que le deuxième nœud a rejoint le cluster et qu'il y a deux nœuds au total.

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+

Configurez le troisième nœud

Il est désormais temps de configurer le troisième nœud Lancez mysql :

  • sudo systemctl start mysql

Exécutez la commande suivante pour trouver la taille du cluster :

  • mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

Vous verrez la sortie suivante, qui indique que le troisième nœud a rejoint le cluster et que le nombre total de nœuds dans le cluster est de trois.

Output
+--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+

À ce stade, l'ensemble du cluster est en ligne et communique avec succès. Ensuite, vous pouvez vous assurer du bon fonctionnement de l'installation en testant la réplication dans la section suivante.

Étape 7 - Testez la réplication

Vous avez franchi les étapes précédentes pour que votre cluster puisse effectuer une réplication de n'importe quel nœud vers n'importe quel autre nœud, appelée réplication active-active. Au cours de cette étape, vous testerez et verrez si la réplication fonctionne comme prévu.

Écrivez au premier nœud

Vous commencerez par modifier la base de données sur votre premier nœud. Les commandes suivantes créeront une base de données appelée playground et une table, à l'intérieur de cette base de données, appelée equipment.

  • mysql -u root -p -e 'CREATE DATABASE playground;
  • CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));
  • INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");'

Dans la commande précédente, l'énoncé CREATE DATABASE crée une base de données appelée playground. L'énoncé CREATE crée une table nommée equipment à l'intérieur de la base de données playground et dotée d'une colonne d'identification auto-incrémentée appelée id ainsi que d'autres colonnes. Les colonnes type, quant et color sont définies pour stocker respectivement le type, la quantité et la couleur de l'équipement. L'énoncé INSERT insère une entrée de type slide, quantité 2 et couleur blue.

Vous avez maintenant une valeur dans votre table.

Lisez et Écrivez sur le deuxième nœud

Ensuite, regardez le deuxième nœud pour vérifier que la réplication fonctionne :

  • mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Les données que vous avez saisies sur le premier nœud seront visibles ici sur le deuxième, prouvant que la réplication fonctionne :

Output
+----+-------+-------+-------+ | id | type | quant | color | +----+-------+-------+-------+ | 1 | slide | 2 | blue | +----+-------+-------+-------+

À partir de ce même nœud, écrivez des données dans le cluster :

  • mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");'

Lisez et Écrivez sur le troisième noeud

À partir du troisième nœud, vous pouvez lire toutes ces données en interrogeant à nouveau la table :

  • mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Vous verrez la sortie suivante montrant les deux lignes :

Output
+----+-------+-------+--------+ | id | type | quant | color | +----+-------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | +----+-------+-------+--------+

Là encore, vous pouvez ajouter une autre valeur à partir de ce nœud :

  • mysql -u root -p -e 'INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");'

Lisez le premier nœud

De retour sur le premier nœud, vous pouvez vérifier que vos données sont disponibles partout :

  • mysql -u root -p -e 'SELECT * FROM playground.equipment;'

Vous verrez la sortie suivante, qui indique que les lignes sont disponibles sur le premier nœud.

Output
+----+--------+-------+--------+ | id | type | quant | color | +----+--------+-------+--------+ | 1 | slide | 2 | blue | | 2 | swing | 10 | yellow | | 3 | seesaw | 3 | green | +----+--------+-------+--------+

Vous avez maintenant vérifié avec succès que vous pouviez écrire sur tous les nœuds et que la réplication s'était effectuée correctement.

Conclusion

À ce stade, vous avez configuré une cluster de test Galera à trois nœuds en état de marche. Si vous envisagez d'utiliser un cluster Galera dans une situation de production, il est recommandé de commencer avec cinq nœuds minimum.

Avant de passer à la production, vous voudrez peut-être jeter un coup d'œil à certains autres agents de transfert instantané d'état (sst) comme xtrabackup , qui permet de mettre en place de nouveaux nœuds rapidement et sans grandes interruptions de vos nœuds actifs. Cela n'affecte pas la réplication réelle, mais constitue une préoccupation lorsque les nœuds sont initialisés.

Vous pourriez également être intéressé par d'autres solutions de création de cluster pour MySQL. Dans ce cas, vous pouvez consulter notre tutoriel Comment créer un cluster MySQL multi-noeuds sur Ubuntu 18.04. Si vous souhaitez essayer une solution de base de données gérée, consultez notre documentation Bases de données gérées DigitalOcean.

0 Comments

Creative Commons License