Installation MySQL Cluster NDB

Posted by on 7/sept/2011 in A la Une, Bases de données, Continuité de service, MySQL | 0 comments

Installation MySQL Cluster NDB

MySQL Cluster est dit un cluster « in memory », cela signifie que la plupart des éléments sont, pour des raisons de performance, chargés en mémoire et que ceux-ci sont régulièrement écris sur disque selon divers critères. Il est donc très important que les nœuds de stockage du cluster soient pourvus de beaucoup de mémoire.

Le cluster MySQL ne dispose pas de système de fichier partagé (via SAN, …) comme un cluster au sens « classique » du terme mais dispose d’éléments de dialogue réseau qui lui permet de synchroniser les données du cluster au sein de tous ses nœuds. Les données d’un cluster MySQL sont stockées sur des disques locaux des différents serveurs du cluster et les données partagées sont « répliquées » par des processus internes entre les différentes composantes du cluster.

L’élément fondamental du cluster MySQL est donc la capacité à traiter rapidement et efficacement des requêtes réseau sous le protocole TCP/IP (cartes Ethernets gigabits requises, sockets SCI recommandés).

La documentation indique des options permettent de faire en sorte que le Cluster mySQL écrive sur disque, mais celle-ci sont très consommatrices en ressources et peuvent dégrader de façon significative les performances.

1.  Introduction

1.1       Les « nœuds » (ou « nodes ») : composantes de base de MySQL-Cluster

Un élément serveur logiciel élémentaire de mySQL Cluster se nomme un « node » (ou « nœud »). Un node est un élément logique, aussi, il peut exister plusieurs nodes sur une machine physique composante d’un cluster mySQL.

La nature d’un Un node peut être de divers nature :

-          Node de STOCKAGE (NDB) :

Le node de stockage (ou node NDB du nom du moteur de cluster « NDBENGINE ») est un nœud chargé de gérer, avec l’ensemble des autres nodes de même nature, la répartition des données sur l’ensemble des nodes de stockage du cluster, d’en assurer la réplication inter-nodes afin de garantir la disponibilité des datas et enfin de gérer les demandes d’accès aux données.

Au vue des forts besoins en mémoire du Cluster mySQL, il est recommandé d’installer des versions 64bits des nœuds NDB afin de passer la barrière fatidique des 3096Go de mémoire maximale sur une 32bits linux.

Dans notre exemple (Cluster « CLUSTER») nous utiliserons 2 nœuds NDB situés en

  • 10.20.0.29 (SITSQL01) [ machine physique ]
  • 10.20.0.30 (SITSQL02) [ machine physique ]

Les nodes NDB sont au minimum de 2 dans un cluster mySQL.

-          Node MANAGER  (MGM):

Les nodes MGM (ou « Manager) sont les nœuds du cluster chargés en permanence d’informer les autres nœuds de la configuration du cluster (où sont les nœuds et quelles sont leur nature et leur état, …) et de son rythme de vie (quelles sont les demandes de synchronisations, …)

Dans notre exemple (Cluster « CLUSTER») nous utiliserons 2 nœuds MGM situés en

  • 10.20.0.27 [ machine Xen ]
  • 10.20.0.28 [ machine Xen ]

Les nodes MGM sont au minimum de 1 dans un cluster mySQL (2 recommandés).

-          Node SQL (SQL):

L’accès aux données stoquées sur les nodes NDB ne se fait pas de façon standard, comme pour un serveur mySQL autonome, il faut utiliser un API spécifique dit « NDB API ».

Dans le but de rendre compatible des applications écrites pour des serveurs autonomnes, il faut alors ajouter au cluster des nodes dits « SQL » qui sont des interfaces entre les API clientes standards et les nodes NDB.

Dans notre exemple (Cluster « XXX ») nous utiliserons 2 nœuds MGM situés en

  • 10.20.0.25  [ machine Xen ]
  • 10.20.0.26  [ machine Xen ]

Les nodes SQL sont au minimum de 1 dans un cluster mySQL (2 recommandés).

Dans une production, un cluster mySQL est donc composé à minima de 6 nodes (2 SQL, 2 MGM, 2 NDB) répartis sur 6 machines différentes dans un souci de haute disponibilité des données et de leur accès.

Notons que le cluster au sens de mySQL ne garanti pas la répartition de charge au sein des nodes SQL, il faudra se munir d’outils annexes (HAProxy, LVS/KeepAlive, etc.) pour cela.

Remarque : Dans le cas du cluster XXXX, voici les adresses contactables :

  • Load balance : sql0.site.fr (serveur à utiliser par les applicatifs)
  • Nœud 1 : sql1.site.fr
  • Nœud 2 : sql12.site.fr

2.  Installation

2.1 Introduction

Les méthodes d’installation sont basées sur l’exploitation des outils d’installation disponibles sur une openSuSE 11.3 (x86_64).

2.2       Les packages nécessaires

Sur les nœuds MGM :

-          libmysqlclient16

-          libmysqlclient_r16

-          libmysqlclusterclient16

-          libmysqlclusterclient_r16

-          libmysqld0

-          libqt4-sql-mysql

-          mysql-cluster-client

-          mysql-cluster-ndb-management

-          mysql-cluster-ndb-tools

Sur les nœuds SQL :

-          libmysqlclient-devel

-          libmysqlclient16

-          libmysqlclient_r16

-          libmysqlclusterclient16

-          libmysqlclusterclient_r16

-          libmysqlcppconn-devel

-          libmysqlcppconn1

-          libmysqld-devel

-          libmysqld0

-          libqt4-sql-mysql

-          mysql-cluster

-          mysql-cluster-client

Sur les nœuds NDB :

-          libmysqlclient16

-          libmysqlclient_r16

-          libmysqld0

-          libqt4-sql-mysql

-          mysql-cluster-ndb-storage

-          mysql-cluster-ndb-tools

-          mysql-community-server

-          mysql-community-server-client

2.3       Fonctionnalités hors distribution

2.3.1      Introduction

Pour une correcte gestion de l’annulation d’un post traitement dans une procédure stockée ou un trigger, nous avons besoin d’ajouter une fonctionnalité supplémentaire livrée la librairie « lib_mysqludf_udf.so » téléchargeable ici : http://www.mysqludf.org/lib_mysqludf_udf/lib_mysqludf_udf_0.0.3.tar.gz.

-          Cette librairie est écrite en langage C, il convient d’installer gcc ainsi que les headers mySql (package libmysqlcppconn-devel) pour pouvoir la compiler.

2.3.2      Installation et configuration


1- Compilation

En supposant que les headers mySQl se trouvent dans le répertoire « /usr/include/mysql », voici la commande à lancer pour compiler la librairie :

gcc -shared lib_mysqludf_udf.c -o lib_mysqludf_udf.so -I /usr/include/mysql

 

2- Installation

 

Il faut copier la librairie « lib_mysqludf_udf.so » dans le répertoire de partage de mySQL, appelé aussi dossier des « plugins ». Pour connaitre son emplacement, il suffit de se connecter au serveur SQL et de localiser la variable « plugin_dir » en réponse à la commande « show variables ».

 

Il faudra ensuite créer une fonction SQL utilisant les fonctions de cette librairie en se connectant au serveur mySQL et en tapant :

 

USE <MABASE>; ç ATTENTION: la fonction est stockée dans la base de données !

CREATE FUNCTION udf_initid_error RETURNS INTEGER SONAME ‘lib_mysqludf_udf.so’;

 

La fonction « udf_initd_error(message   varchar(255)) » est alors disponible dans la database mySQL et permet de provoquer des exceptions afin principalement d’interrompre les traitements des triggers en cas d’erreurs logique.

Remarque : Attention, il faut reproduire l’installation / configuration sur tous les nœuds SQL.

 

3.  Configuration


3.1       Configuration des nœuds SQL

Créer l’arborescence suivante sur chaque nœud SQL :

/data

/data/mysql

/data/mysql/databases

/data/mysql/libs   (<= dossier de sauvegarde de l’UDF mysql définie en 2.3)

/data/mysql/run

Indiquer dans le fichier hosts de la machine les mappages nom/adresse des serveurs de managment (2 dans cet exemple) :

Exemple :

10.20.0.27   sql-mgm-01

10.20.0.28   sql-mgm-02

La configuration d’un nœud SQL consiste à renseigner de façon élémentaire /etc/my.cnf comme pour un serveur mySQL autonome, le nœud va charger grâce à cela sa configuration sur l’un des MGM nodes.

/etc/my.cnf :

[client]
port            = 3306
socket          = /data/mysql/run/mysql.sock
[mysqld]
port            = 3306
socket          = /data/mysql/run/mysql.sock
datadir = /data/mysql/databases
skip-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
ndbcluster
ndb-connectstring=sql-mgm-01sql-mgm-02
default-storage-engine=ndbcluster
default-table-type=ndbcluster

La commande d’administration sera « rcmysql », voir 4.1.2.

3.2       Configuration des nœuds NDB :

Créer l’arborescence suivante sur chaque nœud NDB :

/data

/data/mysql

/data/mysql/backups  (dossier de stockage des backups des réplicas sur ce nœud, voir 5.2)

/data/mysql/datafiles   (dossier de stockage des données des réplicas sur ce noeud)

/data/mysql/logs (fichiers de logs pour debugging)

/data/mysql/undofiles  (fichiers d’annulation des transactions (rollbacks))

Le fichier /etc/my.cnf contient la définition d’accès aux serveurs de managment pour le nœud NDB :

[mysqld]
port            = 3306
socket          = /var/run/mysql/mysql.sock
datadir = /data/mysql
skip-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
[MYSQL_CLUSTER]
ndb-connectstring=sql-mgm-01,sql-mgm-02

La commande d’administration sera « rcndbd », voir 4.1.3.

3.3       Configuration des nœuds MGM

Les nœuds MGM propagent la configuration de tous les nœuds du cluster sur l’ensemble des nœuds (SQL et NDB et MGM). Les fichiers de config de ces nœuds sont donc fondamentaux, sont pris en compte lors du démarrage des nœuds MGM. Il est recommandé d’utiliser une configuration de partage globale (SAN, nfs, …) pour que chaque nœud utilise lors de son démarrage et sans ambigüité la configuration n fixée par l’administrateur.

Créer l’arborescence suivante sur chaque nœud MGM :

/data

/data/mysql

/data/mysql/config

/data/mysql/logs

Le démarrage d’un serveur MGM mySQL se fait par la prise en compte d’un fichier de configuration que l’on stoque dans /data/mysql/config/config.ini :

[TCP DEFAULT]
SendBufferMemory=2M
ReceiveBufferMemory=2M
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=3072M
IndexMemory=3842M
LockPagesInMainMemory=1
[NDB_MGMD]
ID=27
HostName=10.20.0.27
[NDB_MGMD]
ID=28
HostName=10.20.0.28
DataDir=/data/mysql/logs
[NDBD]
ID=29
HostName=10.20.0.29
DataDir=/data/mysql/logs
FileSystemPath=/data/mysql/datafiles
FileSystemPathUndoFiles=/data/mysql/undofiles
BackupDataDir=/data/mysql/backups
[NDBD]
ID=30
HostName=10.20.0.30
DataDir=/data/mysql/logs
FileSystemPath=/data/mysql/datafiles
FileSystemPathUndoFiles=/data/mysql/undofiles
BackupDataDir=/data/mysql/backups
[MYSQLD]
ID=25
HostName=10.20.0.25
[MYSQLD]
ID=26
HostName=10.20.0.26
[MYSQLD]
ID=50

Cette configuration est évidement à adapter en fonction des besoins. Ici nous utilisons deux nœuds SQL, deux nœuds MGM et deux nœuds NDB.

La commande d’administration sera « rcndb_mgmd », voir  4.1.3.

Remarque : Une même et seule version du fichier de configuration « config.ini » doit être présent sur tous les nœuds MGM lors d’un démarrage, pour cela, on peut utiliser la commande :

rcndb_mgmd propage-config

qui propage le fichier config.ini du node MGM sur lequel on est connecté vers tous les autres.

4. Administration


4.1 Options de démarrage des nodes

4.1.1 Noeuds MGM

Ces nœuds sont à démarrer en premier dans le cluster. Sans les nœuds de management démarrés, les autres nœuds (SQL et NDB) risquent de rencontrer des problèmes d’annonce au cluster.

Le lancement et l’arrêt d’un nœud SQL se fait de la même manière que pour un serveur mySQL autonome avec

rcndb_mgmd    start : démarre le nœud

stop : stoppe le nœud, arrête tous les nœuds NDB et tous les nœuds MGM

status : indique l’ensemble des nœuds configurés et annoncés au cluster

init : démarre le nœud à l’indentique de « start » mais écrase la configuration binaire pour prendre en compte le fichier /data/mysql/config/config.ini

Différences sur « init » et « start » :

Lors d’un démarrage du nœud en « init », le fichier de configuration textuel est parsé et est fabriqué un fichier de configuration binaire à ses cotés. Le fichier de configuration binaire permet de prendre des modifications de la configuration du cluster de façon dynamique alors qu’il faut relancer les nœuds dans le cadre d’e la prise en compte de config.ini.

Le démarrage en mode « start » ne prend en compte que le fichier de configuration binaire.

4.1.2      Nœuds SQL

Le lancement et l’arrêt d’un nœud SQL se fait de la même manière que pour un serveur mySQL autonome avec

rcmysql               start : démarre le nœud

stop : stoppe le nœud

4.1.3      Nœuds NDB

Le lancement et l’arrêt d’un nœud NDB se fait par la commande

rcndbd                start : démarre le nœud

stop : stoppe le nœud (ne doit jamais être utilisé, les nodes NDB doivent être arrêtés depuis les nodes MGM, comme indiqué en  4.3.4. Cette option est à utiliser en cas d’urgence seulement, des pertes de données sont possibles alors)

format : DANGER : efface toutes les données du nœud et le démarre (utilisé principalement pour les premiers démarrages et pour certains les recovery)

4.2       Démarrage / Arrêt du Cluster

L’opération d’arrêt / marche du cluster n’est pas anodine et ne doit pas normalement être utilisée, sauf pour des cas extrêmes (maintenance, …), en effet, tous les nœuds vont être stoppés ou lancés, cette opération peut notamment provoquer des pertes de données si elle est effectuée en activité.

L’arrêt et marche du cluster consiste à arrêter / démarrer les nœuds dans un ordre bien précis :

4.2.1      Démarrage :

-          Sur MGM-01

rcndb_mgmd  init

Vérifier avec rcndb_mgmd  status (voir 4.3.1)

-          Sur MGM-02

rcndb_mgmd  init

Vérifier avec rcndb_mgmd  status (voir 4.3.1)

-          Sur NDB-01

rcndbd   start

Vérifier avec ps ax  |  grep ndb que deux process ndbd sont présents

-          Sur NDB-02

rcndbd   start

Vérifier avec ps ax  |  grep ndb que deux process ndbd sont présents

-          Sur SQL-01

rcmysql   start

-          Sur SQL-02

rcmysql   start

Vérifier que tout est OK en se connectant avec un client mySQL sur les frontaux mySQL (password root / mysql) et que, depuis les deux frontaux, on peut accéder aux datas.

4.2.2      Arrêt

 

-          Sur MGM-01 ou MGM-02

rcndb_mgmd  stop-all

-          Sur SQL-01

rcmysql   stop

-          Sur SQL-02

rcmysql   stop

4.2.3      Urgence

En cas d‘urgence seulement, les scripts suivants peuvent aussi êtres utilisés :

-          Arrêt      : rcndb_mgmd stop-cluster

-          Marche : rcndb_mgmd start-cluster (mode init des nodes MGM)

Remarque : L’opération de démarrage de tous les nœuds est rapide, en revanche, la synchronisation inter nœuds ne l’est pas forcément, il ne faudra pas hésiter à attendre plusieurs secondes avant de vérifier l’état du cluster comme indiqué en 4.3.1 et de conclure que cela ne fonctionne pas ou que cela fonctionne.

 

4.3       Etat du cluster

 

L’étatdu cluster est consultable depuis un « client » MGM, celui-ci est installé dans nos exemples sur tous les serveurs MGM, il suffit donc, depuis un serveur MGM démarré de taper la commande : ndb_mgm.

Un « shell » de client mgm permet alors de taper divers commandes :

4.3.1      Nœuds connectés et déconnectés

ndb_mgm > show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]     2 node(s)
id=29   @10.20.0.29  (mysql-5.1.41 ndb-7.0.13, Nodegroup: 0, Master)
id=30   @10.20.0.30  (mysql-5.1.41 ndb-7.0.13, Nodegroup: 0)
[ndb_mgmd(MGM)] 2 node(s)
id=27   @10.20.0.27  (mysql-5.1.41 ndb-7.0.13)
id=28   @10.20.0.28  (mysql-5.1.41 ndb-7.0.13)
[mysqld(API)]   3 node(s)
id=25   @10.20.0.25  (mysql-5.1.41 ndb-7.0.13)
id=26   @10.20.0.26  (mysql-5.1.41 ndb-7.0.13)
id=50 (not connected, accepting connect from any host)

Ici nous pouvons observer que 7 nœuds ont été lus dans le fichier de configuration (textuel ou binaire) du serveur de MGM que l’on interroge.

Le nœud n°50 ne s’est pas quant à lui présenté aux serveurs de managment, n’est pas démarré, ou est tombé pour une raison quelconque.

4.3.2      Etat de la mémoire

ndb_mgm > all report memory
Node 29: Data usage is 0%(24 32K pages of total 2560)
Node 29: Index usage is 0%(21 8K pages of total 2336)
Node 30: Data usage is 0%(24 32K pages of total 2560)
Node 30: Index usage is 0%(21 8K pages of total 2336)

Consommation mémoire des différents nœuds. Cette option permet de savoir s’il faut incrémenter les valeurs dataMemory et IndexMemory du fichier de configuration du cluster.

4.3.3      Etat des backups en cours


ndb_mgm> all report BackupStatus
Node 29: Backup not started
Node 30: Backup not started

Lorsque des backups sont en cours d’exécution (voir  5.2), cette commande permet d’observer leur état d’avancement. Ici aucun backup n’est en cours d’exécution.

4.3.4      manipulation des nodes NDB

ndb_mgm> <node_id> STOP
ndb_mgm> <node_id> START
ndb_mgm> <node_id> STATUS
ndb_mgm> ALL STOP
ndb_mgm> ALL START
ndb_mgm> ALL STATUS

5. Sauvegarde et Restauration

5.1 Mode « SINGLE USER »


Le SINGLE USER MODE est utilisé pour restreindre l’accès au cluster à un nœud SQL unique et généralement accessible uniquement par un administrateur et auxquels les applicatifs et/ou les utilisateurs n’ont pas accès, ceci dans le but de faire des opération administratives sans être gêne par les requêtes clientes (restauration, …).

Il faut se connecter sur un nœud MGM et passer la commande :

ndb_mgm –e ‘’ENTER SINGLE USER MODE <ID>’’

(<ID> est le Node-ID d’un nœud SQL administratif (voir fichier de config en  3.3))

Pour revenir à un état normal du cluster, il faut indiquer au serveur de Managment la commande

ndb_mgm –e ‘’EXIT SINGLE USER MODE’’


 

5.2       Backup base ouverte (« à chaud »)

5.2.1      Introduction

La sauvegarde d’une base sur un cluster mySQL consiste en une opération de sauvegarde des réplicas (données synchronisées inter-nœuds), donc sur chaque nœud NDB, ceci incluant les transactions de base de données en cours (redologs) afin d’assurer l’intégrité des données en cas de restauration.

Une sauvegarde consiste en la création d’un jeu de données sur chaque nœud de stockage NDB. Nous choissons de les stocker  dans les dossiers /data/mysql/backups/

La restauration sera une restauration des backups ainsi réalisés sur chaque nœud (un backup d’une database sur n nœuds NDB se restaurera avec une n opérations de restaurations)

5.2.2      Méthode

Pour lancer un backup d’une database, il faut se positionner sur un nœud MGM et utiliser la commande :

rcndb_mgmd backup

 

Ceci aura pour effet de demander la création d’un backup des métadatas des databases pour chaque nœud NDB et de ranger les « fragments » de backup, su chaque nœuds, dans le répertoire /data/mysql/backups/BACKUP/BACKUP-<Q><HHMMSS>/ où Q est le quantième de la date de déclanchement du backup et HHMMSS l’heure de ce même déclanchement.

Le dossier de backup ainsi créé sur chaque nœud NDB contient :

-          *.ctl <= Les fichiers de contrôles

-          *.Data <= Les fichiers de données

-          *.log <= Les fichiers de transactions pour le recovery des datas après restauration/

5.3       Restauration


5.3.1      Introduction

Comme indiqué en introduction du paragraphe de backup, la restauration d’une database consiste en la restauration de n sauvegardes présentes sur les n nœuds NDB.

5.3.2      Méthode

5.3.2.1         Quelle restauration faut-il effectuer ?

En fonction du type de perte de données et de la volonté de restaurer tout ou partie du cluster ou d ‘une base de données, les « checklist » ne sont pas exactement les mêmes.

Il se distingue globalement trois besoins en matière de restauration de données depuis une sauvegarde :

-          CLUSTER (tout est foutu => restauration générale)

-          DATABASE (une base de données est HS [ drop database, erreur FS, …], il faut la restaurer

-          TABLE [ erreur logique et demande utilisateur ]

Trois besoins, trois méthodes. Au-delà de cela, il faudra réfléchir avant d’agir !

a.        Restauration du CLUSTER :  Restauration de la totalité du cluster

 

  • Positionner le cluster en « SINGLE USER MODE » (voir  5.1)
  • Arrêter le cluster (voir  4.2.2)
  • Démarrer tous les nœuds NDB en initialisant des espaces de données
    • Sur chaque nœud NDB : rcndbd  format
  • Restaurer les métadatas (create table, …)
    • Sur un des nœuds NDB :

ndb_restore   –c   <ip MGM> \

–n  <ID NDB>  –m –b  <ID backup>   \

–backup_path=/data/mysql/backup/

  • Restaurer les datas
    • Sur tous les nœuds NDB :

ndb_restore   –c   <ip MGM> \

–n  <ID NDB>  –r –b  <ID backup>   \

–backup_path=/data/mysql/backup/

  • Restaurer les objets de base de données (triggers, procédures stockées, …)
    • Sur tous les nœuds SQL :
      • rcmysql  start
      • Repérer le dernier dump sql structuel dans le dossier /data/mysql/backup/  et de type « dump_STRUCT_<yyyyy>.sql » puis l’appliquer au serveur  avec :

mysql  –uroot  <  /data/mysql/backup/dump_STRUCT_<yyyyy>.sql

  • Sortir le cluster du « SINGLE USER MODE »
b.       Restauration d’une base de données : Restauration partielle d’une database ‘DB’
  • Positionner le cluster en « SINGLE USER MODE »
  • Détruire la database ‘DB’ :
    • Sur chaque nœud SQL :
      • mysql  –uroot  -pmysql
      • mysql>  drop database  db ;
      • mysql>  exit ;
  • Restaurer les métadatas de la database (create table, …)
    • Sur un des nœuds NDB :

ndb_restore   –c   <ip MGM> \

–n  <ID NDB>  –m –b  <ID backup>   \

–backup_path=/data/mysql/backup/ \

–include-databases=db

  • Restaurer les datas
    • Sur tous les nœuds NDB :

ndb_restore   –c   <ip MGM> \

–n  <ID NDB>  –r –b  <ID backup>   \

–backup_path=/data/mysql/backup/ \

–include-databases=db

  • Restaurer les objets de base de données (triggers, procédures stockées, …)
    • Sur tous les nœuds SQL :
      • rcmysql  start
      • Repérer le dernier dump sql structuel de la database ‘db’ dans le dossier /data/mysql/backup/  et de type « dump_STRUCT_ DATABASE_DB_<yyyyy>.sql » puis l’appliquer au serveur  avec :

mysql  –uroot  <  /data/mysql/backup/dump_STRUCT_DATABASE_DB_<yyyyy>.sql

  • Sortir le cluster du « SINGLE USER MODE »

 

c.        Restauration d’une table : Restauration d’une table ‘T’ de la database ‘DB’
  • Positionner le cluster en « SINGLE USER MODE »
  • Détruire la table ‘T’ de la database ‘DB’ :
    • Sur chaque nœud SQL :
      • mysql  –uroot  -pmysql
      • mysql>  drop table  db.t ;
      • mysql>  exit ;
  • Restaurer les métadatas de la database (create table, …)
    • Sur un des nœuds NDB :

ndb_restore   –c   <ip MGM> \

–n  <ID NDB>  –m –b  <ID backup>   \

–backup_path=/data/mysql/backup/ \

–include-databases=db \

–include-tables=t

  • Restaurer les datas
    • Sur tous les nœuds NDB :

ndb_restore   –c   <ip MGM> \

–n  <ID NDB>  –r –b  <ID backup>   \

–backup_path=/data/mysql/backup/ \

–include-databases=db \

–include-tables=t

  • Sortir le cluster du « SINGLE USER MODE »

5.3.2.2         Syntaxe générale de « ndb_restore »

ATTENTION : Cette commande est à exécuter DEPUIS un nœud de stockage NDB.

ndb_restore

–connect <ip addr> (ou ‘–c’)                    <= MGM serveur qui pilote la restauration

–restore_meta (ou ‘- m’)                          <= restaurer les métadatas (DDL)

–nodeid=<node ID> (ou ‘-n’)                   <= le numéro d’un nœud NDB

–backupid=< backup ID> (ou ‘-b’)          <= le numéro du backup (voir 5.2.2)

–rebuild-indexes (ou ‘- r’)                         <= reconstruction des index

–backup_path=/data/mysql/backup    <= le chemin des backups sur les nœuds NDB

[ --include-databases=ma_database ]                 <= restreindre le backup à cette database

[ --include-tables=table1,table2 ]          <= restreindre le backup à ces tables

[ -- print_log ]

6. Considérations pour les développeurs


6.1 Limitations classiques du cluster NDB


Il existe de nombreuses limitations quant à l’utilisation d’un cluster au sens de mySQL, mais la plupart de celles-ci sont exotiques et peuvent être de ce fait contournées facilement.

Les limitations « classiques » sont :

-          Limitation de 128 champs par table

-          Interdiction d’utiliser des clés étrangères

-          Interdiction d’utiliser la création de tables temporaires (temporary tables)

-          Pas d’index sur les champs FULLTEXT ou LOB (BLOB, CLOB, …)

-          Obligation de créer sur tous les nœuds SQL les déclencheurs, fonctions et procédures stockées (métadatas)

-          Interdiction d’utiliser les transactions en SavePoint (plusieurs rollbacks possibles en différents points sur une seule transactions ouverte)

6.2       Problématique liée à l’absence de clés étrangères

L’absence de possibilité d’utiliser les clés étrangères pour une table gérée par le moteur NDBENGINE empêche par définition de s’assurer de l’intégrité référentielle ou de la mise à jour en cascade des données.

Pour pallier à ce manque, il convient d’utiliser des TRIGGERs, principalement AVANT  opération DML dans le but d’effectuer manuellement les vérifications d’intégrité référentielle et de provoquer une erreur (voire les fonctions UDF en  2.3) en cas d’anomalie détectée.

ATTENTION : les triggers (comme les fonctions et procédures stockées) ne sont pas des objets dépendants des tables mais de la base de données. Ils ne sont donc pas gérés par les nœuds NDB mais par les nœuds SQL. Aucune propagation de configuration d’un nœud SQL sur un autre n’existe dans cette version du cluster (7.x), il faut donc, sur tous les nœuds SQL, définir les mêmes objets.

6.2.1      Des TRIGGERS pour assurer l’intégrité référentielle

Prenons l’exemple une table TABLEFILLE(IDFILLE, NOM, IDPARENT) qui devrait être liée à une table « mère » TABLEPARENT(IDPARENT, NOM) par le champ IDPARENT.

L’absence de clé étrangère sur ces tables ne permet pas d’assurer l’intégrité référentielle, nous allons utiliser un trigger pour pallier à ce manque.

Voici le trigger permettant de respecter l’intégrité référentielle qu’il faut créer sur tous les nœuds SQL :

DROP TRIGGER IF EXISTS TG_TABLEFILLE_PARENTKEYOK_BI;

DELIMITER |

CREATE TRIGGER TG_TABLEFILLE_PARENTKEYOK_BI BEFORE INSERT ON TABLEFILLE

FOR EACH ROW BEGIN

DECLARE RESULTAT INT;

IF ((SELECT COUNT(*) FROM TABLEPARENT WHERE TABLEPARENT.IDPARENT=new.IDPARENT)=0) THEN

SET RESULTAT=udf_initid_error(« Intégrité référentielle violée sur TABLEFILLE –> TABLEPARENT »);

END IF;

END;

|

DELIMITER ;

6.2.2      Des TRIGGERS pour assurer les mises à jour en cascade

L’absence de clé étrangère sur ces tables ne permet pas d’assurer la mise à jour en cascade des lignes de tables filles lorsque des lignes dépendantes sur une table mère sont supprimées.  Nous allons encore une fois utiliser un trigger pour pallier à ce manque.

Reprenons l’exemple des tables TABLEFILLE et TABLEPARENT de 6.2.1.

DROP TRIGGER IF EXISTS TG_TABLEPARENT_DELCASCADE_BD;

DELIMITER |

CREATE TRIGGER TG_TABLEPARENT_DELCASCADE_BD BEFORE DELETE ON TABLEPARENT

FOR EACH ROW BEGIN

DELETE FROM TABLEFILLE WHERE TABLEFILLE.IDPARENT=old.IDPARENT ;

END;

|

DELIMITER ;

6.3       Codes d’erreurs rencontrés

CODE ERREUR Explication / Solution
157 « Could not connect to storage engine »Les noeuds NDB sont arrêtés ou les nœuds MGM sont arrêtes : vérifier et les relancer si besoin
1296 Impossible de communiquer avec les nœuds NDBFaire un ndm_mgm –e « show »  pour vérifier leur statuts, les démarrer au cas ou
1114 Nombre d’index max. (non PK) atteintð  Augmenter la valeur  « MaxNoOfOrderedIndexes » + start « init » mode
1005 Nombre d’attributs max. atteintð  Augmenter  la valeur de MaxNoOfAttributes + start « init » mode
1478 Impossible d’indexer un champ CLOB, BLOB, TEXT, FULLTEXT, LONGTEXTð  Supprimer l’index ou changer le typage du champ
1089 Interdiction d’utiliser des préfixes pour les indexes : non supportéð  « UNIQUE KEY » devient « KEY », …
1297 Trop d’opérations simultanéesð  Augmenter la valeur de « MaxNoOfConcurrentOperations » + start « init » modeð  Augmenter (peut être) la valeur de « MaxNoOfLocalOperations » + start « init » modeCette erreur apparait généralement lors de l’injection de dumps, …

CopyLeft:

Ces données sont issues d’un document interne de production provenant d’un DataCenter français.

Leave a Reply