Progetto

Generale

Profilo

MySQLReplication » Cronologia » Versione 6

Versione 5 (japoco romagnoli, 13-03-2013 12:24) → Versione 6/31 (japoco romagnoli, 14-03-2013 12:32)

h1. 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”. 

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

 <pre> 
 service mysql stop 
 </pre> 

 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: 

 <pre> 
 [...] 
 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 [nome_db_da_replicare] 
 [...] 
 </pre> 

 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. 

 <pre> 
 rm /var/log/mysql/mysql-bin.* 
 </pre> 

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

 <pre> 
 service mysql start 
 </pre> 

 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: 

 <pre> 
 USE nome_database 
 FLUSH TABLES WITH READ LOCK; 
 </pre> 

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

 <pre> 
 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) 
 </pre> 

 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: 

 <pre> 
 mysqldump -u root -p --opt nome_database > nome_database.sql 
 </pre> 

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

 <pre> 
 UNLOCK TABLES; 
 </pre> 


 Occorre poi configurare lo slave con un diverso @server-id@, e metterlo in ascolto sull'indirizzo generico: 

 <pre> 
 [...] 
 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 
 [...] 
 </pre>