#format wiki
#language fr
= 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)