LinuxPedia

Wiki libre et indépendant dédié à GNU-Linux et BSD.

Outils pour utilisateurs

Outils du site


opensuse:mysqlcluster

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:

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 <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:

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:

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

opensuse/mysqlcluster.txt · Dernière modification : 2018/11/17 12:54 de 127.0.0.1