====== Cluster Mysql sur OpenSuSE 11.0/2/3 ====== ===== pré-requis ===== Cette documentation est faite sur la base d'un cluster en production contenant 7 serveurs Apache/Mysql (SQL nodes), 2 serveurs de stockage ( Storage Nodes ) avec chacun 8 Go de Ram, 1 serveur de management. La configuration suivante peut être adaptée pour monter le cluster sur seulement 2 serveurs (petit cluster...) Voici l'ensemble des packages à télécharger chez Mysql pour l'installation de ce cluster : * MySQL-Cluster-gpl-client-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-devel-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-management-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-server-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-shared-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-tools-7.0.6-0.sles10.x86_64.rpm   Vous pouvez aussi les télécharger sur http://rpm.pbone.net/  ===== Serveur de Management ===== ==== Installation du Serveur de Management ====   Le serveur qui a servi pour le management est un serveur lambda : HP Proliant DL 360 G5 mono proc Intel(R) Xeon(TM) CPU 3.00GHz 1 Go de RAM 2 disques de 36 Go en raid 1 Open Suse installé en version minimale Partitionement : * /boot 200 Mo * / 16 Go * swap 2 Go * /var 17 Go Packages à installer via la commande  ''#rpm -ivh '' * MySQL-Cluster-gpl-tools-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-management-7.0.6-0.sles10.x86_64.rpm     ==== Paramétrage du Serveur de Management ==== Le paramétrage se fait dans le fichier de configuration /var/lib/mysql-cluster/confi.ini dont voici un exemple avec quelques explications: [[opensuse:mysqlcluster:config.ini|config.ini]]   ==== Lancement du Manageur ==== Le lancement du manageur se fait via la commande: ''#ndb_mgmd -f /var/lib/mysql-cluster/config.ini'' Lors du lancement de cette commande, il est créé un fichier binaire dans le répertoire de mysql-cluster. Ce fichier est visiblement le fichier de configuration compilé. Lors d'un changement de configuration, veillez à effacer ce fichier binaire sinon le cluster ne prendra pas en compte vos modifications.   ==== Outil ndb_mgm ====   Cet outil permet la gestion du cluster. A lancer via un terminal ''#ndb_mgm\\ -- NDB Cluster -- Management Client --\\ ndb_mgm> show\\ Connected to Management Server at: localhost:1186\\ Cluster Configuration\\ ---------------------\\ [ndbd(NDB)]     2 node(s)\\ id=1    @192.168.xxx.82  (mysql-5.1.34 ndb-7.0.6, Nodegroup: 0, Master)\\ id=2    @192.168.xxx.83  (mysql-5.1.34 ndb-7.0.6, Nodegroup: 0)\\ [ndb_mgmd(MGM)] 1 node(s)\\ id=20   @192.168.xxx.86  (mysql-5.1.34 ndb-7.0.6)\\ [mysqld(API)]   10 node(s)\\ id=21 (not connected, accepting connect from 192.168.xxx.82)\\ id=22 (not connected, accepting connect from 192.168.xxx.83)\\ id=30   @192.168.xxx.84  (mysql-5.1.34 ndb-7.0.6)\\ id=31   @192.168.xxx.85  (mysql-5.1.34 ndb-7.0.6)\\ id=41   @192.168.xxx.74  (mysql-5.1.34 ndb-7.0.6)\\ id=42   @192.168.xxx.75  (mysql-5.1.34 ndb-7.0.6)\\ id=43   @192.168.xxx.73  (mysql-5.1.34 ndb-7.0.6)\\ id=44   @192.168.xxx.72  (mysql-5.1.34 ndb-7.0.6)\\ id=45   @192.168.xxx.71  (mysql-5.1.34 ndb-7.0.6)\\ id=46   @192.168.xxx.56  (mysql-5.1.34 ndb-7.0.6)''   \\ La commande show vous permet de voir l'état de votre cluster.\\ Une autre commande intéressante est "all dump 1000", qui permet de voir l'utilisation de la ram allouée : ''ndb_mgm> all dump 1000;\\ Sending dump signal with data:\\ 0x000003e8 Sending dump signal with data:\\ 0x000003e8 \\ Node 1: Index usage is 2%(1328 8K pages of total 64032)\\ Node 1: Data usage is 47%(62030 32K pages of total 129536)\\ Node 2: Index usage is 2%(1329 8K pages of total 64032)\\ Node 2: Data usage is 47%(62023 32K pages of total 129536)'' d'autre options sont accessible via la commande help\\ ''ndb_mgm> help\\ ---------------------------------------------------------------------------\\  NDB Cluster -- Management Client -- Help\\ ---------------------------------------------------------------------------\\ HELP                                   Print help text\\ HELP COMMAND                           Print detailed help for COMMAND(e.g. SHOW)\\ SHOW                                   Print information about cluster\\ CREATE NODEGROUP ,...          Add a Nodegroup containing nodes\\ DROP NODEGROUP                     Drop nodegroup with id NG\\ START BACKUP [NOWAIT | WAIT STARTED | WAIT COMPLETED]\\ START BACKUP [] [NOWAIT | WAIT STARTED | WAIT COMPLETED]\\ START BACKUP [] [SNAPSHOTSTART | SNAPSHOTEND] [NOWAIT | WAIT STARTED | WAIT COMPLETED]\\                                        Start backup (default WAIT COMPLETED,SNAPSHOTEND)\\ ABORT BACKUP                Abort backup\\ SHUTDOWN                               Shutdown all processes in cluster\\ CLUSTERLOG ON [] ...         Enable Clus\\ = ALERT | CRITICAL | ERROR | WARNING | INFO | DEBUG\\ = STARTUP | SHUTDOWN | STATISTICS | CHECKPOINT | NODERESTART | CONNECTION | INFO | ERROR | CONGESTION | DEBUG | BACKUP\\     = 0 - 15\\        = ALL | Any database node id\\ For detailed help on COMMAND, use HELP COMMAND.'' l'Url suivante peut etre interressante:\\ http://dev.mysql.com/doc/refman/5.1/...s-ndb-mgm.html ===== Serveur de Stockage ===== ==== Installation du Serveur de Stockage ==== les serveurs qui ont servi pour les  Storage Nodes sont des serveurs:\\ HP Proliant DL 360 G5 biproc quad core Intel(R) Xeon(R) CPU X5450  @ 3.00GHz  avec 8Go de RAM, 2 disques 72Go en raid 1\\ Open Suse installé en version minimum\\ Partitionement * /boot 200Mo * / 16Go * swap 8Go * /var 21Go * /var/lib/mysql 26Go sur cette machine installer les packages suivant:\\ * MySQL-Cluster-gpl-storage-7.0.6-0.sles10.x86_64.rpm via la commande:\\ ''#rpm -ivh ''   ==== Parametrage du Serveur de Stockage ==== le serveur de stockage est paramétré grace au fichier /etc/my.cnf: [[opensuse:mysqlcluster:my.cnf|my.cnf]]   ==== Lancement du Serveur de Stockage ==== Le serveur de stockage doit etre lancé la première fois avec l'option --initial\\ ''#ndbd - -initial''\\ cette option ré-initialise le serveur de stockage Une fois la base de données importée, il suffira de lancer uniquement :\\ ''#ndbd''\\ A partir de ce moment, lorsque vous faites la commande show sur le serveur de management vous devez voir votre noeud de stockage. Pour information, il existe un autre binaire à lancer en lieu et place de ndbd : c'est ndbmtd qui est l'equivalent mais en multi-thread (celui que j'utilise aujourd'hui). Plus de détails sur : http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-programs-ndbmtd.html ===== Serveur Mysql ===== ==== Installation du Serveur Mysql ==== Les serveurs qui ont servi pour les Storage Nodes sont : HP Proliant DL 360 G5 biproc quad core Intel(R) Xeon(R)\\ CPU X5450  @ 3.00GHz \\ 8 Go de RAM \\ 2 disques 72 Go en raid 1\\ Open Suse installé en version minimum Partitionement * /boot 200 Mo * / 16 Go * swap 8 Go * /var 21 Go * /srv 26 Go Packages installés via la commande : ''#rpm -ivh ''\\ * MySQL-Cluster-gpl-server-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-shared-7.0.6-0.sles10.x86_64.rpm * MySQL-Cluster-gpl-devel-7.0.6-0.sles10.x86_64.rpm (uniquement si comme moi, vous vouler compiler un truc à la main - pour moi PHP)   ==== Parametrage du Serveur Mysql ==== Le serveur Mysql est paramétré grace au fichier /etc/my.cnf: [[opensuse:mysqlcluster:my.cnf|my.cnf]] ==== Lancement du Serveur Mysql ==== Comme tout serveur, mysql il se lance via la commande : ''#/etc/init.d/mysql start''\\ Si le démarrage du serveur vous pose souci, n'hésitez pas à le réinstaller : ''#rpm -e MySQL-Cluster-gpl-server\\ #rpm -ivh MySQL-Cluster-gpl-server'' voici une procédure qui m'a permis de rentrer les serveurs Mysql récalcitrants dans le cluster: faites les commandes suivantes /etc/init.d/mysql stop mysqld_safe --skip-grant-tables --skip-networking & mysql mysql dans mysql tapez les commandes suivantes update user set password=password('xxxxx') where user="root" exit une fois sorti, faites les commandes suivantes mysqladmin shutdown /etc/init.d/mysql start La, du moins pour moi, les machines rentrent dans le cluster immédiatement. Il doit démarrer rapidement A partir de ce moment, lorsque vous faites la commande show sur le serveur de management vous devez voir votre serveur Mysql. ==== Annexes concernant le Serveur Mysql ====   Il faut savoir que pour plusieurs serveurs mysql la base de données doit être créée sur chaque SQL node via :\\ ''mysql>create database truc''\\ pour pouvoir avoir accès à la base de donnée du cluster ainsi que les droits des user via\\ ''mysql>grant priv''   ===== Import d'une base ===== ==== via mysql ==== le cluster mysql fait tourner les bases avec le moteur ndbcluster Dans l'exemple suivant nous verrons comment retoucher un dump pour changer le moteur de base de Myisam en NDBcluster tout d'abord quelques généralités : Lors de la création de la base et des tables, on spécifie le moteur MyIsam,InnoDB ou ndbcluster (il en existe d'autre voir [[http://fr.wikipedia.org/wiki/MySQL#Moteurs_de_base_de_donn.C3.A9es_inclus|ici]]) Donc si on édite le dump fait depuis un moteur MyISAM, nous trouverons à la création des tables quelque-chose comme : CREATE TABLE `folders` ( `id` tinyint(11) NOT NULL AUTO_INCREMENT, `name` varchar(127) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `position` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; Ce qui nous importe est l'option **ENGINE=MyISAM** La commande suivante permet de changer dans tous le dump le moteur MyISAM en ndbcluster sed -e s/MyISAM/ndbcluster/g test.dump > test2.dump Si ensuite vous éditez le fichier test2.dump, au meme endroit que dans le premier vous trouverez ceci: CREATE TABLE `folders` ( `id` tinyint(11) NOT NULL AUTO_INCREMENT, `name` varchar(127) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `position` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=ndbcluster AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; Une fois cette modification faite, vous pouvez importer le nouveau dump dans le cluster via mysql -p test < test2.dump c'est importé ;) ==== via ndb_restore ==== La commande ndb_restore fait partie du package MySQL-Cluster-gpl-tools-7.0.6-0.sles10 Le cluster est composé de deux storage nodes. Si jamais l'un des deux crashe, vous en remontez un puis vous démarrez ndbd. Une fois started, il est restauré. Dans le cas d'un crash du cluster entier : Recréez-en un, puis une fois le nouveau cluster vide installé, allez dans le répertoire de backup que vous aurez pris soin de sauvegarder de temps à autre sur une machine capable de se connecter au cluster (emplacememnt [mysqld] voir le config.ini). Choisissez un de vos backup et rentrez dans le répertoire correspondant cd BACKUP-223/ dans lequel vous devriez retrouver ce genre de fichier: test-cluster1:/var/lib/mysql/BACKUP/BACKUP-223 # ls -alrt total 96 drwxr-x--- 6 root root 160 déc. 14 14:59 .. drwxr-x--- 2 root root 152 déc. 14 14:59 . -rw-r--r-- 1 root root 52 déc. 14 14:59 BACKUP-223.1.log -rw-r--r-- 1 root root 33912 déc. 14 14:59 BACKUP-223.1.ctl -rw-r--r-- 1 root root 55112 déc. 14 14:59 BACKUP-223-0.1.Data test-cluster1:/var/lib/mysql/BACKUP/BACKUP-223 # Si vous repartez d'un cluster non vide, avant de démarrer les ndbd avec l'option --initial veillez à bien vider le répertoire défini par la variable datadir Une fois cela fait lancer la commande suivante : ndb_restore -c connectstring -b backupid -n nodeid -m -r sachant que : * **-c** correspond au connecstring que vous avez rentré dans la conf du cluster * **-b** le numéro du backup * **-n** le numéro du storage Node sur lequel vous avez récupérer le Backup * **-m** pour reconstruire les metadata (création de tables uniquements) * **-r** pour insérer les données du fichier .data Cela doit vous donner un truc dans ce genre : test-cluster1:/var/lib/mysql/BACKUP/BACKUP-223 # ndb_restore -c 192.168.200.40 -b 223 -n 1 -m -r Backup Id = 223 Nodeid = 1 backup path = ./ Opening file './BACKUP-223.1.ctl' Backup version in files: ndb-6.3.11 ndb version: mysql-5.1.34 ndb-7.0.6 Stop GCP of Backup: 0 Connected to ndb!! Successfully restored table `rss/def/tag` Successfully restored table event REPL$rss/tag Successfully restored table `rss/def/metatag` Successfully restored table event REPL$rss/metatag Successfully restored table `test/def/CTEST` Successfully restored table event REPL$test/CTEST Successfully restored table `rss/def/channels` Successfully restored table event REPL$rss/channels Successfully restored table `rss/def/folders` Successfully restored table event REPL$rss/folders Successfully restored table `rss/def/rating` Successfully restored table event REPL$rss/rating Successfully restored table `rss/def/config` Successfully restored table event REPL$rss/config Successfully restored table `rss/def/item` Successfully restored table event REPL$rss/item Successfully created index `PRIMARY` on `channels` Successfully created index `PRIMARY` on `item` Successfully created index `ttype` on `metatag` Successfully created index `cid` on `item` Successfully created index `tid` on `metatag` Successfully created index `PRIMARY` on `tag` Successfully created index `PRIMARY` on `config` Successfully created index `name` on `folders` Successfully created index `tag` on `tag` Successfully created index `url` on `item` Successfully created index `id` on `tag` Successfully created index `name$unique` on `folders` Successfully created index `PRIMARY` on `folders` Successfully created index `fid` on `metatag` Successfully created index `tag$unique` on `tag` Opening file './BACKUP-223-0.1.Data' _____________________________________________________ Processing data in table: rss/def/tag(29) fragment 0 _____________________________________________________ Processing data in table: rss/def/metatag(24) fragment 0 _____________________________________________________ Processing data in table: rss/def/NDB$BLOB_19_5(20) fragment 0 _____________________________________________________ Processing data in table: rss/def/NDB$BLOB_10_1(11) fragment 0 _____________________________________________________ Processing data in table: sys/def/NDB$EVENTS_0(3) fragment 0 _____________________________________________________ Processing data in table: rss/def/NDB$BLOB_10_2(12) fragment 0 _____________________________________________________ Processing data in table: mysql/def/ndb_apply_status(6) fragment 0 _____________________________________________________ Processing data in table: rss/def/NDB$BLOB_10_4(13) fragment 0 _____________________________________________________ Processing data in table: test/def/CTEST(7) fragment 0 _____________________________________________________ Processing data in table: rss/def/channels(8) fragment 0 _____________________________________________________ Processing data in table: rss/def/folders(15) fragment 0 _____________________________________________________ Processing data in table: rss/def/rating(28) fragment 0 _____________________________________________________ Processing data in table: rss/def/config(10) fragment 0 _____________________________________________________ Processing data in table: mysql/def/NDB$BLOB_4_3(5) fragment 0 _____________________________________________________ Processing data in table: rss/def/item(19) fragment 0 _____________________________________________________ Processing data in table: sys/def/SYSTAB_0(2) fragment 0 _____________________________________________________ Processing data in table: mysql/def/ndb_schema(4) fragment 0 Opening file './BACKUP-223.1.log' Restored 46 tuples and 0 log entries NDBT_ProgramExit: 0 - OK Pour plus de détails, voir la doc de [[http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-programs-ndb-restore.html|ndb_restore]] ===== Export de Base (Backup) ===== ==== via mysqldump ==== La commande mysqldump fonctionne exactement comme d'habitude via l'un des SQL Node (pour plus de détails sur Mysql et mysqldump voir [[serveurs:mysql|Serveur MySQL]]) ==== via ndb_mgm ==== Pour faire un backup depuis l'outil de management : lancer ndb_mgm dans un terminal: test-manager:~ # ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> ensuite il vous faut taper : **START BACKUP (un numero pour les différencier) [options d'etat du cluster][options d'attentes]** vous avez deux choix pour les options d'état * **SNAPSHOTSTART** le backup reflete l'etat du cluster avant le backup * **SNAPSHOTEND** le backup reflete l'etat du cluster après le backup (option par defaut) vous avez trois choix pour les options d'attente * **NOWAIT**:ndb_mgm vous rends la main immediatement * **WAIT STARTED**:il vous rends la main juste après le depart du backup * **WAIT CONPLETED**: il vous rend la main une fois la backup terminer (option par défaut) quand vous le lancez cela doit vous donner cela : test-manager:~ # ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> start backup Connected to Management Server at: localhost:1186 Waiting for completed, this may take several minutes Node 1: Backup 223 started from node 20 Node 1: Backup 223 started from node 20 completed StartGCP: 204628 StopGCP: 204631 #Records: 2173 #LogRecords: 0 Data: 103544 bytes Log: 0 bytes ndb_mgm> Vous trouverez votre backup dans le datadir défini dans le config.ini pour nous:/var/lib/mysql/BACKUP sur les deux noeuds test-cluster2:/var/lib/mysql/BACKUP/BACKUP-1 # ls -alrt total 92 drwxr-x--- 2 root root 152 déc. 14 13:38 ./ drwxr-x--- 6 root root 160 déc. 14 15:02 ../ -rw-r--r-- 1 root root 49480 déc. 14 13:39 BACKUP-1-0.2.Data -rw-r--r-- 1 root root 33912 déc. 14 13:39 BACKUP-1.2.ctl -rw-r--r-- 1 root root 52 déc. 14 13:39 BACKUP-1.2.log test-cluster2:/var/lib/mysql/BACKUP/BACKUP-1 # Si vous lancez le backup via un script et que vous utilisez la commande **ndb_mgm -e start backup** l'id/numéro est requis Pour plus de précisions voir la doc sur la [[http://dev.mysql.com/doc/mysql-cluster-excerpt/5.1/en/mysql-cluster-backup-using-management-client.html|Console de Management]] ===== Annexes et liens utiles ===== Ce cluster prend en pleine charge environ 26000 questions par minutes et fonctionne depuis maintenant deux ans http://dev.mysql.com/doc/mysql-cluster-excerpt/5.1/en/index.html\\ http://www.lephpfacile.com/manuel-mysql/ndbcluster.php\\