Table des matières
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 <nom du package>
- 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:
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 <id>,<id>… Add a Nodegroup containing nodes
DROP NODEGROUP <NG> Drop nodegroup with id NG
START BACKUP [NOWAIT | WAIT STARTED | WAIT COMPLETED]
START BACKUP [<backup id>] [NOWAIT | WAIT STARTED | WAIT COMPLETED]
START BACKUP [<backup id>] [SNAPSHOTSTART | SNAPSHOTEND] [NOWAIT | WAIT STARTED | WAIT COMPLETED]
Start backup (default WAIT COMPLETED,SNAPSHOTEND)
ABORT BACKUP <backup id> Abort backup
SHUTDOWN Shutdown all processes in cluster
CLUSTERLOG ON [<severity>] … Enable Clus
<severity> = ALERT | CRITICAL | ERROR | WARNING | INFO | DEBUG
<category> = STARTUP | SHUTDOWN | STATISTICS | CHECKPOINT | NODERESTART | CONNECTION | INFO | ERROR | CONGESTION | DEBUG | BACKUP
<level> = 0 - 15
<id> = 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 <nom du package>
Parametrage du Serveur de Stockage
le serveur de stockage est paramétré grace au fichier /etc/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 <nom du package>
- 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:
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
<note importante>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. </note>
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 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 #
<note importante> 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</note>
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 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 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 #
<note>
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 </note>
Pour plus de précisions voir la doc sur la 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