Project

General

Profile

MySQLReplication » History » Version 17

« Previous - Version 17/31 (diff) - Next » - Current version
japoco romagnoli, 03/15/2013 04:03 PM


Configurare la replicazione di MySQL

Occorrono almeno due installazioni indipendenti di MySQL, una macchina deve fare da master, le altre da slave. Prenderemo in considerazione solo il caso elementare di due macchine. Le due istanze devono essere configurate per essere raggiungibili via rete. In pratica si dice al master di creare un log binario con le operazioni che vengono eseguite in scrittura. Lo slave leggendo i file di log ripete le stesse operazioni su se stesso per “allinearsi”.

--Master

Si cominici con configurare il primo server MySQL esistente come master, anzitutto si fermi il servizio con:

service mysql stop

A questo punto modifichiamo il file /etc/mysql/my.cnf del master per abilitare networking e scrittura del file di log binario, inserendo le seguenti configurazioni al posto di quelle correnti:

[...]
bind-address    = 0.0.0.0
[...]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = nome_database
[...]

Se si dovesse ripartire da zero, cancelliamo eventuali vecchi file di log binario in modo tale che il server crei un log pulito
a prova di errore.

rm /var/log/mysql/mysql-bin.*

si provveda poi a riavviare il server, in modo che prenda le nuove configurazioni:

service mysql start

Adesso andiamo a lavorare su MySQL per abilitare e settare la replica su uno slave definendo anche l'utente a cui dare l'accesso:

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

Una volta attive le nuove configurazioni occorre trasferire i dati dal master allo slave per l'importazione iniziale, per questo una volta entrati sulla CLI di MySQL si seleziona il database da replicare e si bloccano le tabelle in scrittura per avere uno stato coerente dei dati:

USE nome_database
FLUSH TABLES WITH READ LOCK;

Si potrà controllare lo stato del master con qualcosa del tipo:

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000013 |      106 |              | nome_database    |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

A questo punto senza chiudere la shell di MySQL (per evitare di perdere il lock sulle tabelle), si apre una nuova shell ed esportiamo il database in un file .sql da trasferire sul server slave:

mysqldump -u root -p --opt nome_database > nome_database.sql

una volta finita l'esportazione possiamo tornare sulla shell di MySQL per sbloccare il lock in lettura:

UNLOCK TABLES;

--Slave

Occorre agire come precedentemente fatto sul file /etc/mysql/my.cnf dello slave al fine di configurarlo con un diverso server-id e spostare tmpdir su una directory diversa da quella di default in modo che il contenuto non corra il rischio di venire cancellato; bisogna infine metterlo in ascolto sull'indirizzo generico 0.0.0.0:

[...]
tmpdir          = /var/tmp
[...]
bind-address    = 0.0.0.0
[...]
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
[...]

Adesso possiamo riavviare il demone di MySQL anche sullo slave:

service mysql restart

Adesso occorre creare un DB sullo slave con lo stesso nome di quello che vogliamo replicare:

mysqladmin -u root -p create nome_database

a questo punto si può caricare il file di dump .sql direttamente sul database:

mysql nome_database < nome_database.sql

infine occorre impostare il server come slave passando anche i paramatri del master con cui interfacciarsi:

CHANGE MASTER TO master_host='nome_Master.Domain', master_user='nome_utente_Master', 
master_port=3306, master_password='pw_utente_Master', master_log_file='mysql-bin.00000x', 
master_log_pos=xxx;
START SLAVE;

eventualmente si può controllare lo status dello slave da MySQL con:

SHOW SLAVE STATUS;

Switching Slave to Master

Volendo cambiare il nostro server slave nel nuovo master su cui indirizzare i servizi che appoggiano sul database mysql replicato si deve prima di tutto andare a cambiare il file /etc/mysql/my.cnf controllando che siano abilitate le opzioni di log-bin e disabilitato tutto quello che riguarda i log del tipo slave-updates.
Si deve anche verificare che il bind-address sia effettivamente impostato su 0.0.0.0 permettendo così il raggiungimento della macchina dalla rete:

[...]
bind-address    = 0.0.0.0
[...]
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_do_db = nome_database
[...]

Si deve poi commentare tutto quello che riguarda il collegamento per la replicazione ad un (ormai defunto) server master:

[...]
#master-host = nome_Master.Domain
#master-user = nome_utente_Master
#master-password =  nome_utente_Master
#master-connect-retry = 60 
#replicate-do-db = nome_database 
[...]

A questo punto, entrando in MySQL, si può fermate il server slave e reimpostarlo come nuovo master:

STOP SLAVE;
RESET MASTER;

In caso esistano altri slave, questi dovranno essere reindirizzati al nuovo master con:

CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='Id',
MASTER_PASSWORD='pswrd',
MASTER_LOG_FILE='mysql-bin.00000x',
MASTER_LOG_POS=xxx;

Dobbiamo poi garantire tutti i permessi sul database con:

GRANT ALL ON *.* TO '[nome_utente]'@'[indirizzo_ip_slave]' IDENTIFIED BY '[password]';
FLUSH PRIVILEGES;