venerdì 22 maggio 2015

Impostare la replicazione Mysql - procedura passo passo

Se gestite un server MySql in azienda, e volete dormire sonni tranquilli, è ovviamente fondamentale la schedulazione di un backup serale. Questo spesso non è sufficiente: il downtime per il ripristino in caso di guasto può essere troppo lungo, o addirittura può essere concreto il rischio di perdere dati di una buona metà giornata di lavoro.

Per dormire sonni tranquilli, basta affidarsi alla MySql Replication. Come funziona? Semplice, gli attori in gioco sono minimo due:
- un server MySql Master (master_host)
- uno o più server MySql Slave (slave_host)
Una magia rende possibile l'allineamento dei due server: ogni operazione eseguita sul master viene a sua volta eseguita anche sullo slave. Risultato: due server con dati identici (a meno di un leggero scostamento temporale nelle operazioni tra master e slave).
Di seguito la procedura che ho seguito, passo passo, per l'impostazione del sistema.

Fase 1: impostazione del server Master

E' fondamentale spiegare al server MySql principale che farà da Master. Per fare questo occorre agire sul file di configurazione my.cnf (o my.ini) aggiungendo le seguenti direttive nella sezione [mysqld]
[mysqld]
log-bin=mysql-bin
server-id=1
Il parametro server-id può essere un numero qualsiasi tra 1 e (232-1) e deve essere univoco tra i vari server MySql della rete Master Slave che si vuole creare. Il mio consiglio è quello di andare in ordine crescente: 1 per il master, dal 2 in poi per gli slave.
Importante: dopo questa modifica, riavviare il servizio MySql. Da questo momento ogni operazione eseguita sul server sarà salvata in un log.

Fase 2: dump del database del server Master

Si suppone ovviamente che il server MySql che farà da master sia un server che possiede già dei dati al suo interno. Il che significa che è necessario sincronizzare i dati tra master e slave. Per fare ciò, ci viene in aiuto il comando mysqldump
mysqldump -h master_host -u root - p --all-databases --master-data -e > dump.sql
Il comando eseguirà il dump creando il file dump.sql. Apriamo a questo punto il file con un editor di testi e segnamoci, da una parte, i comandi relativi al master_log_file e master_log_pos. Ad esempio, nel mio caso:
MASTER_LOG_FILE='mysql-bin.000016', MASTER_LOG_POS=458850265;
Come ho scritto, segnamo a parte le informazioni relative al log file e alla posizione del log. La posizione del log indicherà allo slave la posizione di partenza del dump importato.

Fase 3: creazione di un utente specifico per la replicazione

Questa fase non è obbligatoria ma altamente consigliata. Semplicemente è necessario creare un utente per la replicazione sul server master:
CREATE USER 'repl'@'%' IDENTIFIED BY 'slavepass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

Fase 4: impostazione del server slave

Sul server slave, è necessario inserire nel file di configurazione, nella sezione [mysqld], la direttiva
[mysqld]
server-id=2
o comunque un numero diverso da altri server Mysql e soprattutto differente dall'id del master. Riavviare il servizio MySql del server slave.

Fase 5: importazione del dump sul server slave

E' necessario in questa fase importare il dump precedentemente creato. Dalla shell eseguire:
mysql -h slave_host -u root -p < dump.sql
Ed attendere il completamento dell'operazione.

Fase 6: impostazione delle informazioni del master sul server slave

In questa fase, il server slave viene informato su quale sarà il suo master di riferimento. Avendo sotto mano la posizione del log e il nome del log del master segnato in precedenza, è necessario eseguire sul server slave:
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='slavepass',
MASTER_LOG_FILE='mysql-bin.000016',
MASTER_LOG_POS=458850265

Fase 7: avvio della replicazione sul server slave

Con un semplice
START SLAVE;
si iniziano le danze. E' possibile a questo punto controllare lo stato della replicazione eseguendo sul server slave
SHOW SLAVE STATUS;

[Immagine via clusterdb.com]

2 commenti:

Marco Rosetti ha detto...

Nice post!
Occhio solo che quel modo di fare il dump è a rischio "encoding" e può dare problemi di codifica dei caratteri speciali.
Meglio usare "mysqldump -u[utente] -p[password] [nome_database] -r [nome_file]"
E per il caricamento del dump:
"mysql -u[utente] -p[password] --default-character-set=[charset_di_default] [nome_database]"
mysql> SOURCE [nome_file]

Unknown ha detto...

Grazie Marco, ottimo suggerimento!