In uno scenario di utilizzo reale di un database MySql (per siti, applicazioni web ecc.), la sicurezza dei dati è estremamente importante.

Per avere una sicurezza in più, è consigliabile duplicare i dati in un secondo server, attraverso un metodo chiamato replication, cioé la configurazione di MySql affinché da solo effettui tale duplicazione (nota bene che non è sincrona!).

Qui di seguito viene spiegato come fare. Per master si intenderà il server che fa il lavoro vero; mentre per slave si intenderà il server che contiene i dati duplicati (e che di fatto non viene mai utilizzato se non in caso di catastrofi). Fondamentalmente funziona così: lo slave interroga periodicamente (molto spesso) il master chiedendogli il suo file di log; in base al log lo slave capirà quali azioni sono state effettuate “in sua assenza” e le applicherà anche su se stesso.

La configurazione non è semplicissima e in alcuni punti sarà necessario interrompere il servizio, quindi fatelo solo quando il master non è utilizzato o, se proprio non si può fare diversamente, in orari strani e/o nel weekend.

Fase 1: Configurazione

Nel master:

1. Crea l’utente <slave_user> (con password <slave_password>) con il quale lo slave si loggherà. Per sicurezza gli si daranno solo i privilegi per la replicazione.
GRANT REPLICATION SLAVE ON *.* TO '<slave_user>'@'%.mydomain.com' IDENTIFIED BY '<slave_password>';

2. Apri il file /etc/mysql/my.cnf e vai alla sezione [mysqld]

3. Assicurati che sia configurato il log binario, cioé che ci sia la riga:
log-bin=mysql-bin

4. Sempre nella sezione [mysqld] inserisci la riga
server-id=1

5. Assicurati che la riga skip-networking sia commentata
# skip-networking

Nello slave:

1. Apri il file /etc/mysql/my.cnf e vai alla sezione [mysqld]

2. Aggiungi la riga
server-id=2

Fase 2: Lettura del punto corrente del log binario

Nel master:

1. Fai finire tutte le operazioni correnti. Da MySql:
FLUSH TABLES WITH READ LOCK;
Nb: Questo bloccherà temporaneamente l’uso del database!!!

2. Mostra il punto corrente. Da MySql:
SHOW MASTER STATUS

3. Segnati la risposta ricevuta (in particolare log_file e log_position)

4. Sblocca il database. Da MySql:
UNLOCK TABLES;

Fase 3: Prima sincronizzazione “a mano” con mysqldump

Nel master:

1. Blocca il database:
FLUSH TABLES WITH READ LOCK;
Nb: Questo bloccherà temporaneamente l’uso del database!!!

2. Fare il dump di tutto
mysqldump --all-databases --lock-all-tables >dbdump.db

3. Sblocca il database. Da MySql:
UNLOCK TABLES;

4. Copia (possibilmente con scp o comunque via SSH) il file dbdump.db nello slave

Nello slave riversa il dump effettuato precedentemente:
sudo mysql -uroot -p < dbdump.db

Fase 3bis: Prima sincronizzazione “a mano” in modo grezzo

Se il db è molto grande è più efficiente copiare brutalmente la cartella che contiene i dati di MySql da un db all’altro.

Nel master:

1. Ferma MySql
sudo /etc/init.d/mysql stop

2. Compatta tutti i dati
tar zcvf mysql.tgz /var/lib/mysql

3. Copia (possibilmente con scp o comunque via SSH) il file mysql.tgz nello slave

4. Riavvia MySql
sudo /etc/init.d/mysql start

Nello slave:

1. Ferma MySql
sudo /etc/init.d/mysql stop

2. Rimuovi la cartella dei dati attuale
sudo rm -rf /var/lib/mysql

3. Scompatta la versione nuova dei dati
sudo tar zxvf mysql.tgz

4. Riavvia il database
sudo /etc/init.d/mysql start

Fase 4: Avviare la sincronizzazione

Nello slave indicare come connettersi al master e dove leggere le informazioni. Da MySql:
CHANGE MASTER TO MASTER_HOST='<master_host_name>', MASTER_USER='<slave_user>', MASTER_PASSWORD='<slave_password>', MASTER_LOG_FILE='<recorded_log_file_name>', MASTER_LOG_POS=<recorded_log_position>

Ecco fatto!

Vi consiglio comunque periodicamente di tenere d’occhio lo slave per assicurarvi che la replicazione stia continuando (in passato mi ha fatto brutti scherzi). Semplicemente (da MySql dello slave) chiedete:

SLAVE STATUS;

Buona fortuna ;)

Condividi:
  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • FriendFeed
  • PDF
  • Ping.fm
  • Technorati
  • Twitter