#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)