MySQL Cluster

Da Inc0Wiki.

Preambolo

La configurazione di MySQL è stata effettuata sfruttando 3 macchine virtuali (ubuntu 8.04) virtualizzate con VMWare Server 2.0. La versione di MySQL usata è la 5.0.
NOTA: Affinchè le tabelle vengano replicate nel cluster è necessario che l'engine delle tabelle sia NDBCLUSTER!.

Scopo

Questa guida ha lo scopo di insegnare come configurare un cluster MySQL con un nodo di management e due nodi per il salvataggio dati.

Pacchetti Necessari

mysqld - questa guida è stata scritta e testata con MySQL versione 5.0

Ambiente

Le 3 macchine virtuali hanno 3 ip fissi:
- vb-ubuntu0: 192.168.56.101, nodo di management
- vb-ubuntu1: 192.168.56.102, nodo dati
- vb-ubuntu2: 192.168.56.103, nodo dati

Configurazione

Il file di configurazione di mysql è, my.cnf ed è solitametne localizzato in /etc/mysql.

Nodo Management

Sul nodo di management creiamo la cartella /var/lib/mysql-cluster ed al suo interno creiamo il file config.ini:

mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
nano [vi o emacs o ogni altro editor] config.ini

All'interno di config.ini copiamo quanto segue:

/var/lib/mysql-cluster/config.ini

[NDBD DEFAULT]
NoOfReplicas=2
[MYSQLD DEFAULT]
[NDB_MGMD DEFAULT]
[TCP DEFAULT]
# Managment Server
[NDB_MGMD]
# Ip di questo server (nodo di management)
HostName=192.168.56.101
# Nodi di storage
[NDBD]
# IP del primo server di storage
HostName=192.168.56.102
# Cartella dove sono salvati i dati
DataDir= /var/lib/mysql-cluster
[NDBD]
# IP del secondo nodo di storage
HostName=192.168.56.103
# Cartella dove sono salvati i dati
DataDir=/var/lib/mysql-cluster

Avviamo il server di management

# ndb_mgmd

o

#  /etc/init.d/mysql-ndb-mgm start

Nodi di Storage

Su entrambi i nodi di storage è necessario modificare my.cnf indicando qual'è il nodo di management:

[mysqld]
ndbcluster
# IP del server di management
ndb-connectstring=192.168.56.101
[mysql_cluster]
# IP del server di management
ndb-connectstring=192.168.56.101

A questo punto creiamo la cartella dove finiranno i dati del cluster come indicato nel precedente config.ini:

mkdir /var/lib/mysql-cluster

e inizializzaimo il tutto:

cd /var/lib/mysql-cluster
/usr/local/mysql/bin/ndbd --initial

L'e ultime cose che rimangono da fare sono:
- avviare il server mysql (/etc/init.d/mysql start)
- avviare il cluster sul nodo (/etc/init.d/mysql-ndb start)

Verifica funzionamento

Nodo di Management

Partiamo dal nodo di management ed assicuriamoci che i nodi con i dati siano online e collegati, per farlo digitiamo:

# ndb_mgm

o

# ndb_mgm 127.0.0.1

ed una volta nella console di management:

ndb_mgm> show

Se otteniamo un output come il seguente:

Cluster Configuration
---------------------
[ndbd(NDB)]	2 node(s)
id=2	@192.168.56.102  (Version: 5.0.51, Nodegroup: 0, Master)
id=3	@192.168.56.103  (Version: 5.0.51, Nodegroup: 0)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.56.101  (Version: 5.0.51)

[mysqld(API)]	2 node(s)
id=4	@192.168.56.102  (Version: 5.0.51)
id=5	@192.168.56.103  (Version: 5.0.51)

ndb_mgm>

significa che il cluster è funzionante: potrete vedere gli ip dei due server sui quali vengono salvati i dati (192.168.56.102 e 192.168.56.103) e quello del nodo di management (192.168.56.101).

Nodi Dati

E' il momento di collegarci al primo nodo dati e creare un database di test:

root@vb-ubuntu1:/var/lib/mysql-cluster# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.51a-3ubuntu5.5-log (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

Creiamo il database cluster:

mysql> create database cluster;
mysql> use cluster;

creaiamo a questo punto una tabella di test con engine NDBCLUSTER ed inseriamo qualche valore:

mysql> create table test (i INT) ENGINE=NDBCLUSTER;
mysql> INSERT INTO test () VALUES (1);
mysql> INSERT INTO test () VALUES (2);
mysql> INSERT INTO test () VALUES (3);
mysql> INSERT INTO test () VALUES (4);

Verifichiamo:

mysql> SELECT * FROM ctest;
+------+
| i    |
+------+
|    1 | 
|    2 | 
|    3 | 
|    4 | 
+------+
4 rows in set (0.00 sec)

mysql>

A questo punto andiamo sul secondo nodo e creiamo un database con lo stesso nome e verifichiamo che i dati sono stati già replicati:

mysql> create database mycluster;
Query OK, 1 row affected (0.00 sec)

mysql> use mycluster;
mysql> select * from ctest;
+------+
| i    |
+------+
|    2 | 
|    1 | 
|    3 | 
|    4 | 
+------+
4 rows in set (0.01 sec)

mysql> 

Note

Se avete tabelle con campi autoincrement e usate questi campi per sapere quali sono i dati più recenti, in un cluster questo metodo non funziona: dovrete trovare altri metodi quali, ad esempio, l'impiego di timestamps.

Come calcolare quanta ram e' necessaria su ogni nodo dati:
(DimensioneDatabase * NumberOfReplicas * 1.1) / NumeroNodiStorage

Se volete ampliare i nodi di storage, ricordatevi che 3 non è un buon numero: l'ideale e' passare da 2 a 4.

Se cambiare il file config.ini dovete fermare TUTTO il cluer e riavviarlo per fargli rileggere la configurazione: fermate il cluster dalla console di management (ndb_mgm) con il comando SHUTDOWN e poi riavviate tutti i nodi di storage.

Credits

Autore: Incubus

E-Mail: theincubus (at) gmail (dot) com