Teoria: two is meglio che one!

Due delfini

Pratica:

La replicazione fornita da MySQL si definisce “one-way“, perché tale operazione è gestita dal server in modo monodirezionale, ovvero consente di replicare le operazioni di scrittura effettuate su un database master su più database slave.

Come è lecito aspettarsi i server slave saranno utilizzati solo per le letture mentre, sul master, graveranno gli inserimenti e gli update (nessuno vieta di utilizzarlo anche per le operazioni di select).

Il procedimento di replicazione di MySQL si riassume in questi step:

  1. Il master registra le query di scrittura (inserimento, update etc) in un file
  2. I server slave leggono il file di log del master ed eseguono le operazioni lì riportate aggiornando il database locale

Il rapporto tra master e slave è così definito:

  • un master può avere più slave
  • uno slave può avere un solo master

Bene si parte.

Configuriamo il master

Prima di tutto:

/etc/init.d/mysql stop

Così non si fanno disastri con il server up.

Utilizzando Debian è necessario editare il file /etc/mysql/my.cnf per abilitare il networking e la scrittura del file di log:

#skip-networking
bind-address = [indirizzo_ip_raggiungibile_dal_server_slave]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = [nome_db_da_replicare]

Adesso per sicurezza, cancelliamo (se presenti) i file di log dentro /var/log/mysql/ che iniziano con mysql-bin.*.

Questo serve per far ricreare al server un file di log pulito ed a prova di errore.
A questo punto facciamo ripartire il server con il classico


/etc/init.d/mysql start

Ripartito il server, accediamo via consolle a MySQL:

mysql -u root -p

E diciamo a MySQL di consentire la replica al nostro slave:

GRANT REPLICATION SLAVE ON *.* TO '[nome_utente]'@'[indirizzo_ip_dello_slave]' IDENTIFIED BY '[password]';
FLUSH PRIVILEGES;

Ora bisogna selezionare il database da replicare e sbloccare eventuali lock di lettura per spostare i dati (se presenti) dal master allo slave:

USE [nome_database];
FLUSH TABLES WITH READ LOCK;

Controlliamo lo stato del master:

SHOW MASTER STATUS;

Dovrebbe venir fuori qualcosa del genere:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | [nome_db] | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

Bene, adesso usciamo dalla shell di MySQL (con il classico quit;) ed esportiamo il database in un file sql da traferire sul server slave:

mysqldump -u root -p --opt [nome_db] > [nome_db].sql

Configuriamo lo slave

E’ necessario creare il database da replicare quindi entriamo nella consolle del server MySQL:


mysql -u root -p
Enter password:
CREATE DATABASE [nome_db];
quit;

Importiamo il dump SQL del server master:


mysql -u root -p [nome_db] < [path_dove_e_salvato_il_file]/[nome_db].sql

Adesso bisogna editare il file /etc/mysql/my.cnf per abilitare la lettura del file di log del master:

server-id=2
master-host=[ip_master]
master-user=[user_creato_sul_master]
master-password=[password]
master-connect-retry=60
replicate-do-db=[nome_db]

Le direttive per il log bin sul server slave possono essere disabilitate.

Bene, abbiamo finito, un bel riavvio e siamo a posto:

/etc/init.d/mysql restart

Ogni cosa che scrivete sul master verrà (forse :P ) replicato in pochi millesimi di secondo sullo slave.