Blog

Ajout de data nodes à chaud dans MySQL Cluster

Écrit le 09 04 2013 par Kévin MET _

Je vais surement publier quelques billets sur MySQL Cluster car je bosse sur cette techno en ce moment. Du coup, j'en profite pour partager ce que je découvre à ce sujet en espérant que cela puisse servir et en plus ça me permet de conserver ce que j'ai pu observé 😉

Dans la suite de ce billet, je pars du postulat que vous avez déjà installé MySQL Cluster et que vous avez 4 data nodes, 1 management node et 1 SQL node. Ce tutoriel peut fonctionner si vous n'avez pas exactement cette configuration et les fichiers de configurations sont minimisés pour en faciliter la lecture. Nous avons donc conservé uniquement l'essentiel pour que le cluster tourne.

Dans cette exemple on va ajouter deux nodes à un cluster qui en comptait déjà quatre. Toute cette procédure peut être utiliser online sans avoir besoin de locker les bases.


ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)]	6 node(s)
id=3	@192.168.1.3  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)
id=4	@192.168.1.4  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)
id=5	@192.168.1.5  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)
id=6	@192.168.1.6  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]	1 node(s)
id=2	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

Le fichier config.ini initial est le suivant :


[ndbd default]
NoOfReplicas=2 
DataMemory=300M
IndexMemory=180M 

[ndb_mgmd]
NodeId=1
hostname=192.168.1.1
datadir=/var/lib/mysql-cluster

[ndbd]
NodeId=3
hostname=192.168.1.3
datadir=/usr/local/mysql/data

[ndbd]
NodeId=4
hostname=192.168.1.4
datadir=/usr/local/mysql/data

[ndbd]
NodeId=5
hostname=192.168.1.5
datadir=/usr/local/mysql/data

[ndbd]
NodeId=6
hostname=192.168.1.6
datadir=/usr/local/mysql/data

[mysqld]
NodeId=2
hostname=192.168.1.2

On a donc 4 data nodes, un management node et un sql node.

Il faut éditer le config.ini pour tenir compte des nouveaux data nodes. Dans notre exemple, les deux nouveaux nodes sont sur 192.168.1.7 et 192.168.1.8.


[ndbd default]
NoOfReplicas=2
DataMemory=300M
IndexMemory=180M

[ndb_mgmd]
NodeId=1
hostname=192.168.1.1
datadir=/var/lib/mysql-cluster

[ndbd]
NodeId=3
hostname=192.168.1.3
datadir=/usr/local/mysql/data

[ndbd]
NodeId=4
hostname=192.168.1.4
datadir=/usr/local/mysql/data

[ndbd]
NodeId=5
hostname=192.168.1.5
datadir=/usr/local/mysql/data

[ndbd]
NodeId=6
hostname=192.168.1.6
datadir=/usr/local/mysql/data

[ndbd]
NodeId=7
hostname=192.168.1.7
datadir=/usr/local/mysql/data

[ndbd]
NodeId=8
hostname=192.168.1.8
datadir=/usr/local/mysql/data

[mysqld]
NodeId=2
hostname=192.168.1.2

Il faut ensuite stopper le management node :


ndb_mgm> 1 stop
Node 1 has shutdown.
Disconnecting to allow Management Server to shutdown

Il faut ensuite le redémarrer avec l'option --reload pour qu'il tienne compte de la modification sur le fichier config.ini :


ndb_mgmd -v -f /var/lib/mysql-cluster/config.ini --reload

On vérifie que le cluster attends bien les deux nouveaux nodes :


ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	6 node(s)
id=3	@192.168.1.3  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)
id=4	@192.168.1.4  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)
id=5	@192.168.1.5  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)
id=6	@192.168.1.6  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)
id=7 (not connected, accepting connect from 192.168.1.7)
id=8 (not connected, accepting connect from 192.168.1.8)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]	1 node(s)
id=2	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

Il faut ensuite relancer chacun des data nodes depuis la console de management :


ndb_mgm> 4 restart
Node 4: Node shutdown initiated
Node 4: Start initiated (version 7.2.12)

Il faut le faire pour les 4 nodes.

Quand vous faites cette manipulation il vaut mieux toujours avoir un oeil sur les logs pour être sur que le node que l'on vient de relancer est bien remonté avant de relancer le suivant sinon vous courrez à la catastrophe. En effet, si vous relancez un node d'un groupe dans lequel l'autre node n'est pas encore remonté votre cluster va détecter que certaines des données ne sont plus accessibles et va éteindre le cluster au complet... De manière général je garde toujours un tail -f ouvert sur le fichier de log de MySQL cluster afin de savoir ce qui se passe lorsque je fais des opérations importantes sur le cluster.

Une fois que c'est fait, il faut relancé le node SQL :


root@node2:~# /etc/init.d/mysql.server restart
Shutting down MySQL
...
Starting MySQL
....

Ensuite on lance le démon ndbd sur les deux nouveaux nodes :


root@node7:~# ndbd  
2013-04-09 16:56:22 [ndbd] INFO     -- Angel connected to '192.168.1.1:1186'
2013-04-09 16:56:22 [ndbd] INFO     -- Angel allocated nodeid: 7

root@node8:~# ndbd
2013-04-09 16:56:27 [ndbd] INFO     -- Angel connected to '192.168.1.1:1186'
2013-04-09 16:56:27 [ndbd] INFO     -- Angel allocated nodeid: 8

On vérifie sur le management que les deux nœuds sont bien connectés :


ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	6 node(s)
id=3	@192.168.1.3  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)
id=4	@192.168.1.4  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)
id=5	@192.168.1.5  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)
id=6	@192.168.1.6  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)
id=7	@192.168.1.7  (mysql-5.5.30 ndb-7.2.12, no nodegroup)
id=8	@192.168.1.8  (mysql-5.5.30 ndb-7.2.12, no nodegroup)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]	1 node(s)
id=2	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

On voit qu'il sont connectés mais n'ont pas encore de groupe. Il faut donc le créer via la console de management en utilisant CREATE NODEGROUP avec en argument les id des deux nouveaux nodes :


ndb_mgm> CREATE NODEGROUP 7,8
Nodegroup 1 created

On vérifie que le groupe est bien créé :


ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)]	6 node(s)
id=3	@192.168.1.3  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0, Master)
id=4	@192.168.1.4  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 0)
id=5	@192.168.1.5  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)
id=6	@192.168.1.6  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 1)
id=7	@192.168.1.7  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 2)
id=8	@192.168.1.8  (mysql-5.5.30 ndb-7.2.12, Nodegroup: 2)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.1.1  (mysql-5.5.30 ndb-7.2.12)

[mysqld(API)]	1 node(s)
id=2	@192.168.1.2  (mysql-5.5.30 ndb-7.2.12)

Tout est OK, il ne reste plus qu'a repartir les données sur les différents nodes. En effet les données créées avant l'ajout des nodes ne seront pas reparties sur les nouveaux nodes. Par contre les données créées après seront reparties sur les nouveaux nodes (sous réserve de l'utilisation d'un schéma de partitionnement particulier)

Pour cela on utilisera les commandes suivantes sur chacune des tables qu'on veut répartir sur tous les nodes :


ALTER ONLINE TABLE ma_table REORGANIZE PARTITION;
OPTMIZE TABLE ma_table;

Finalement on peut vérifier que les données on bien été déplacées :


ndb_mgm> ALL REPORT MEMORY
Node 3: Data usage is 8%(832 32K pages of total 9600)
Node 3: Index usage is 1%(387 8K pages of total 23072)
Node 4: Data usage is 8%(814 32K pages of total 9600)
Node 4: Index usage is 1%(381 8K pages of total 23072)
Node 5: Data usage is 8%(836 32K pages of total 9600)
Node 5: Index usage is 1%(395 8K pages of total 23072)
Node 6: Data usage is 8%(836 32K pages of total 9600)
Node 6: Index usage is 1%(395 8K pages of total 23072)
Node 7: Data usage is 3%(352 32K pages of total 9600)
Node 7: Index usage is 0%(190 8K pages of total 23072)
Node 8: Data usage is 3%(352 32K pages of total 9600)
Node 8: Index usage is 0%(190 8K pages of total 23072)
♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.