Mysql cluster
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
Description (rapide) de MySQL Cluster
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
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
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
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
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
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
Créer le fichier {{{DataDir}}} renseigné dans la section {{{[ndbd default]}}} de la configuration du nœud de gestion.
Créer un fichier {{{/etc/my.cnf}}} avec 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
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
Nœuds de gestion
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
Démarrer le processus NDBD avec la commande : ndbd
Nœuds MySQL
Démarrez le serveur MySQL avec le script /etc/init.d/mysql start
Vérifications
Nœuds MySQL
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
Nœuds de gestion
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
Il semble toujours possible d'utiliser {{{mysqldump}}} depuis le nœud MySQL.
Introduction
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
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
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
Redémarrage intégral du cluster
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
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
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é.