Mysql cluster

De BlaxWiki
Aller à la navigationAller à la recherche

Cette page à pour but de décrire la l'installation et la configuration de MySQL Cluster. Une aide plus approfondie peut être trouvée [http://dev.mysql.com/doc/index-cluster.html sur le site de MySQL]

Introduction[modifier]

Description (rapide) de MySQL Cluster[modifier]

MySQL Cluster permet d'utiliser les techniques de grappes pour un service MySQL. MySQL Cluster est conçu afin d'éviter les points de ruptures unique, chaque composant de la grappe 
pouvant se trouver sur des machines différentes.

Une grappe MySQL Cluster est composé de trois processus :
 * Nœud(s) MySQL (Processus MYSQLD) : Les nœuds MySQL permettent d'accéder aux nœuds de stockage et d'en manipuler les données.
 * Nœud(s) de stockage (Processus NDBD) : Les nœuds de stockages contiennent les données de la base de données.
 * Nœud(s) de gestion (Processus NDBD_MGMD) : Les nœuds de gestion sont utiliser pour gérer les nœuds MySQL et de stockage.

Chaque nœuds peut (ou non) se trouver sur des machines différentes.

Plate-forme de tests[modifier]

Le système a été testé avec trois machines virtuelles :
 * cluster-admsql (10.253.6.23) : Nœud MySQL et nœud de gestion.
 * cluster-ndbA (10.253.6.25) : Premier nœud de stockage.
 * cluster-ndbB (10.253.6.26) : Second nœud de stockage.

Installation[modifier]

Récupérer la version voulu sur le site de MySQL, les versions de MySQL intégrées à MySQL Cluster sont différentes suivant les versions de MySQL Cluster :
 * MySQL Cluster 6.3, 7.0 et 7.1 : MySQL 5.1
 * MySQL Cluster 7.2 : MySQL 5.5

Nœuds MySQL ou de stockage[modifier]

L'installation pour ces types de nœuds est identique et est similaire à l'installation d'un serveur MySQL standard.

# cd /opt/applis
# tar -xzf /root/install/mysql-cluster-gpl-7.1.18-linux-x86_64-glibc23.tar.gz
# ln -s mysql-cluster-gpl-7.1.18-linux-x86_64-glibc23 mysql-cluster
# ln -s /opt/applis/mysql-cluster /usr/local/mysql
# groupadd mysql
# useradd -g mysql mysql
# cd /opt/applis/mysql-cluster
# scripts/mysql_install_db --user=mysql
# chown -R root .
# chown -R mysql data
# chgrp -R mysql .
# cp support-files/mysql.server /etc/init.d/mysql
# chmod 755 /etc/init.d/mysql
# chkconfig --add mysql
# chkconfig --level 3 mysql on
# echo "/opt/applis/mysql-cluster/lib" > /etc/ld.so.conf.d/MYSQLCLUSER.conf
# echo "PATH=\$PATH:/opt/applis/mysql-cluster" >> /etc/profile

Nœuds de gestion[modifier]

Les nœuds de gestion ne nécessitent pas de services MySQL et seul une parti des exécutables est utilisés, leur installation est donc moins complexe.

# mkdir -p /opt/applis/mysql-cluster-gpl-7.1.18-linux-x86_64-glibc23/bin
# cd /opt/applis
# tar -zxvf /root/install/mysql-cluster-gpl-7.1.18-linux-x86_64-glibc23.tar.gz /opt/applis/mysql-cluster-gpl-7.1.18-linux-x86_64-glibc23/bin '*/bin/ndb_mgm*'
# ln -s mysql-cluster-gpl-7.1.18-linux-x86_64-glibc23 mysql-cluster
# ln -s /opt/applis/mysql-cluster /usr/local/mysql
# cd /opt/applis/mysql-cluster-gpl-7.1.18-linux-x86_64-glibc23/bin
# chmod +x ndb_mgm*
# echo "/opt/applis/mysql-cluster/lib" > /etc/ld.so.conf.d/MYSQLCLUSER.conf
# echo "PATH=\$PATH:/opt/applis/mysql-cluster" >> /etc/profile

Configuration[modifier]

Il est possible de trouver les paramètres de configuration recommandés sur le site de MySQL. De la même manière, une aide plus exhaustive est disponible.

Nœuds MySQL ou de stockage[modifier]

Créer le fichier DataDirrenseigné dans la section [ndbd default] de la configuration du nœud de gestion.

Créer un fichier etc/my.cnfavec le contenu suivant :

[mysqld]
ndbcluster
ndb-connectstring = cluster-admsql # IP/Hostname du noeud de gestion.

[mysql_cluster]
ndb-connectstring = cluster-admsql # IP/Hostname du noeud de gestion.

Nœuds de gestion[modifier]

Créer un fichier /var/lib/mysql-cluster/config.ini avec le contenu suivant :

# Fichier "config.ini" pour deux noeuds de stockage et un serveur MySQL
# Ce fichier est placé dans le répertoire de démarrage du serveur de gestion
# {ndb_mgmd).

[tcp default]   # Paramètres TCP par défaut.
SendBufferMemory        = 2M    # Caches de réception et d'envoi TCP a
ReceiveBufferMemory     = 2M    # augmenter en cas d'E/S disque insuffisante.

[ndbd_mgmd default]     # Paramètres par défaut du serveur de gestion.
DataDir         = /var/lib/mysql-cluster

[ndbd default]  # Paramètres par défaut des noeuds de stockage.
NoOfReplicas            = 2     # Nombre de noeuds de stoackage.
DataDir                 = /var/lib/mysql-cluster
LockPagesInMainMemory   = 1     # Les noeuds de gestion utilisent la RAM
                                # évite une dégradation de performance.
DataMemory              = 256M  # RAM utilisable par les données et index, à
IndexMemory             = 32M   # adapter en fonction de la machine.
ODirect                 = 0     # Demande à NDBCLUSTER d'utiliser des écritures
                                # O_DIRECT pour réduire l'utilisation CPU,
                                # demande MySQL cluster 6.2 et Linux 2.6 min.
NoOfFragmentLogFiles    = 300
DataDir                 = /var/lib/mysql-cluster
RealTimeScheduler       = 0     # Demande a NDBCLUSTER a travailler en mode
                                # temps-réel, demande MySQL cluster 6.3 et
                                # un noyau compatible.
CompressedLCP=1                 # Compression des fichiers de checkpoints locaux.
CompressedBackup=1              # Compression des fichiers de backup.

[ndb_mgmd]      # Section des serveurs de gestion, une par serveur
Hostname        = cluster-admsql        # IP/Hostname du serveur de gestion.

[ndbd]          # Section des noeuds de stockage, une par noeud.
HostName                = cluster-ndbA  # Premier noeud de stockage.
LockExecuteThreadToCPU  = 0             # ID du CPU des threads d'éxécutions et
LockMaintThreadsToCPU   = 0             # principaux sur les systèmes SMP.

[ndbd]
HostName                = cluster-ndbB  # Second noeud de stockage.
LockExecuteThreadToCPU  = 0             # ID du CPU des threads d'éxécutions et
LockMaintThreadsToCPU   = 0             # principaux sur les systèmes SMP.

[mysqld]        # Section des serveurs MySQL, une par serveur.
HostName        = cluster-admsql        # IP/Hostname du serveur MySQL.

Démarrage[modifier]

Nœuds de gestion[modifier]

Les nœuds de gestion n'ayant pas de scripts de démarrage, il est nécessaire de les démarrer via la commande : ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Nœuds de stockage[modifier]

Démarrer le processus NDBD avec la commande : ndbd

Nœuds MySQL[modifier]

Démarrez le serveur MySQL avec le script /etc/init.d/mysql start

Vérifications[modifier]

Nœuds MySQL[modifier]

Vérifiez que le moteur de stockage NDBCLUSTER est géré via la commande MySQL SHOW ENGINES\G

mysql> SHOW ENGINES\G
*************************** 1. row ***************************
      Engine: ndbcluster
     Support: YES
     Comment: Clustered, fault-tolerant tables
Transactions: YES
          XA: NO
  Savepoints: NO
[…]

Commandes utiles[modifier]

Nœuds de gestion[modifier]

La commande ndb_mgm propose plusieurs sous-commandes utiles

 * SHOW : Avoir un état du Cluster.
   
ndb_mgm> SHOW
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=2    @10.253.6.25  (mysql-5.1.56 ndb-7.1.18, Nodegroup: 0, Master)
id=3    @10.253.6.26  (mysql-5.1.56 ndb-7.1.18, Nodegroup: 0)

[ndb_mgmd(MGM)] 1 node(s)
id=1    @10.253.6.23  (mysql-5.1.56 ndb-7.1.18)

[mysqld(API)]   2 node(s)
id=4 (not connected, accepting connect from any host)
id=5    @10.253.6.23  (mysql-5.1.56 ndb-7.1.18)
 * <node_id> START et <node_ID> STOP : Démarrer ou stopper un nœud, l'ID est celle indiqué dans la commande SHOW, par exemple, ici, le nœud 1 est celui de gestion, les 2 et 3 ceux de 
stockage et le 5 le nœud MySQL. L'ID peut être remplacé par ALL pour affecter tout les nœuds.
 * <node_id> RESTART : Stop, puis redémarre le nœud identifié par l'ID <node_id>.
 * <node_id> STATUS : Affiche l'état du nœud choisi.
   
ndb_mgm> 1 STATUS
Node 1: connected (Version 7.1.18)

 * <node_id> REPORT <type> : Il est possible d'obtenir un rapport sur l'utilisation mémoire et sur l'état des sauvegarde d'un nœud de stockage via cette commande, en remplaçant 
<type> repectivement par MemoryUsage et BackupStatus
   
ndb_mgm> 2 REPORT BackupStatus
Node 2: Backup not started

ndb_mgm> 2 REPORT MemoryUsage
Node 2: Data usage is 0%(22 32K pages of total 2560)
Node 2: Index usage is 0%(16 8K pages of total 2336)

 * ENTER SINGLE USER MODE <node_id> et EXIT SINGLE USER MODE <node_id> : Font respectivement entrer et sortir un nœud MySQL en mode « Single user » pour que seul lui puisse accéder 
aux bases, un nœud de donné ne peut joindre un cluster si un serveur MySQL fonctionne en mode « Single user ».
 * CREATE NODEGROUP <nodeid>[, <nodeid>, …] : Créer un groupe de nœuds composé par les nœuds de stockage désignés. Cette commande est utilisé après l'ajout de nœuds de donnée à un 
cluster déjà existant. les différent groupes de nœuds doivent avoir le même nombre de nœuds.
 * DROP NODEGROUP <nodegroup_id> : Supprime le groupe de nœuds désigné par <nodegroup_id> et en fait sortir les nœuds le composant.

Sauvegardes à chaud MySQL Cluster[modifier]

Il semble toujours possible d'utiliser mysqldump depuis le nœud MySQL.

Introduction[modifier]

Les sauvegardes à chauds se présentent sous la forme d'instantanées (snapshot), ceux-ci sont partagés en trois parties :

 * Metadata : Nom et définition des tables des bases de données. Fichier BACKUP-<backupid>.<nodeid>.ctl.
 * Table records : Données des tables des bases de données à l'instant de prise de l'instantané. Fichier BACKUP-<backupid>-0.<nodeid>.data.
 * Transaction log : Enregistrement séquentiel indiquant comment et quand les données on été stocké dans les bases de données. Fichier BACKUP-<backupid>.<nodeid>.log.
Avec <nodeid> l'identifiant du nœud et <backupid> l'identifiant de l'instantané.
Le <backupid> est un nombre entier codé sur 32 bits identifiant l'instantané, si celui-ci n'est pas précisé lors de la création de l'instantané, le premier chiffre consécutif libre 
sera utilisé.

Gestion des sauvegardes[modifier]

La commande de sauvegarde est START BACKUP <backupid>, celle-ci s'utilise depuis le nœud de gestion, l'identifiant de sauvegarde <backupid> est facultatif.
 * START BACKUP NOWAIT : Démarrer la sauvegarde et rendre la main immédiatement.
 * START BACKUP WAIT STARTED : Démarrer la sauvegarde et rendre la main une fois la sauvegarde démarré.
 * START BACKUP COMPLETED : Démarrer la sauvegarde et rendre la main à la fin de la sauvegarde, choix par défaut.

Il est possible d'utiliser les options SNAPSHOTSTART et SNAPSHOTEND pour sauvegarder l'état du cluster en début ou en fin d'instantané, SNAPSHOTEND est le choix par défaut.
Un instantané peut être annulé avec la commande ABORT BACKUP <backupid>.

Options de sauvegarde[modifier]

Ces options peuvent être ajouté dans le fichier /var/lib/mysql-cluster/config.ini du nœud de gestion.
 * !BackupDataBufferSize : Taille du cache de sauvegarde de données en RAM à utiliser avant écriture sur disque.
 * !BackupLogBufferSize : Taille du cache de sauvegarde de journaux en RAM à utiliser avant écriture sur disque.
 * !BackupMemory : RAM allouée à la sauvegarde sur un nœud de données, ce doit être la somme du cache RAM alloué au sauvegarde de données et de journaux.
 * !BackupWriteSize : Taille par défaut des blocs sur disque, cela concerne les sauvegarde de données ou de journaux.
 * !BackupMaxWriteSize : Taille maximum des blocs sur disque, cela concerne les sauvegarde de données ou de journaux.

Démarrage et arrêt d'un cluster MySQL[modifier]

Redémarrage intégral du cluster[modifier]

Il est possible de stopper ou de redémarrer totalement un cluster MySQL via les commandes suivantes.
 * Commencez par donner l'ordre d'arrêt au cluster depuis le nœud de gestion, ceci terminera les processus ndbd et ndb_mgmd des nœuds de données et de gestion :
   # ndb_mgm -e shutdown
 * Ensuite, arrêtez les nœuds MySQL avec :
   # mysqladmin shutdown
 * Pour redémarrer, commencez par les nœuds de gestion :
   # ndb_mgmd -f /var/lib/mysql-cluster/config.ini
 * Puis les nœuds de données
   # ndbd
 * Enfin, les nœuds MySQL
   # mysqld_safe &

Redémarrage d'un nœud individuel[modifier]

Le redémarrage individuel, aussi nommée « Rolling Restart » est utilisé quand il s'avère nécessaire de d'intervenir sur un nœud du cluster, il permet de couper temporairement ledit nœud du cluster le temps de l'intervention, sans pour autant totalement couper le cluster.

Réinitialisation[modifier]

Si il est nécessaire de réinitialiser un cluster, il est souvant préférable de recharger les données et métadonnées, cela peut être fait de trois façon différentes :
 * Redémarrez chaque nœud de données (processus ndbd) avec l'option --initial pour forcer le nœud de données à nettoyer son système de fichier et à recharger les données et 
métadonnées depuis les autres nœuds de données.
 * Utilisez la commande ndbd pour créer un snapshot avant de redémarrer le nœud. Ensuite, restaurez les données avec ndb_restore.
 * Utilisez mysqldump pour créer une sauvegarde avant redémarrage, une fois fait, restaurez-le avec la commande LOAD DATA INFILE.
=== Récupération de ressources ou mise à jour ===
 * Stoppez les nœuds de gestion (processus ndb_mgmd), reconfigurez-les au besoin et redémarrez-les.
 * Puis, stoppez, reconfigurez et redémarrez les nœuds de données.
 * Enfin, stoppez, reconfigurez et redémarrez les nœuds MySQL.
=== Redémarrage avec plusieurs serveurs de gestion ===
 * Stoppez tout les processus ndb_mgmd.
 * Mettez à jour les fichiers config.ini.
 * Démarrez un premier processus ndb_mgmd avec les options --reload ou --initial (ou les deux si désiré).
 * Démarrez les autre processus ndb_mgmd sans les options --reload et --initial.
 * Complétez le redémarrage des nœuds de données et MySQL comme à l'accoutumé.