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)

TruongTungLam/MySqlCluster (dernière édition le 2013-10-09 02:38:22 par TruongTungLam)