Comment configurer un cluster Galera avec MariaDB sur des serveurs Ubuntu 18.04

L'auteur a sélectionné lesFree and Open Source Fund pour recevoir un don dans le cadre du programmeWrite for DOnations.

introduction

Le clustering ajoute une haute disponibilité à votre base de données en distribuant les modifications à différents serveurs. En cas de défaillance d’une des instances, d’autres sont rapidement disponibles pour continuer à servir.

Les clusters sont disponibles en deux configurations générales,active-passive etactive-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 prendront le relais que dans le cas d'une défaillance du serveur actif. Certains clusters actifs-passifs autorisent également les opérationsSELECT sur des 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 pour tous.

MariaDB est un système de base de données relationnelle open source entièrement compatible avec le système SGBDR MySQL populaire. Vous pouvez lire la documentation officielle de MariaDB à cepage. Galera est une solution de mise en cluster de bases de données qui vous permet de configurer des clusters multimaître à l'aide de la réplication synchrone. Galera gère automatiquement la synchronisation des données de différents nœuds tout en vous permettant d'envoyer des requêtes de lecture et d'écriture à l'un des nœuds du cluster. Vous pouvez en savoir plus sur Galera sur le site officieldocumentation page.

Dans ce guide, vous allez configurer un cluster MariaDB Galera actif-actif. À des fins de démonstration, vous allez configurer et tester trois droplets Ubuntu 18.04 qui agiront en tant que nœuds dans le cluster. C'est le plus petit cluster configurable.

Conditions préalables

Pour suivre, vous aurez besoin d'unDigitalOcean account, en plus des éléments suivants:

  • Trois Droplets Ubuntu 18.04 avec mise en réseau privée activée, chacune avec un utilisateur non root avec les privilègessudo.

Bien que les étapes de ce didacticiel aient été écrites et testées contre les gouttelettes DigitalOcean, la plupart d'entre elles devraient également s'appliquer aux serveurs non-DigitalOcean avec la mise en réseau privée activée.

[[step-1 -—- ajoutant-the-mariadb-repositories-to-all-servers]] == Étape 1 - Ajout des référentiels MariaDB à tous les serveurs

Au cours de cette étape, vous allez ajouter les référentiels de packages MariaDB appropriés à chacun de vos trois serveurs afin de pouvoir installer la bonne version de MariaDB utilisée dans ce didacticiel. Une fois les référentiels mis à jour sur les trois serveurs, vous serez prêt à installer MariaDB.

Une chose à noter à propos de MariaDB est qu'elle a été créée en tant que remplacement de MySQL, donc dans de nombreux fichiers de configuration et scripts de démarrage, vous verrezmysql plutôt quemariadb. Pour des raisons de cohérence, nous utiliseronsmysql dans ce guide où l'un ou l'autre pourrait fonctionner.

Dans ce didacticiel, vous utiliserezMariaDB version 10.4. Comme cette version n’est pas incluse dans les référentiels Ubuntu par défaut, vous commencerez par ajouter le référentiel Ubuntu externe géré par le projet MariaDB à vos trois serveurs.

[.note] #Note: MariaDB est un fournisseur très respecté, mais tous les référentiels externes ne sont pas fiables. Veillez à installer uniquement à partir de sources fiables.
#

Tout d'abord, vous allez ajouter la clé du référentiel MariaDB avec la commandeapt-key, que le gestionnaire de packages APT utilisera pour vérifier que le package est authentique:

sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8

Une fois que vous avez la clé de confiance dans la base de données, vous pouvez ajouter le référentiel avec la commande suivante:

sudo add-apt-repository 'deb [arch=amd64] http://nyc2.mirrors.digitalocean.com/mariadb/repo/10.4/ubuntu bionic main'

Après avoir ajouté le référentiel, exécutezapt update afin d'inclure les manifestes de package du nouveau référentiel:

sudo apt update

Une fois que vous avez terminé cette étape sur votre premier serveur, recommencez pour les deuxième et troisième serveurs.

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

[[step-2 -—- Installing-mariadb-on-all-servers]] == Étape 2 - Installation de MariaDB sur tous les serveurs

Dans cette étape, vous allez installer les packages MariaDB réels sur vos trois serveurs.

À partir de la version10.1, les packages MariaDB Server et MariaDB Galera Server sont combinés, donc l'installation demariadb-server installera automatiquement Galera et plusieurs dépendances:

sudo apt install mariadb-server

Vous serez invité à confirmer si vous souhaitez procéder à l'installation. Entrezyes pour continuer l'installation.

À partir de la version10.4 de MariaDB, l'utilisateur MariaDB deroot n'a pas de mot de passe par défaut. Pour définir un mot de passe pour l'utilisateurroot, commencez par vous connecter à MariaDB:

sudo mysql -uroot

Une fois dans le shell MariaDB, modifiez le mot de passe en exécutant l'instruction suivante:

set password = password("your_password");

Vous verrez la sortie suivante indiquant que le mot de passe a été défini correctement:

OutputQuery OK, 0 rows affected (0.001 sec)

Quittez le shell MariaDB en exécutant la commande suivante:

quit;

Si vous souhaitez en savoir plus sur SQL ou avoir besoin d'un rappel rapide, consultez nosMySQL tutorial.

Vous disposez désormais de tous les éléments nécessaires pour commencer à configurer le cluster, mais comme vous comptez surrsync dans les étapes ultérieures, assurez-vous qu'il est installé:

sudo apt install rsync

Cela confirmera que la dernière version dersync est déjà disponible ou vous invitera à la mettre à niveau ou à l'installer.

Une fois que vous avez installé MariaDB et défini le mot de passe root sur votre premier serveur, répétez ces étapes pour vos deux autres serveurs.

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

[[step-3 -—- configuration-the-first-node]] == Étape 3 - Configuration du premier nœud

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

Par défaut, MariaDB est configuré pour vérifier le répertoire/etc/mysql/conf.d pour obtenir des paramètres de configuration supplémentaires à partir des fichiers se terminant par.cnf. Créez un fichier dans ce répertoire avec toutes vos directives spécifiques au 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 de la configuration sont les adresses privées de vos serveurs respectifs. remplacez les lignes en surbrillance 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"
  • The first section modifie ou réaffirme les paramètres MariaDB / MySQL qui permettront au cluster de fonctionner correctement. Par exemple, Galera ne fonctionnera pas avec MyISAM ou des moteurs de stockage non transactionnels similaires, etmysqld ne doit pas être lié à l’adresse IP delocalhost. Vous pouvez en savoir plus sur les paramètres plus en détail sur Galera Clustersystem configuration page.

  • The “Galera Provider Configuration” section configure les composants MariaDB qui fournissent une API de réplication WriteSet. Cela signifie Galera dans votre cas, puisque Galera est un fournisseurwsrep (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 savoir plus surGalera configuration options.

  • The “Galera Cluster Configuration” section définit le cluster, identifiant les membres du cluster par adresse IP ou nom de domaine résoluble et créant un nom pour le cluster afin de garantir que les membres rejoignent le groupe approprié. Vous pouvez changer leswsrep_cluster_name en quelque chose de plus significatif quetest_cluster ou le laisser tel quel, mais vous devez mettre à jourwsrep_cluster_address avec les adresses IP privées de vos trois serveurs.

  • The “Galera Synchronization Configuration” section définit comment le cluster communiquera et synchronisera les données entre les membres. Ceci est utilisé uniquement pour le transfert d'état qui se produit lorsqu'un nœud est mis en ligne. Pour votre configuration initiale, vous utilisezrsync, car il est couramment disponible et fait ce dont vous aurez besoin pour le moment.

  • The “Galera Node Configuration” section clarifie l'adresse IP et le nom du serveur actuel. Cela s'avère utile lorsque vous essayez de diagnostiquer des problèmes dans les journaux et de référencer chaque serveur de plusieurs manières. Leswsrep_node_address doivent correspondre à l’adresse de la machine sur laquelle vous vous trouvez, mais vous pouvez choisir le nom de votre choix pour vous aider à identifier le nœud dans les fichiers journaux.

Lorsque vous êtes satisfait du fichier de configuration du cluster, copiez le contenu dans le Presse-papiers, enregistrez et fermez le fichier. Avec l'éditeur de texte nano, vous pouvez le faire en appuyant surCTRL+X, en tapanty et en appuyant surENTER.

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

[[step-4 -—- configurer-les-nœuds-restants]] == Étape 4 - Configurer les nœuds restants

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

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

Collez la configuration que vous avez copiée à partir du premier nœud, puis mettez à jour lesGalera Node Configuration pour utiliser l’adresse IP ou le nom de domaine résoluble pour le nœud spécifique que vous configurez. Enfin, mettez à jour son nom, que vous pouvez définir comme bon vous semble pour 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 ces étapes terminées, répétez-les sur le troisième nœud.

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

[[step-5 -—- opening-the-firewall-on-every-server]] == Étape 5 - Ouverture du pare-feu sur chaque serveur

Dans cette étape, vous allez configurer votre pare-feu pour que les ports requis pour la communication entre nœuds soient ouverts. Sur chaque serveur, vérifiez l'état du pare-feu en exécutant:

sudo ufw status

Dans ce cas, seul SSH est autorisé via:

OutputStatus: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Etant donné que seul le trafic SSH est autorisé dans ce cas, vous devrez ajouter des règles pour le trafic MySQL et Galera. Si vous essayez de démarrer le cluster, cela échouera à cause des règles de pare-feu.

Galera peut utiliser quatre ports:

  • 3306 Pour les connexions client MySQL et le transfert de snapshot d'état utilisant la méthodemysqldump.

  • 4567 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 d'état incrémentiel.

  • 4444 Pour tous les autres transferts de snapshot d'état.

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

Ouvrez les ports avec la commande suivante:

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

[.note] #Note: En fonction de ce qui est en cours d'exécution sur vos serveurs, vous souhaiterez peut-être restreindre l'accès immédiatement. Le guideUFW Essentials: Common Firewall Rules and Commands peut vous aider.
#

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

Maintenant que vous avez configuré les pare-feu avec succès, vous êtes prêt à démarrer le cluster à l’étape suivante.

[[step-6 -—- starting-the-cluster]] == Étape 6 - Démarrage du cluster

Dans cette étape, vous allez démarrer votre cluster MariaDB. Pour commencer, vous devez arrêter le service MariaDB en cours d'exécution afin de pouvoir mettre votre cluster en ligne.

Arrêtez MariaDB sur les trois serveurs

Utilisez la commande suivante sur les trois serveurs pour arrêter MariaDB afin de pouvoir les restaurer dans un cluster:

sudo systemctl stop mysql

systemctl n'affiche pas le résultat de toutes les commandes de gestion de service, donc pour être sûr que vous avez réussi, utilisez la commande suivante:

sudo systemctl status mysql

Si la dernière ligne ressemble à ce qui suit, la commande a réussi:

Output. . .
Apr 26 03:34:23 galera-node-01 systemd[1]: Stopped MariaDB 10.4.4 database server.

Une fois que vous avez arrêtémysql sur tous les serveurs, vous êtes prêt à continuer.

Afficher le premier nœud

Pour faire apparaître 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 qui se met en ligne tente de se connecter à au moins un autre nœud spécifié dans son fichiergalera.cnf pour obtenir son état initial. Sans utiliser le scriptgalera_new_cluster qui permet à systemd de passer le paramètre--wsrep-new-cluster, unsystemctl start mysql normal échouerait car il n'y a aucun nœud en cours d'exécution pour le premier nœud auquel se connecter.

sudo galera_new_cluster

Cette commande n'affiche aucune sortie en cas d'exécution réussie. Lorsque ce script réussit, le nœud est enregistré en tant que partie du cluster et vous pouvez le voir à l'aide de la commande suivante:

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

Vous verrez la sortie suivante 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 démarrermysql normalement. Ils rechercheront n'importe quel membre de la liste de grappes en ligne. Ainsi, lorsqu'ils en trouveront une, ils rejoindront la grappe.

Amener le deuxième nœud

Maintenant, vous pouvez faire apparaître le deuxième noeud. Débutmysql:

sudo systemctl start mysql

Aucune sortie ne sera affichée lors d'une exécution réussie. Vous verrez la taille de votre cluster augmenter à chaque mise en ligne de chaque nœud:

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

La sortie suivante indique 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     |
+--------------------+-------+

Amener le troisième nœud

Il est maintenant temps de faire apparaître le troisième nœud. Débutmysql:

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 que la configuration est opérationnelle en testant la réplication dans la section suivante.

[[step-7 -—- testing-replication]] == Étape 7 - Test de la réplication

Vous avez suivi toutes les étapes jusqu'à ce que votre cluster puisse effectuer la réplication d'un nœud vers un autre, appelée réplication active-active. Suivez les étapes ci-dessous pour tester et voir si la réplication fonctionne comme prévu.

Écrire au premier nœud

Vous commencerez par apporter des modifications à la base de données sur votre premier noeud. Les commandes suivantes créeront une base de données appeléeplayground et une table à l'intérieur de cette base de données appeléeequipment.

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'instructionCREATE DATABASE crée une base de données nomméeplayground. L'instructionCREATE crée une table nomméeequipment dans la base de donnéesplayground ayant une colonne d'identifiant auto-incrémentée appeléeid et d'autres colonnes. La colonnetype, la colonnequant et la colonnecolor sont définies pour stocker respectivement le type, la quantité et la couleur de l'équipement. L'instructionINSERT insère une entrée de typeslide, quantité2 et couleurblue.

Vous avez maintenant une valeur dans votre table.

Lire et écrire sur le deuxième nœud

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

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

Si la réplication fonctionne, les données que vous avez entrées sur le premier nœud seront visibles ici sur le second:

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

À partir de ce même nœud, vous pouvez écrire des données sur le cluster:

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

Lire et écrire sur le troisième nœud

À 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 |
   +----+-------+-------+--------+

De nouveau, 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 sur le premier noeud:

De retour sur le premier noeud, 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 vérifié que vous pouvez écrire sur tous les nœuds et que la réplication est correctement effectuée.

Conclusion

À ce stade, vous avez un cluster de test Galera à trois nœuds configuré. Si vous envisagez d’utiliser un cluster Galera en situation de production, il est recommandé de commencer par au moins cinq nœuds.

Avant l'utilisation en production, vous voudrez peut-être jeter un coup d'œil à certains desother state snapshot transfer (sst) agents commextrabackup, qui vous permettent de configurer de nouveaux nœuds très rapidement et sans interruptions importantes de vos nœuds actifs. Cela n'affecte pas la réplication réelle, mais constitue un problème lorsque les noeuds sont en cours d'initialisation.

Vous pourriez également être intéressé par d'autres solutions de clustering telles que le cluster MySQL, auquel cas vous pouvez consulter notre tutoriel tutorielHow To Create a Multi-Node MySQL Cluster on Ubuntu 18.04.