note

Ce mini-HowTo n'a que pour vocation de montrer une méthode de déploiement d'un petit cluster de "table" pour serveur MySQL. Il n'y figurera aucune méthode pour gérer le "load-balancing" des serveurs (montés en cluster).

Pour la rédaction de cette documentation, je me suis basé sur l'excellent HOWTO de Alex Davies : HOWTO set up a MySQL Cluster for two servers, publiée sur le site de MySQL. Certaines informations sont, bien sûr, tirées de la documentation officielle des clusters MySQL

Pour créer un "vrai" cluster, il faut obligatoirement n + 1 serveurs séparés (avec n >= 2) : n serveurs de bases de données + 1 contrôleur de serveur MySQL. Donc, il faut 3 machines, minimum. Il est IMPOSSIBLE de créer un cluster de serveur MySQL qu'avec 2 serveurs, vous perderiez la haute-disponibilité de l'architecture. Une plus longue explication est présente dans ce document, un peu plus bas.

Comme indiqué plus haut, il faut 3 serveurs, dans cette documentation ceux-ci seront nommés comme ceci :

mysql-serveur1.votre_domaine.net => 192.168.0.201
mysql-serveur2.votre_domaine.net => 192.168.0.202
mysql-ctrl.votre_domaine.net => 192.168.0.203

Bien sûr, ces valeurs sont "à titre indicatif", adaptez en fonction de vos besoins.

Comme les noms de domaine l'indiquent, "serveur1" et "serveur2" seront les serveurs montés en cluster. "ctrl" sera le contrôleur. le contrôleur n'a pas besoin d'une installation complète du serveur MySQL, seuls quelques exécutables sont utiles. Cette machine n'a pas besoin d'être dédiée au contrôle, celle-ci peut être une machine simple qui effectue une autre tâche. Il faut également prévoir une redondance du contrôleur, bien que celà soit moins important.

installation des serveurs de bases de données

Ces tâches doivent être exécutées sur les 2 premiers serveurs, serveur1 et serveur2.

installation du serveur mysql

apt-get install mysql-server-4.1

Si le serveur a été démarré par la procédure d'installation, il faut l'arrêter (des modifications doivent être effectuées avant son lancement)
/etc/init.d/mysql stop

installation et configuration du contrôleur

Seuls quelques exécutables du package mysql sont utiles : ndb_mgm et ndb_mgmd.

installation du serveur mysql

apt-get install mysql-server-4.1

Si le serveur a été démarré par la procédure d'installation, il faut (également) l'arrêter
/etc/init.d/mysql stop

désactivation du démarrage automatique (supression des liens symboliques)

update-rc.d -f mysql remove

répertoire de travail du contrôleur

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster

édition du fichier de configuration du contrôleur

vi config.ini

contenu du fichier config.ini

[NDBD DEFAULT]
NoOfReplicas=2 # nombre de réplicat (2 actuellement)
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
[NDB_MGMD]
HostName=mysql-ctrl.votre_domaine.net # adresse IP ou domaine du contrôleur
[NDBD]
HostName=mysql-serveur1.votre_domaine.net # adresse IP ou domaine du premier serveur de base de données
DataDir=/var/lib/mysql-cluster
[NDBD]
HostName=mysql-serveur2.votre_domaine.net # adresse IP ou domaine du second serveur de base de données
DataDir=/var/lib/mysql-cluster
[MYSQLD]
[MYSQLD]

démarrage du contrôleur de serveur mySQL

cd /var/lib/mysql-cluster && ndb_mgmd
Le service démarre immédiatement, et se détache de la console.

configuration des serveurs de bases de données

Cette configuration est à effectuer sur tous les serveurs de bases de données (mysql1 et mysql2).

édition du fichier de configuration du contrôleur

vi /etc/mysql/my.cnf
Sur les distributions autres que Debian, le fichier de configuration peut être directement dans /etc/

contenu du fichier my.cnf

Ces quelques lignes doivent être ajoutées dans les sections correspondantes

[mysqld]
ndbcluster # active le moteur de gestion de cluster
ndb-connectstring=mysql-ctrl.votre_domaine.net # adresse IP ou domaine du contrôleur
[mysql_cluster]
ndb-connectstring=mysql-ctrl.votre_domaine.net # adresse IP ou domaine du contrôleur

création du répertoire de travail de l'agent de clusterisation

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
ndbd --initial
Notez que le paramètre --initial n'est qu'à exécuter UNE SEULE FOIS ! Les démarrages suivants se feront sans ce paramètre.

Si des modifications sont effectuées dans le fichier de configuration du contrôleur (config.ini), la commande --initial devra être réutilisée.

Un démarrage initial efface tous les fichiers créés par les anciens "processus" ndbd. Il va aussi créer le fichier de log de restauration, ce qui peut prendre beaucoup de temps.

Plus d'information sur ndbd (fr)

démarrage du serveur de base de données

/etc/init.d/mysql start

ça marche ?

au niveau du contrôleur

A partir du contrôleur, lancez le client-manager du cluster

ndb_mgm

A l'invite de commande, tapez la commande show, la liste des serveurs montés en cluster devrait être affichée.

Si une ligne de la section des NBD contient not connected, il y a une problème avec l'agent de clusterisation correspondant

id=# (not connected, accepting connect from mysql-serveur#.votre_domaine.net)
Redémarrez l'agent sur le serveur correspondant au problème, en vérifiant au préalable que la connexion peut se faire (firewall, route, ...).

test avec un client mysql

Sur un poste quelconque ayant accès aux serveurs de bases de données, lancez une connexion sur un des 2 serveurs.

mysql -h mysql-serveur1.votre_domaine.net -u root -p (par exemple)

A l'invite de commande mysql, tapez les commandes suivantes

CREATE DATABASE test1; (création d'une base de données, quelconque, pour les tests)
USE test1;
CREATE TABLE table1 (champ1 INT) ENGINE=NDBCLUSTER; (création d'une table, toujours quelconque, toujours pour les tests :D)
INSERT INTO table1 VALUES (1);
SELECT * FROM table1;
Vous pouvez voir la valeur que vous venez d'entrer.

Déconnectez-vous de ce serveur, connectez-vous sur le second serveur. Créez la base de données sur l'autre serveur et lancez la même requête de sélection, vous pouvez voir que la requête retourne le même résultat.

simulation d'un crash

Simple : débranchez le câble réseau du second serveur de base de données :) (si vous avez accès à la machine) Sinon, tuez (violemment) les processus ndbd

coupure 1 : solution "câble réseau"

Un simple "débranchement" du câble fera l'affaire

coupure 2 : solution "kill -9"

Cherchez les processus ndbd
ps aux | grep ndbd
kill -9 <pid1> <pid2> <pidn>

constatation du "problème"

Pour détecter un problème de cluster, il suffit d'aller voir dans la console de gestion du cluster : ndb_mgm et de lancer la commande show à l'invite.

On remarque une ligne

id=3 (not connected, accepting connect from mysql-serveur3.votre_domaine.net)

La panne est détectée, mais le service reste disponible : merci cluster :)

vérification de la disponibilité du service

Avec le client mysql, connectez-vous sur l'un des 2 serveurs de bases de données et lancez la requête de sélection

SELECT * FROM table1;

Vous pouvez constater que le service est maintenu, tout marche correctement, comme s'il n'y avait eu aucune coupure.

rétablissement du service 1 : solution "câble réseau"

Rebranchez le câble réseau

rétablissement du service 2 : solution "kill -9"

redémarrez le service ndbd sur le second serveur

reconnexion au cluster

Lors de la reconnexion au cluster, ndb_mgm indique l'information suivante

id=3 @mysql-serveur2.votre_domaine.net (Version: 4.1.11, starting, Nodegroup: 0)

Le serveur ndbd échange les informations qui lui manque et réactualise sa propre base de donnée, lorsque cette étape est terminée, il passe en mode "normal"

id=3 @mysql-serveur2.votre_domaine.net (Version: 4.1.11, Nodegroup: 0)

informations complémentaires

réinitialisation des connexions

En cas de crash violent et injustifié des agents de clusterisation, il arrive que la reconnexion de ceux-ci ne puisse se faire dans de bonne condition. Il est possible de forcer la réinitialisation des sessions avec la commande purge stale sessions à entrer dans la console du client-manager de cluster (ndb_mgm).

forcer le type "NDBCLUSTER", par défaut

Pour certaine application, il arrive quelle ne soit pas conçue pour gérer les clusters de serveurs MySQL. Il est possible de forcer le type par défaut des tables, en ajoutant les lignes suivantes dans /etc/mysql/my.cnf dans les sections adéquates

[mysqld]
default-table-type=NDBCLUSTER

convertir une table pour passer en mode cluster

Il suffit de se connecter avec un client mysql, et d'exécuter la requête SQL ALTER TABLE nom_de_la_table_a_convertir ENGINE=NDBCLUSTER;.
A la fin de la procédure de conversion des autres tables (si besoin), il est obligatoire de synchroniser les tables avec la requête FLUSH TABLES;.

sécurité

Il faut bien avoir en tête que les outils de gestion de cluster MySQL ne sont pas sécurisés, n'importe qui peut se connecter au service de gestion de cluster. Il faut pour celà déployer des outils de protection : firewall, authentification sur les machines.

Il est fortement recommandé de monter un réseau séparé (2ème carte réseau sur les machines, par exemple), uniquement pour les transferts du cluster. Cette méthode apporte également des performances supplémentaires, surtout si votre réseau principal est chargé.

utilisation des noms de domaine dans la configuration

D'après Mikael Ronström (MySQL AB), l'utilisation de noms de domaine marchera certainement avec MySQL Cluster. Mais celle-ci peut parfois injecter des problèmes de "DNS lookup", pour celà, il faut être sûr que le serveur de nom marche parfaitement.

mémoire consommée par l'architecture sur les serveurs de stockage (mysqld)

Alex Davies propose la formule suivante, en se basant sur son expérience

(la taille des bases de données * nombre de réplicat * 1.1) / nombre de serveur de stockage

Dans notre exemple, le nombre de réplicat est 2 (2 serveurs ndbd) et le nombre de serveur de stockage est également 2 (2 serveurs mysqld). Le "1.1" est une "marge de manoeuvre" supplémentaire.

La documentation de Alex Davies donne plus de renseignements sur le sujet.