La replica MySQL consente a più copie dello stesso database di trovarsi su più server contemporaneamente, copiando automaticamente i dati dal server primario al server "slave".
Grazie a questo meccanismo tutte le istruzioni eseguite sul master, che in qualche modo modificano i dati possono essere registrate, trasmesse ed eseguite sui database replicati.
Questa guida ti aiuterà a installare MySQL sul tuo server, configurare correttamente una replica e verificarne il funzionamento con i dati di test.
Per prima cosa, connettiti al tuo server tramite una connessione SSH. Se non l'hai ancora fatto, ti consigliamo di seguire la nostra guida per connetterti in sicurezza con il protocollo SSH. Nel caso di un server locale, vai al passaggio successivo e apri il terminale del server.
Installazione MySQL
Per impostare la replica Master/Slave su entrambi i server, installa una versione di MySQL, quindi esegui la seguente procedura di installazione su entrambe le macchine, prima di procedere al capitolo successivo.
Aggiorna i repository di distribuzione, per assicurarti di scaricare la versione più aggiornata di MySQL:
$ sudo apt update
Se hai già lanciato questo comando in precedenza, vai al passaggio successivo.
Ora procedi con l'installazione di MySQL:
$ sudo apt install mysql-server
Per assicurarti che l'installazione sia andata a buon fine, controlla la versione di MySQL:
$ mysqld --version
Se la procedura è stata eseguita con successo, sullo schermo verrà stampata la versione di MySQL installata.
Procedi con la protezione di MySQL eseguendo uno script incluso in MySQL, che aumenterà la sicurezza e limiterà l'accesso ai tuoi database:
$ sudo mysql_secure_installation
A questo punto una procedura guidata ti guiderà nella configurazione del livello di sicurezza di MySQL.
In primo luogo, ti verrà chiesto se desideri abilitare il sistema di convalida della password. Se abilitato, quando si imposta la password di un utente, la password viene valutata e se non soddisfa i criteri di sicurezza viene rifiutata con un errore.
Successivamente ti verrà chiesto se vuoi cambiare la password di root con una a tua scelta (se abiliti il sistema di validazione password devi inserire una password che soddisfi i criteri di sicurezza).
Si consiglia di seguire diverse best practice per la creazione di una password sicura. Ciò include:
l'uso di lettere maiuscole e minuscole
l'uso di lettere e numeri
l'uso di caratteri non alfanumerici come @ # $% ˆ &!
l'uso di password mai utilizzate in precedenza.
Scegli infine se rimuovere gli utenti anonimi, testare i database e se disabilitare il login remoto con utente root. Per un livello di sicurezza adeguato si consiglia di confermare tutte queste modifiche.
A questo punto conferma gli aggiornamenti della tabella dei permessi visualizzata per applicare tutti i nuovi criteri di sicurezza.
Riavvia finalmente il servizio per applicare le modifiche:
$ sudo service mysql restart
Configurazione della replica Master/Slave
Dopo l'installazione su entrambi i server (Master e Slave), procedere prima configurando il server Master.
Per prima cosa, modifica il file di configurazione in /etc/mysql/mysql.conf.d/mysqld.cnf come segue:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
Dato che il server Slave dovrà necessariamente connettersi in remoto al server Master, devi assicurarti che il servizio MySQL possa accettare connessioni esterne, modificando il bind-address come segue:
bind-address = 0.0.0.0
Una volta completato, riavvia il servizio per applicare le modifiche:
$ sudo service mysql restart
A scopo dimostrativo e di valutazione, creare un database di test sul server master (qui chiamato "tutorial") con una tabella denominata "numbers" con dati fittizi. Al termine della procedura di configurazione verificare se tutti i dati qui inseriti sono sincronizzati con il server Slave:
$ sudo mysql -u root -p
mysql> CREATE DATABASE tutorial;
Query OK, 1 row affected (0.00 sec)
mysql> USE tutorial;
Database changed
mysql> CREATE TABLE numbers ( value REAL );
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO numbers VALUES ( 1 ), ( 2 ), ( 3 );
Query OK, 3 rows affected (0.04 sec)
Records: 3 Duplicates: 0 Warnings: 0
Assicurati quindi che i valori che hai appena inserito siano presenti nella tabella di test:
mysql> SELECT * FROM numbers;
+-------+
| value |
+-------+
| 1 |
| 2 |
| 3 |
+-------+
3 rows in set (0.00 sec)
La tabella dei numeri dovrebbe contenere 3 righe di esempio come mostrato sopra.
Procedi quindi creando i dati di accesso per l'utente da utilizzare nel database Slave:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'usr_replica'@'%' IDENTIFIED BY 'SMDipmf#23$42';
mysql> FLUSH PRIVILEGES;
Prima di procedere con la configurazione del server Slave, verrà stampato a video lo stato attuale del Master e verranno salvate le seguenti informazioni:
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1238 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
Ti serviranno questi dati durante la configurazione del server Slave.
Procedi per uscire dalla shell MySQL:
mysql> exit
Bye
Quindi salva un dump completo del database per caricarlo successivamente sul server Slave:
$ sudo mysqldump -u root -p --opt tutorial > slave-init.sql
Enter password:
Trasferisci il file appena creato sulla macchina slave e procedi con la sua configurazione, modificando il file /etc/mysql/mysql.conf.d/mysqld.cnf:
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
Si prega di notare che l'id del server è stato modificato utilizzando il numero 2 e ricordarsi anche di cambiare l'indirizzo di collegamento come mostrato qui:
bind-address = 0.0.0.0
Ora riavvia lo Slave per applicare le modifiche:
$ sudo service mysql restart
Ora procedi creando un database con lo stesso nome del server Master:
$ sudo mysql -u root -p
mysql> create database tutorial;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
Ora importare il backup appena creato e avviare lo Slave utilizzando le informazioni precedentemente salvate dal database Master (MASTER_LOG_FILE e MASTER_LOG_POS):
$ sudo mysql -u root tutorial < /root/slave.sql
$ sudo mysql -u root -p
mysql> CHANGE MASTER TO MASTER_HOST='195.231.4.201', MASTER_USER='usr_replica', MASTER_PASSWORD='SMDipmf#23$42', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 1238;
Query OK, 0 rows affected, 2 warnings (0.10 sec)
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
Da questo momento in poi, i database vengono sincronizzati in tempo reale e puoi uscire dalla shell MySQL.
Verifica del corretto funzionamento della replica
Per verificare il funzionamento della replica si può provare ad inserire i dati nel Master e verificare se arrivano correttamente al database Slave. Inizia inserendo nuovi dati sul Master come segue:
$ sudo mysql -u root -p
mysql> use tutorial;
Reading table information for completion of table and column names
Turn off this feature to get a quicker startup with -A
Database changed
mysql> INSERT INTO numbers VALUES ( 4 ) , ( 5 );
Query OK, 2 rows affected (0.03 sec)
Records: 2
Duplicates: 0
Warnings: 0
Quindi procedi interrogando il database Slave:
$ sudo mysql -u root -p
mysql> use tutorial;
Reading table information for completion of table and column names
Turn off this feature to get a quicker startup with -A
changed
mysql> SELECT * FROM numbers;
+-------+
| value |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+-------+
5 rows in set (0.00 sec)
Come puoi vedere, sul database Slave sono arrivati i nuovi valori (4 e 5), quindi la sincronizzazione sta funzionando correttamente.