Installation du MySQL Cluster

18 juillet 2008 par arnaud

Le but de ce billet est d’installer rapidement une configuration permettant de tester le cluster MySQL.
Il existe plusieurs façons de faire, en voici une basée sur les binaires de la dernière version à ce jour, la cluster 6.2.15. Rappelez-vous que depuis la version 5.1.25 de MySQL, les binaires du cluster ne sont plus inclus mais disposent de leur propre branche.

Haute disponibilité (redondance), montée en charge et haute performance (données en mémoire vive), une architecture en « shared-nothing » (aucun élément du cluster ne partage le même hardware) et un serveur mysql doté d’un nouveau moteur de stockage (NDB encore appelé NDBCLUSTER), voici quelques caractéristiques du cluster MySQL. Voyons comment l’installer en un minimum d’étapes.

Vue d’ensemble des éléments composant un cluster

Ce schéma issu de la documentation MySQL expose les différents élements qui composent un cluster MySQL, passons-les rapidement en revue.

Les composants d\'un cluster MySQL

Les trois principaux éléments d’un cluster MySQL sont les suivants :

Le management node (MGM) est un point central du cluster et doit être démarré le premier. Pour cela on utilise la commande ndb_mgmd suivie si besoin du fichier de configuration du cluster. Celui-ci contient une entrée pour chaque noeud susceptible de se connecter au cluster. Les autres noeuds se connectent au MGM node via une chaîne de connexion nommée « connectstring« , nous verrons cela.

Les SQL Nodes reposent sur des serveurs MySQL tels que nous les connaissons déjà, exceptés qu’ici le moteur de stockage NDB est utilisé. Celui-ci permet de dialoguer avec les Datas Nodes et autorise le stockage des données en mémoire (le stockage sur disque est également en partie envisageable). Les SQL Nodes interrogent les Datas Nodes afin de retrouver l’information stockée. A noter : le SQL Node est de façon plus générale un API Node, c’est à dire une application qui accède à l’information stockée par le cluster.

Les Datas Nodes ont pour fonction principale de stocker l’information de façon redondante. Sans rentrer dans les détails pour le moment, il faut au moins deux Datas Nodes pour faire fonctionner le cluster dans une configuration minimale. Un cluster doit être tolérant aux pannes (haute disponibilité), l’information est donc forcément dupliquée afin de supporter la perte d’une machine sans pour autant perdre le cluster. Celui-ci reste viable tant qu’une version au moins de l’information est présente, plus celle-ci est dupliquée, plus on peut se permettre de « perdre » un noeud.

Rajoutons enfin le Management Client (ndb_mgm), il se connecte au MGM Node, n’accède pas aux données mais permet de gérer les noeuds du cluster ou de visualiser le statut de celui-ci.

L’installation du cluster MySQL sous linux

A noter que cette installation aurait été difficile sous Windows puisque le cluster MySQL n’est pour l’instant tout simplement pas disponible sur ce système…

Attention, l’installation qui va suivre n’a pas vocation à être utilisée en production. Cette installation place tous les composants du cluster sur une même machine (mon pc portable en fait) inutile donc d’espérer une quelconque redondance si jamais un des composants de la machine venait à lacher et ne parlons pas de la montée en charge… Le but est simplement d’installer rapidement le cluster MySQL sur votre machine personnelle afin de se familiariser avec les différents éléments du cluster au fil des prochains articles.

Il existe différentes configurations pour installer un cluster, une fois que vous serez familiarisé avec celle-ci, comparez-la avec celle proposée sur le site de MySQL dans le cadre d’une configuration avec plusieurs machines. Libre à vous ensuite de vous construire un cluster dont l’architecture serait plus proche de la réalité, en simulant un noeud par machine virtuelle par exemple.

L’installation d’un cluster MySQL se déroule en grande partie comme une installation MySQL classique à ceci près que certaines options font leur apparition dans les fichiers my.cnf (ndbcluster, connectstring), chaque noeud est censé avoir son fichier my.cnf (ici il sera partagé). Autre nouveauté, un fichier de configuration global, souvent appelé « config.ini », est présent sur le Management Node uniquement.

Une fois les sources récupérées, voici les étapes suivies (installation sous ubuntu) :

// Décompression de l’archive…
/opt# tar xzvf mysql-cluster-gpl-6.2.15-linux-i686-glibc23.tar.gz

// Création d’un lien symbolique vers le répertoire d’installation
/usr/local# ln -s /opt/mysql-cluster-gpl-6.2.15-linux-i686-glibc23 ndb6215

Si vous n’avez pas encore crée de groupe « mysql » lors d’une précédente installation (peu probable si vous vous intéressez au cluster), c’est le moment :

shell> groupadd mysql
shell> useradd -g mysql mysql

Configuration des permissions adéquates appliqués aux répertoires de l’installation :
/usr/local/ndb6215# chown -R root .
/usr/local/ndb6215# chown -R mysql data
/usr/local/ndb6215# chgrp -R mysql .

Les fichiers « my.cnf » ont entre autres pour but de permettre aux noeuds de se connecter au MGM node via une connecstring. Sachant que nous n’avons qu’une seule machine dans cette procédure d’installation, notre fichier de configuration local, my6215.cnf, sera donc commun aux différents noeuds, excepté le MGM node qui lui pointe vers le config.ini, voici le fichier my6215.cnf crée pour notre cluster :

# my6215.cnf
[client]
port            = 3307
socket          = /tmp/my6215.sock

[mysqld_safe]
ledir           = /usr/local/ndb6215/bin

[mysqld]
ndbcluster
ndb-connectstring= 127.0.0.1
port            = 3307
socket          = /tmp/my6215.sock
basedir         = /usr/local/ndb6215
datadir         = /usr/local/ndb6215/data

[mysql_cluster]
ndb-connectstring=127.0.0.1

Très simplifié, il reprend les entêtes déjà connues du my.cnf classique à savoir « client », « mysqld_safe » ou encore « mysqld ». J’ai choisi de faire tourner le serveur mysqld sur le port 3307 au cas où un serveur MySQL existerait déjà en 3306 sur la configuration dont vous pourriez déjà disposer.

Pour l’entête « client », rien de spécial à signaler, le serveur tournant sur le port 3307, on signale au client mysql qu’il faudra utiliser ce port particulier, on pointe vers la socket du serveur qui a été renommée.

L’entête « mysqld_safe » permet de ne pas spécifier en ligne de commande de mysqld_safe le répertoire dans lequel est contenu les binaires, celui-ci est indiqué par la variable « ledir ».

L’entête « mysqld » spécifie que notre serveur MySQL doit tourner en mode NDB (ndbcluster). Sans cet ajout, notre serveur MySQL ne serait pas considéré comme un élément du cluster.

On distingue également la première apparition de la connecstring, celle-ci est composée dans sa version la plus simple d’un nom de machine auquel on ajoute éventuellement un port particulier. Dans le cas par défaut comme ici, le port choisi est le 1186, inutile de le spécifier. Si vous aviez choisi de faire tourner deux cluster MySQL sur la même machine (pour tester la réplication inter-cluster par exemple), il est possible de jouer sur ce paramètre afin de séparer les deux.

Les sockets sont renommées afin de ne pas réutiliser les noms utilisés couramment.

« basedir » et « datadir » sont spécifiés vu que nous avons installés MySQL dans un répertoire qui n’est pas celui par défaut. Si vous rencontrez des erreurs du type « can’t find message file share/english/errmsg.sys », c’est soit… un bug de votre version, soit un mauvais paramétrage de ces variables, essayez également de jouer avec l’option « language » du serveur mysqld afin de pointer vers les bons fichiers.

Enfin, la catégorie « mysql_cluster » permet de définir des informations valables pour plusieurs exécutables du cluster : ndbd (démarrage des noeuds), ndb_mgmd (Management server node), ndb_mgm (Management client), ndb_restore… C’est donc l’endroit adéquat pour stocker une connectstring par exemple.

Nous aurions pu remplacer [mysql_cluster] par :

[ndbd]
ndb-connectstring = 127.0.0.1
[ndb_mgmd]
ndb-connectstring = 127.0.0.1
[ndb_mgm]
ndb-connectstring = 127.0.0.1

C’est d’ailleurs de cette façon qu’est conçu le my.cnf proposé sur le site de MySQL.

L’installation se poursuit ensuite de façon classique :

/usr/local/ndb6215# ./scripts/mysql_install_db –defaults-file=/etc/my6215.cnf –user=mysql –basedir=/usr/local/ndb6215 –datadir=/usr/local/ndb6215/data

La nouveauté dont nous avons parlé : la configuration du fichier config.ini du Management Server (MGM node, le squelette du fichier ci-dessous est tiré d’un fichier fourni par MySQL dans le répertoire « support_files » :

/usr/local/ndb6215/support-files# cp ndb-config-2-node.ini /var/lib/mysql-cluster/config.ini

# Example Ndbcluster storage engine config file.
[ndbd default]
NoOfReplicas= 2
HostName= 127.0.0.1
DataDir= /var/lib/mysql-cluster

[ndb_mgmd default]
DataDir= /var/lib/mysql-cluster
HostName= 127.0.0.1

[ndb_mgmd]
Id=10

[ndbd]
Id= 20

[ndbd]
Id= 21

[mysqld]
Id= 30

[mysqld]
Id= 31

Quelques remarques concernant ce config.ini :

« NoOfReplicas » spécifie le nombre de copies de chaque donnée du cluster, nous approfondirons ce terme au prochain épisode.

« Datadir » définit un répertoire pour les fichiers de logs, d’erreur, de pid, des noeuds.

Chaque élément du cluster est référencé dans le config.ini. Le management serveur lui-même (id=10), les deux datas nodes (id 20 et 30), et notre serveur mysql (id=40). Avec le dernier « emplacement » (id=50), on signale au cluster qu’un serveur mysql est susceptible de se rajouter à l’ensemble, c’est une sorte de réservation, nous aurions procédé de même pour les datas nodes.

Les ID des noeuds sont facultatifs, ils sont indiqués ici pour clarifier les étapes.

// Démarrage du management server
/usr/local/ndb6215# ./bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini

Une fois le MGM node démarré, on peut lancer le client correspondant et afficher un premier état de la situation du cluster :

/usr/local/ndb6215# ./bin/ndb_mgm –defaults-file=/etc/my6215.cnf

-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]    2 node(s)
id=20 (not connected, accepting connect from localhost)
id=21 (not connected, accepting connect from localhost)

[ndb_mgmd(MGM)]    1 node(s)
id=10 @127.0.0.1 (mysql-5.1.23 ndb-6.2.15)

[mysqld(API)]    2 node(s)
id=30 (not connected, accepting connect from any host)
id=31 (not connected, accepting connect from any host)

Nos noeuds sont bien référencés, seul notre Management Server est lancé, c’est d’ailleurs grâce à lui que le Management Client (ndb_mgm) a pu se connecter.

Reste à connecter les noeuds suivants, c’est autour des Datas Nodes puis du SQL Node :

// Démarrage des Datas Nodes
/usr/local/ndb6215# ./bin/ndbd --defaults-file=/etc/my6215.cnf --ndb-nodeid=20
/usr/local/ndb6215# ./bin/ndbd --defaults-file=/etc/my6215.cnf --ndb-nodeid=21

// Démarrage du serveur MySQL, on effectue un démarrage classique :
/usr/local/ndb6215# ./bin/mysqld_safe --defaults-file=/etc/mycluster.cnf &

Appliquons à nouveau la commande SHOW dans le Management Client :

ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]    2 node(s)
id=20 @127.0.0.1 (mysql-5.1.23 ndb-6.2.15, Nodegroup: 0, Master)
id=21    @127.0.0.1 (mysql-5.1.23 ndb-6.2.15, Nodegroup: 0)

[ndb_mgmd(MGM)]    1 node(s)
id=10    @127.0.0.1 (mysql-5.1.23 ndb-6.2.15)

[mysqld(API)]    2 node(s)
id=30    @127.0.0.1 (mysql-5.1.23 ndb-6.2.15)
id=31 (not connected, accepting connect from any host)

Cette fois-ci tous les noeuds sont connectés, on remarque l’emplacement laissé libre pour un éventuel nouveau serveur MySQL (id=31).

Le serveur MySQL étant désormais lancé, n’oubliez pas d’ajuster votre politique de sécurité avec l’utilisation du script mysql_secure_installation par exemple, voir le billet consacré à ce sujet.

Connectons-nous à la base :

/usr/local/ndb6215#./bin/mysql –defaults-file=/etc/my6215.cnf -uroot -p

Server version: 5.1.23-ndb-6.2.15-cluster-gpl MySQL Cluster Server (GPL)

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> show schemas;
+——————–+
| Database
+——————–+
| information_schema
| mysql
+——————–+
2 rows in set (0.00 sec)

Notre cluster est fonctionnel.

Pour l’arrêter, on utilise le Management Client :

ndb_mgm> SHUTDOWN
2 NDB Cluster node(s) have shutdown.
Disconnecting to allow management server to shutdown.

Pour stopper le serveur MySQL on peut utiliser mysqladmin :

/usr/local/ndb6215# ./bin/mysqladmin –defaults-file=/etc/my6215.cnf shutdown -uroot -p

N’hésitez pas à tester par vous-même les précédentes étapes, elles constituent le point de départ de futurs articles sur le sujet.

Mots-clefs : ,

Un commentaire sur “Installation du MySQL Cluster”

  1. [...] Oracle et plus… « mysqlslap et supersmack, deux outils de benchmark pour MySQL Installation du MySQL Cluster [...]

Laisser une réponse