Installation d'un MySQL Cluster
Introduction
MySQL Cluster est une version de MySQL qui donne le haut redondance et la haute disponibilité. Les donnéés sont stockées et réproduites dans la mémoire des individuels machines qui s'appèllent "noeud de données". Pour les versions récentes de MySQL, les données peut être sauvegardées sur le disque dur. Comme chaque machine garde une copie de données, il n'y a pas de unique point de fault qui peut casser tout le système.
Un cluster contient les composants suivants:
- Noeud de données: c'est une noeud qui garde les données dans son mémoire et qui fait des manipulations sur les données
- Noeud de gestion: son rôle est de gérer les autres noeuds dans un MySQL Cluster. Par example il donne les informations sur la configuration, démarrer et éteindre des autres noeuds. Comme elle est intérrogé pour avoir les informations, il faut la démarrer la première quand on démarre un Cluster.
- MySQL noeud: on utilise ce noeud pour accéder aux bases de données de cluster. C'est un server MySQL normal mais configuré pour utiliser moteur de stockage NDB Cluster.
Schéma de principe du cluster à installer
On va installer un cluster sur 1 machine physique avec 4 machines virtuelles. On utilise aussi 1 service MySQL Proxy qui fait un "round-robin" des requêtes sur 2 serveurs MySQL pour l'équilibrage de charge. Dans ce teste on installe MySQL noeud et noeud de données sur la même machine virtuel, mais on peut les mettre sur 2 machines différentes.
A noter qu'il ne faut pas installer un noeud de données et un noeud de gestion sur la même machine. Quand cette machine est en panne, le cluster arrête de fonctionner même si les autres noeuds marchent.
Sur les machines virtuelles il faut mettre KMEMSIZE et PRIVVMPAGES assez important.
Client/API (ex:php) ----> MySQL Proxy ----- MySQL noeud + Noeud de données 1 | | | |-- Noeud de gestion 1 MySQL noeud | Noeud de données 2 |-- Noeud de gestion 2 |-----------------|
Machine physique: IP: 192.168.100.1 - Service: MySQL Proxy
Noeud de données 1 (machine virtuelle): IP: 192.168.127.1 - Service: MySQL server, ndbd
Noeud de données 2 (machine virtuelle): IP: 192.168.127.2 - Service: MySQL server, ndbd
Noeud de gestion 1 (machine virtuelle): IP: 192.168.127.3 - Service: ndb_mgmd
Noeud de gestion 2 (machine virtuelle): IP: 192.168.127.4 - Service: ndb_mgmd
Logiciels
On n'a besoin que de télécharger MySQL cluster ici
http://dev.mysql.com/downloads/cluster/
Le fichier que j'ai téléchargé est mysql-cluster-gpl-7.3.2-debian6.0-i686.deb
Installation
Sur toutes les noeuds, installer le parquet ci-dessus
dpkg -i mysql-cluster-gpl-7.3.2-debian6.0-i686.deb
Les fichiers sont installés dans /opt/mysql/
Configuration de noeud de gestion
Créer un répertoire mysql-cluster et un fichier de configuration config.ini
mkdir /opt/mysql/mysql-cluster mkdir /opt/mysql/mysql-cluster/data vim /opt/mysql/mysql-cluster/config.ini
Voici le contenu de fichier config.ini
[NDBD DEFAULT] NoOfReplicas=2 #2 noeuds de données DataDir=/opt/mysql/mysql-cluster/data/ DataMemory=280M IndexMemory=40M [MYSQLD DEFAULT] [NDB_MGMD DEFAULT] [TCP DEFAULT] # 2 Noeuds de gestion [NDB_MGMD] HostName=192.168.127.103 NodeId=1 [NDB_MGMD] HostName=192.168.127.104 NodeId=2 # 2 Noeuds de données [NDBD] HostName=192.168.127.101 NodeId=3 [NDBD] HostName=192.168.127.102 NodeId=4 # 2 MySQL serveur [MYSQLD] [MYSQLD]
Démarrer le service
/opt/mysql/server-5.6/bin/ndb_mgmd -f /opt/mysql/mysql-cluster/config.ini --initial --config-dir=/opt/mysql/mysql-cluster/ MySQL Cluster Management Server mysql-5.6.11 ndb-7.3.2
Configuration de noeud de données
Pour les noeud de données, il faut installer un pacquet de plus
aptitude install libaio1
Lancer le service ndbd (il faut assurer que tous les noeuds de gestion sont déjà lancé)
root@node2:/# /opt/mysql/server-5.6/bin/ndbd --initial -c 192.168.127.104:1186,192.168.127.103:1186 2013-10-08 07:26:43 [ndbd] INFO -- Angel connected to '192.168.127.104:1186' 2013-10-08 07:26:43 [ndbd] INFO -- Angel allocated nodeid: 4
Note: le paramètre --initial n'est utilisé que la première fois on lance le service. Les prochaines fois on n'en a pas besoins sauf que l'on veut supprimer les meta-data et les logs du noeud.
Configuration de MySQL serveur
Comme dans le package mysql-cluster-gpl-7.3.2-debian6.0-i686.deb il y a aussi un bin pour MySQL serveur, je l'utilise.
Créer utilisateur et group
groupadd mysql useradd -g mysql mysql chown -R mysql:mysql /opt/mysql/*
Création des bases initialles
mkdir /opt/mysql/server-5.6/data /opt/mysql/server5-6/scripts/mysql_install_db --user=mysql --datadir=/opt/mysql/server-5.6/data --basedir=/opt/mysql/server-5.6/
Editer le fichier /opt/mysql/server-5.6/my.cnf et mettre ces textes
[mysqld] basedir = /opt/mysql/server-5.6 datadir = /opt/mysql/server-5.6/bin user = mysql socket = /var/run/mysqld/mysqld.sock bind-address=0.0.0.0 event_scheduler=on default-storage-engine=ndbcluster ndbcluster ndb-connectstring=192.168.127.103,192.168.127.104 # IP/host of the NDB_MGMD-nodes key_buffer = 256M key_buffer_size = 256M sort_buffer_size = 256M read_buffer_size = 256M [mysql_cluster] ndb-connectstring=192.168.127.103,192.168.127.104 # IP/host of the NDB_MGMD-nodes
En suite lancer MySQL service
/opt/mysql/server-5.6/bin/mysqld_safe --datadir=/opt/mysql/server-5.6/data/ --basedir=/opt/mysql/server-5.6 & root@node2:/# 131008 07:37:30 mysqld_safe Logging to '/opt/mysql/server-5.6/data//node2.err'. 131008 07:37:30 mysqld_safe Starting mysqld daemon with databases from /opt/mysql/server-5.6/data/
Tester le cluster
Sur le noeud de gestion, lancer un client de gestion. Voir les noeuds sont actives et connectés
root@node3:/# /opt/mysql/server-5.6/bin/ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=3 @192.168.127.101 (mysql-5.6.11 ndb-7.3.2, Nodegroup: 0) id=4 @192.168.127.102 (mysql-5.6.11 ndb-7.3.2, Nodegroup: 0, Master) [ndb_mgmd(MGM)] 2 node(s) id=1 @192.168.127.103 (mysql-5.6.11 ndb-7.3.2) id=2 @192.168.127.104 (mysql-5.6.11 ndb-7.3.2) [mysqld(API)] 2 node(s) id=5 @192.168.127.102 (mysql-5.6.11 ndb-7.3.2) id=6 @192.168.127.101 (mysql-5.6.11 ndb-7.3.2)
Sur un MySQL server, voir si il support bien moteur de storckage ndbcluster
#mysql mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | ndbcluster | DEFAULT | Clustered, fault-tolerant tables | YES | NO | NO |
On peut tester le replication en créant un table sur MySQL server 1 et inserer quelques données. En suite se logger à MySQL server 2 et voir bien ce table avec les données inserées
Pour que les users et privileges sont bien clonés sur les noeuds de données, il faut changer le type de stockage de quelques tables
mysql> ALTER TABLE mysql.user ENGINE=NDBCLUSTER; Query OK, 6 rows affected (0.25 sec) Records: 6 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE mysql.db ENGINE=NDBCLUSTER; Query OK, 2 rows affected (0.16 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE mysql.tables_priv ENGINE=NDBCLUSTER; Query OK, 0 rows affected (0.16 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> ALTER TABLE mysql.columns_priv ENGINE=NDBCLUSTER; Query OK, 0 rows affected (0.16 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SET GLOBAL event_scheduler=1; Query OK, 0 rows affected (0.00 sec) mysql> CREATE EVENT `mysql`.`flush_priv_tables` ON SCHEDULE EVERY 30 second ON COMPLETION PRESERVE DO FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
Installation MySQL proxy
aptitude install mysql-proxy
Editer le fichier de configuration /etc/mysql-proxy/mysql-proxy.conf (il faut le créer) et mettre ces textes
[mysql-proxy] daemon = true keepalive = true proxy-address = 192.168.100.1:3306 # MySQL noeud proxy-backend-addresses = 192.168.127.101:3306,192.168.127.102:3306
Lancer le proxy
chmod 660 /etc/mysql-proxy/mysql-proxy.conf mysql-proxy --defaults-file=/etc/mysql-proxy/mysql-proxy.conf
Teste final
Création d'utilisateur : Connecter directement avec un de serveur MySQL.
#mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.6.11-ndb-7.3.2-cluster-gpl MySQL Cluster Community Server (GPL) mysql> grant all privileges on test.* to test@192.168.100.1 identified by 'test'; mysql> flush privileges;
Maintenant on peut connecter avec le proxy comme un serveur MYSQL
mysql -h 192.168.100.1 -u test -p
Quand on éteint 1 serveur de gestion, ou bien 1 serveur de données, on peut toujours acceder au cluster. Et ce que l'on appèlle HA (High Availability)