Blog

Installation de Mysql Cluster

Écrit le 17 04 2013 par Kévin MET _

Comme je le disais dans mon précédent billet je vais faire quelques articles sur MySQL cluster. Pour être plus précis, je vais faire quelques billets sur la haute disponibilité d'un environnement MySQL. (je prépare quelques articles sur Percona). Le sujet du jour est donc Mysql Cluster.

Principes de bases

MySQL cluster est divisé en nœuds (ou nodes comme je vais souvent l'écrire) qui permettent d'assurer une redondance des données et du service. Il existe 3 types de nodes :

  • Les data nodes : ce sont eux qui stockent les données
  • Les SQL nodes : ce sont eux qui encaissent les requêtes SQL de votre applicatif et les renvoient à vos data nodes
  • Les management nodes : ce sont eux qui gèrent le cluster

Il faut également savoir que les données sont stockées en RAM et que, par conséquent, si vous avez des bases volumineuses il vous faudra beaucoup de RAM. Cela étant dit, il est possible de mettre certaines données sur disque mais les performances s'en ressentent fortement. Vous savez donc le minimum vital sur MySQL Cluster, nous allons passer à son installation.

Installation

Dans ce tutoriel nous allons utiliser 4 nodes avec les adresses ip et les rôles suivants (machines sous debian squeeze) :

  • 192.168.1.1 (node1) : management et SQL
  • 192.168.1.2 (node2) : management et SQL
  • 192.168.1.3 (node3) : data
  • 192.168.1.4 (node4) : data

Cette configuration minimale nous permet d'avoir une tolérance de panne d'une machine, quelle qu'elle soit.

Nous allons commencer par préparer les noeuds SQL et pour cela on télécharge l'archive de MySQL cluster que l'on décompresse.


root@node1:~# wget www.mysql.com/get/Downloads/MySQL-Cluster-7.2/mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz/from/http://cdn.mysql.com/
root@node1:~# mv index.html mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz
root@node1:~# tar xvzf mysql-cluster-gpl-7.2.12-linux2.6-x86_64.tar.gz 
root@node1:~# cd mysql-cluster-gpl-7.2.12-linux2.6-x86_64

Comme pour l'installation d'un serveur MySQL traditionnel il faut :

  • créer un groupe mysql
  • créer un utilisateur mysql utilisant ce groupe
  • bouger le dossier MySQL dans le dossier ou l'on veut qu'il soit installé (ici dans /usr/local/ pour faire simple)
  • faire un lien symbolique vers un nom plus simple
  • installer les dépendances
  • installer les bases de données par défaut
  • copier le script d'init dans /etc/init.d

root@node1:~# groupadd mysql
root@node1:~# useradd -g mysql mysql
root@node1:~# mv mysql-cluster-gpl-7.2.12-linux2.6-x86_64 /usr/local/
root@node1:~# ln -s /usr/local/mysql-cluster-gpl-7.2.12-linux2.6-x86_64/ /usr/local/mysql
root@node1:~# aptitude install libaio1
root@node1:~# cd /usr/local/mysql
root@node1:/usr/local/mysql# scripts/mysql_install_db --user=mysql
root@node1:/usr/local/mysql# cp support-files/mysql.server /etc/init.d/

Une fois que vous avez fait ceci sur les deux nodes SQL vous pouvez passez à l'installation des nœuds de management (les même nodes dans notre exemple)

Pour l'installation des management nodes c'est beaucoup plus rapide, il suffit de copier les binaires qui vont bien dans un des dossier qui fait partie de votre PATH (/usr/local/bin/ dans cet exemple) et de les rendre exécutables


root@node1:/usr/local/mysql# cd /usr/local/mysql/bin/
root@node1:/usr/local/mysql/bin# cp ndb_mgm* /usr/local/bin/
root@node1:/usr/local/mysql/bin# chmod +x /usr/local/bin/ndb_mgm
root@node1:/usr/local/mysql/bin# chmod +x /usr/local/bin/ndb_mgm*

Ensuite nous allons passer à l'installation des data nodes qui est une étape aussi simple que précédemment car il faut quasiment faire la même chose au détail près que ce sont les binaires qui gèrent les data qui devront être copiés. Le plus simple pour éviter de télécharger de nouveau l'archive MySQL cluster sur les data nodes et de faire des scp depuis un des deux nodes SQL. Dans la suite de l'exemple nous ferons le scp depuis node1.


root@node1:~# scp /usr/local/mysql/bin/ndbd /usr/local/mysql/bin/ndbmtd root@192.168.1.3:/usr/local/bin/
root@node1:~# scp /usr/local/mysql/bin/ndbd /usr/local/mysql/bin/ndbmtd root@192.168.1.4:/usr/local/bin/
root@node1:~# ssh root@192.168.1.3 "chmod +x /usr/local/bin/ndb*"
root@node1:~# ssh root@192.168.1.4 "chmod +x /usr/local/bin/ndb*"

Configuration basique des nodes

Nous pouvons passer à la configuration des nodes. Je vais volontairement faire une configuration simpliste qui contiendra le strict miminum pour permettre à MySQL Cluster de tourner convenablement. Nous allons commencer par configurer les data nodes et des SQL nodes qui auront exactement le même fichier my.cnf. On écrit donc dans notre exemple un fichier my.cnf sur tous les nodes.


root@node3:~# mkdir -p /usr/local/mysql/data
root@node3:~# vim /etc/my.cnf

[mysqld]
ndbcluster
[mysql_cluster]
ndb-connectstring=192.168.1.1,192.168.1.2

On va passer à la configuration des nœuds de management.


root@node1:~# mkdir /var/lib/mysql-cluster
root@node1:~# mkdir -p /usr/local/mysql/mysql-cluster/
root@node1:~# vim /var/lib/mysql-cluster/config.ini

[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
[tcp default]
[ndb_mgmd]
hostname=192.168.1.1
datadir=/var/lib/mysql-cluster
[ndb_mgmd]
hostname=192.168.1.2
datadir=/var/lib/mysql-cluster
[ndbd]
hostname=192.168.1.3
datadir=/usr/local/mysql/data
[ndbd]
hostname=192.168.1.4
datadir=/usr/local/mysql/data
[mysqld]
hostname=192.168.1.1
[mysqld]
hostname=192.168.1.2

Lancement du Cluster

Pour lancer et arrêter le cluster il faut respecter un ordre. Lors du démarrage, on commence toujours par les nœuds de management. On commence donc par node1 :


root@node1:~# ndb_mgmd -f /var/lib/mysql-cluster/config.ini 
MySQL Cluster Management Server mysql-5.5.30 ndb-7.2.12

Pour se connecter à la commande de management on tape simplement ndb_mgm. Et pour voir le status des différents noeuds on tape show :


root@node1:~# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.1.1:1186
ERROR Message: The cluster configuration is not yet confirmed by all defined management servers. This management server is still waiting for node 2 to connect.

Could not get configuration
*  4012: Failed to get configuration
*        The cluster configuration is not yet confirmed by all defined management servers. This management server is still waiting for node 2 to connect.
ndb_mgm>

Ici, on voit que le nœud 1 attend que le nœud 2 soit connecté. On démarre donc le nœud 2


root@node2:~# ndb_mgmd -f /var/lib/mysql-cluster/config.ini
MySQL Cluster Management Server mysql-5.5.30 ndb-7.2.12

On vérifie que les deux nœuds se voient bien :


root@node2:~# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.1.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3 (not connected, accepting connect from 192.168.1.3)
id=4 (not connected, accepting connect from 192.168.1.4)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)
id=2	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]	2 node(s)
id=5 (not connected, accepting connect from 192.168.1.1)
id=6 (not connected, accepting connect from 192.168.1.2)

Nous pouvons donc lancer les data nodes


root@node3:~# ndbd
2013-04-17 18:45:18 [ndbd] INFO     -- Angel connected to '192.168.1.1:1186'
2013-04-17 18:45:18 [ndbd] INFO     -- Angel allocated nodeid: 3
root@node4:~# ndbd
2013-04-17 18:45:41 [ndbd] INFO     -- Angel connected to '192.168.1.1:1186'
2013-04-17 18:45:41 [ndbd] INFO     -- Angel allocated nodeid: 4

On vérifie que les deux nodes sont bien détectés dans la console de management :


ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3	@192.168.1.3  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)
id=4	@192.168.1.4  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)
id=2	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]	2 node(s)
id=5 (not connected, accepting connect from 192.168.1.1)
id=6 (not connected, accepting connect from 192.168.1.2)

Il ne reste plus qu'à lancer les nodes mysql :


root@node1:~# /etc/init.d/mysql.server start
Starting MySQL
....
root@node2:~# /etc/init.d/mysql.server start
Starting MySQL
...

Il ne reste plus qu'à vérifier que les nœuds sont tous connectés via la console de management :


ndb_mgm> show
Connected to Management Server at: 192.168.1.1:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=3	@192.168.1.3  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)
id=4	@192.168.1.4  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)

[ndb_mgmd(MGM)]	2 node(s)
id=1	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)
id=2	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]	2 node(s)
id=5	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)
id=6	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

Tout est OK, les nœuds sont bien connectés et UP. Il ne vous reste plus qu'à jouer avec votre cluster ! Pour éteindre votre cluster vous devrez procéder dans l'ordre inverse. Il faut arrêter les SQL puis les datas puis les managements. Dans un prochain tutoriel, on verra comment sont gérées les sauvegardes et restauration.

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.