MySQL NDB Cluster est une version haute disponibilité et haute redondance de MySQL adaptée à l’environnement informatique distribué.
Pour cela, il utilise le moteur de table NDBCluster disponible pour Windows, Linux, Mac OS X et Solaris.
A partir de là, vous pouvez mettre en place plusieurs serveurs SQL qui vont stocker et répartir les données sur plusieurs serveurs.
En combinant vos serveurs SQL, vous réduisez les temps d’indisponibilité, car si un serveur tombe en panne, un autre prend le relai.
Ce tutoriel vous présente le cluster MySQL NDB.
Comment installer et configurer un cluster MySQL NDB sur Debian 10.
Table des matières
Introduction au cluster MySQL NDB
NDB Cluster est une technologie qui permet la mise en cluster de bases de données en mémoire dans un système sans partage.
L’architecture sans partage permet au système de fonctionner avec du matériel très bon marché et avec un minimum d’exigences spécifiques en matière de matériel ou de logiciel.
Cela va donc plus loin qu’un cluster MySQL maitre/esclave puisqu’il s’agir d’une réplication synchrone.
Ainsi, cela permet de répondre aux exigences suivantes :
- Éviter les défaillances et limiter les pertes de données
- Meilleurs tolérance aux pannes
- Limiter les interruptions de services
- Haute disponibilité de service de 24/7
- Faciliter d’administration : aucun besoin d’importer/exporter les bases lors d’un changement de serveurs
Voici un exemple d’architecture de cluster NDB MySQL.
Les noeuds SQL répliquent les données entre chaque serveur MySQL.
On peut aussi créer des groupes de clusters avec une redondance des données.
MySQL NDB Cluster se compose de deux trois principaux composants qui fonctionnent ensemble pour former le cluster MySQL.
Composant | Description | Port réseau | Service / Daemon |
Gestionnaire de cluster NDB | Gère le cluster NDB MySQL | 186 (TCP) | ndb_mgmd |
Nœuds SQL | Serveur MySQL classique mais avec une version spécifique cluster | 3306 (TCP) | mysqld |
Nœuds de données (Data Node) | Stocke les données SQL | ndbd ou ndbmtd |
Voici une description en plus détaillée :
- Nœud de gestion – NDB_MGMD / MGM : Le serveur de gestion de cluster est utilisé pour gérer l’autre nœud du cluster. Nous pouvons créer et configurer de nouveaux nœuds, redémarrer, supprimer ou sauvegarder des nœuds sur le cluster à partir du nœud de gestion. : Nœuds de données – NDBD / NDB
C’est la couche où se déroule le processus de synchronisation et de réplication des données entre les nœuds. - Nœuds SQL – MySQLD / API : Les serveurs d’interface utilisés par les applications pour se connecter au cluster de bases de données.
Les programmes exécutables appropriés doivent être installés sur chaque ordinateur hôte du cluster NDB :
- Un hôte exécutant un nœud SQL doit y avoir installé un binaire MySQL Server (mysqld)
- Les nœuds de gestion nécessitent le démon du serveur de gestion (ndb_mgmd)
- Les nœuds de données nécessitent le démon de nœud de données (ndbd ou ndbmtd)
- Il n’est pas nécessaire d’installer le binaire MySQL Server sur les hôtes de noeud de gestion et les hôtes de noeud de données
- Il est recommandé d’installer également le client de gestion (ndb_mgm) sur l’hôte du serveur de gestion
Pour pallier aux défaillances du cluster, il faut installer au minimum de deux serveurs MySQL NDB Cluster.
Ainsi si l’un tombe, l’autre continue de tourner.
Installer MySQL NDB Cluster sur Debian 10
Liens de téléchargement des binaires MySQL NDB Cluster
A l’heure où sont écrites ces lignes, les paquets ne sont pas encore disponibles dans les dépôts Debian.
Ainsi, il faut télécharger les paquets et les installer manuellement avec dpkg.
Dans ce tutoriel, je donne les liens avec wget mais avec le temps les versions vont changer donc il vaut mieux les télécharger manuellement.
Ensuite vous les transférez sur chaque serveur avec SCP par exemple pour utiliser dpkg.
Voici le lien de téléchargement où on choisit le système d’exploitation, en l’occurrence Debian Linux :
Règles iptables et firewall
Voici un exemple de règles iptables à utiliser afin de permettre la communication réseau entre chaque noeud du cluster MySQL.
Dans ce tutoriel, nous forçons les ports réseaux 1186 et 11100 qu’il faut autoriser.
Adaptez les variables suivantes :
- mysql_ip permet d’indiquer les adresses IP des noeuds MySQL
- local : l’interface réseau utilisée pour les connexions réseaux
mysql_ip="37.187.XXX,51.210.XXX"
local=eth0
for ip in echo $mysql_ip
do
iptables -A INPUT -i $local -m state --state NEW,ESTABLISHED,RELATED -s $ip -p tcp -m multiport --dport 1186,11100 -j ACCEPT
iptables -A OUTPUT -o $local -m state --state ESTABLISHED,RELATED -d $ip -p tcp -m multiport --sport 1186,11100 -j ACCEPT
iptables -A INPUT -i $local -m state --state ESTABLISHED,RELATED -s $ip -p tcp -m multiport --sport 1186,11100 -j ACCEPT
iptables -A OUTPUT -o $local -m state --state NEW,ESTABLISHED,RELATED -d $ip -p tcp -m multiport --dports 1186,11100 -j ACCEPT
iptables -A INPUT -i $local -m state --state ESTABLISHED,RELATED -s $ip -p tcp --sport 30000:59000 -j ACCEPT
iptables -A OUTPUT -o $local -m state --state NEW,ESTABLISHED,RELATED -d $ip -p tcp --dport 30000:59000 -j ACCEPT
iptables -A INPUT -i $local -m state --state NEW,ESTABLISHED,RELATED -s $ip -p tcp --sport 30000:59000 -j ACCEPT
iptables -A OUTPUT -o $local -m state --state ESTABLISHED,RELATED -d $ip -p tcp --dport 30000:59000 -j ACCEPT
done
Mettez en place ces règles iptables sur chaque noeud.
Installer et configurer MySQL NDB MGMD
Pour commencer, on installe le noeud de gestion NDBD (NDB Cluster Management Server Daemon).
sudo apt-get install libmecab2 libnuma1
cd /tmp/
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-8.0/mysql-common_8.0.23-1debian10_amd64.deb
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-8.0/mysql-common_8.0.23-1debian10_amd64.deb
dpkg -i /mysql-common_8.0.23-1debian10_amd64.deb
Ensuite on créé le répertoire /var/lib/mysql-cluster puis le fichier config.ini avec la configuration du cluster.
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vim config.ini
Puis inspirez vous de ce fichier de configuration config.ini qu’il faut modifier selon votre installation :
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=1G
[NDB_MGMD DEFAULT]
DataDir=/var/lib/mysql-cluster
[TCP DEFAULT]
[NDB_MGMD]
NodeId=1
HostName=37.187.xxx
DataDir=/var/lib/mysql-cluster
PortNumber = 1286
[NDBD]
NodeId=10
HostName=51.210.xxx
DataDir=/data-local/mysql
ServerPort = 11100
[NDBD]
NodeId=11
HostName=51.91xxx
DataDir=/home/mysql
ServerPort = 11100
[MYSQLD]
NodeID=20
HostName=51.210.xxx
[MYSQLD]
NodeID=21
HostName=51.91.xxxx
Voici quelques explications sur les sections du fichier de configuration MySQL NDB :
- NoOfReplicas — Définit le nombre de répliques de fragments pour chaque table stockée dans le cluster. Ce paramètre spécifie également la taille des groupes de nœuds. Un groupe de nœuds est un ensemble de nœuds stockant tous les mêmes informations
- [TCP DEFAULT] — Dans cette section, vous pouvez spécifier les tailles de buffer, etc.
- [NDB_MGMD] — La configuration d’un noeud de serveur de gestion avec le numéro du noeud, son adresse IP, et dossier de données et éventuellement forcer le port de connexion
- [NDBD] — La configuration d’un noeud de données avec son adresse IP, dossier de données et éventuellement le port
- [MYSQLD] — La configuration MySQL API, vous pouvez laisser vide. Cependant, il faut créer autant de section que de [MYSQLD] souhaité, si vous ne spécifiez pas les ID, MySQL les attribuera automatiquement
Retrouvez les paramètres et options complets dans la documentation officielle : Overview of NDB Cluster Configuration Parameters, Options, and Variables
Répétez l’opération sur chaque serveurs qui feront office de noeud de gestion NDB.
Enfin on initialise chaque serveur de gestion du cluster :
ndb_mgmd -f /var/lib/mysql-cluster/config.ini --configdir=/var/lib/mysql-cluster/ --initial
Installer les noeuds de données MySQL NDB
Puis on peut passer à l’installation des noeuds de données (data node).
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-8.0/mysql-cluster-community-data-node_8.0.23-1debian10_amd64.deb
wget https://dev.mysql.com/get/Downloads/MySQL-Cluster-8.0/mysql-cluster-community-data-node-dbgsym_8.0.23-1debian10_amd64.deb
Puis on installe les paquets mysql-cluster avec les dépendances qui vont bien :
apt-get install libclass-methodmaker-perl
dpkg -i mysql-cluster-community-data-node_8.0.23-1debian10_amd64.deb
mysql-cluster-community-data-node-dbgsym_8.0.23-1debian10_amd64.deb
Ensuite on édite la configuration de MySQL /etc/mysql/conf.d/mysql.cnf en indiquant :
- Que l’on utilise le moteur de table ndbcluster avec le paramètre ndbcluster
- On indique les noeuds de gestion du cluster à travers ndb-connectstring.
[MYSQLD]
ndbcluster #pour utiliser moteur de table de table NDB Cluster
ndb-connectstring=51.210.214.71 #le serveur de gestion ndbd
[MYSQL_CLUSTER]
ndb-connectstring=51.210.214.71
Enfin on initialise le nœuds de donnée MySQL :
cd /var/lib/mysql-cluster
ndbd --initial
Si tout va bien, votre noeud de données est maintenant actif.
Installer un noeud SQL
Le nom SQL est un serveur MySQL classique avec une version particulière.
Vos applications s’y connectent pour effectuer les requêtes SQL.
dpkg -i mysql-cluster-community-server_8.0.23-1debian10_amd64.deb
dpkg -i mysql-cluster-community-server-core_8.0.23-1debian10_amd64.deb
dpkg -i mysql-cluster-community-server-core-dbgsym_8.0.23-1debian10_amd64.deb
Laissez vous guider pour indiquer le mot de passe root. Bien sûr, il faut utiliser un mot de passe fort : Comment choisir “un bon” mot de passe fort et sécurisé
Ensuite choisissez le type d’authentification :
- Strong Authentification qui utilise les nouveaux mécanismes de chiffrement et de connexion
- Use Legacy Authentification Method : Méthode classique de connexion avec un mot de passe
Enfin configurez /etc/mysql/conf.d/mysql.cnf comme précédemment et redémarrez le serveur MySQL :
Kill -HUP mysqld_safe
Vérifier l’état du cluster MYSQL
Revenez sur le serveur de gestion puis pour vérifier l’état du cluster MYSQL :
cd /var/lib/mysql-cluster
ndb_mgm -e show
Tester la réplication MySQL
Connectez-vous sur MySQL puis créez la table suivante :
USE test;
CREATE TABLE `test` (
`i` int(11) default NULL
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
Ensuite vérifiez sur un second serveur que la table est bien répliquée.
mysql -u root -p
use test;
show tables;
Vous devez avoir une table test.
Administrer le cluster MySQL NDB
Sauvegarder le cluster MySQL
Pour sauvegarder les données du cluster MySQL, vous pouvez utiliser mysqldump pour exporter les bases.
Mais on peut aussi utiliser la commande backup depuis l’interface de gestion ndb.
Depuis le Gestionnaire de cluster NDB :
cd /var/lib/mysql-cluster
ndb_mgm
Une fois l’interface NDB ouverte, utilisez la commande suivante pour effectuer une sauvegarde du cluster NDB :
START BACKUP
Cela va créer un dossier BACKUP avec un sous dossier pour chaque noeuds nommé BACKUP-NodeID
Puis pour restaurer la sauvegarde, on utilise la commande ndb_restore.
Voici un exemple de syntaxe :
ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-1-OF-4
ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-2-OF-4
ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-3-OF-4
ndb_restore -n 1 -b 1 -r --backup-path=opt/BACKUP/BACKUP-100/BACKUP-100-PART-4-OF-4
Enfin il est possible d’utiliser les commandes dans le terminal ou pour intégration de script.
ndb_mgm -e "START BACKUP"
Ajouter un nouveau noeud
Voici la procédure à suivre pour ajouter un nouveau noeud de données :
- Modifiez le fichier config.ini pour ajouter de nouvelles sections [ndbd] correspondant aux nouveaux nœuds qui seront ajoutés. Si vous utilisez plusieurs serveurs de gestion, assurez-vous de mettre à jour le fichier config.ini sur chacun des serveurs de gestion.
- Effectuez un redémarrage progressif de tous les serveurs de gestion MySQL Cluster. Assurez-vous d’utiliser l’option –reload ou –initial pour forcer la lecture de la nouvelle configuration.
- Effectuez un redémarrage progressif de tous les nœuds de données existants. Il n’est pas nécessaire d’utiliser –initial ici et cela n’est généralement pas souhaitable.
- Puis démarrez les nouveaux nœuds de données ajoutés au cluster.
- Si de nouveaux groupes de nœuds sont ajoutés, exécutez la commande CREATE NODEGROUP dans le client de gestion pour les nouveaux nœuds.
- Redistribuez les données du cluster parmi tous les nœuds de données en émettant une instruction ALTER ONLINE TABLE… REORGANIZE PARTITION pour chacune des tables NDB de vos bases de données.
- Récupérez l’espace en émettant une instruction OPTIMIZE TABLE pour chaque table NDB ou en utilisant une instruction alter table NULL telle que ALTER TABLE t1 ENGINE = NDB.
Les erreurs MySQL NDB et leurs résolutions
Returned error: ‘No free node id found for mysqld(API).
L’erreur complète :
Failed to allocate nodeid for API at 192.168.1.104. Returned error: ‘No free node id found for mysqld(API).’
Résolution : Vous n’avez pas assez de section [MYSQLD] dans le fichier config.ini par rapport aux nombre de noeuds MySQL.
Refusing to start with different configurations
L’erreur complète :
This node was started –initial with a config which is not equal to the one node 2 is using. Refusing to start with different configurations, diff:
Solution : Vous avez des différences de configuration dans le fichier config.ini de votre noeud de gestion ou vous n’avez pas redémarrez ndb_mgmd.
Cluster not ready for nodeid allocation
L’erreur complète :
WARNING — Unable to allocate nodeid for API at . Returned error: ‘Cluster not ready for nodeid allocation.’
Vous tentez de faire rejoindre un noeud MySQL API alors que tous les noeuds de données ne sont pas démarrés/connectés.
cd /var/lib/mysql-cluster
ndbd --initial
mysql_safe&
Liens
Le cluster MySQL permet d’assurer la haute disponibilité d’une application ou d’un serveur WEB.
On en parle dans cet article :