Tutorial > Come configurare un database slave MySQL su Ubuntu 18.04

Come configurare un database slave MySQL su Ubuntu 18.04

Pubblicato il: 10 ottobre 2019

Database DBMS MySQL Replication Ubuntu

La Replica di MySQL consente di avere copie multiple dello stesso database su più server, copiando automaticamente i dati dal server primario al server “slave”.

Questo meccanismo consente di registrare tutti gli statement eseguiti sul master, che operano una qualche modifica ai dati, per trasmetterli ed eseguirli sui database in replica.

Questa guida ti aiuterà a installare MySQL sul tuo server, configurare correttamente una replica e verificarne il funzionamento con dei dati di test.

Per prima cosa dovrai connetterti 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. In caso di server locale puoi passare al punto successivo e aprire il terminale del tuo server.

Installazione di MySQL

Per impostare una replica Master / Slave su entrambi i server, devi prima installare una versione di MySQL, per cui esegui la seguente procedura di installazione su entrambe le macchine prima di procedere al capitolo successivo.

Aggiorna i repository della distribuzione, per essere sicuro di scaricare la versione più aggiornata di MySQL:

$ sudo apt update

N.B. Se hai già lanciato questo comando precedentemente allora puoi passare allo step successivo.

Ora puoi procedere con l'installazione di MySQL:

$ sudo apt install mysql-server

Per essere sicuro che l'installazione sia andata a buon fine, verifica la versione di MySQL:

$ mysqld --version

Se la procedura è stata eseguita correttamente verrà stampata a schermo la versione di MySQL installata.

Procedi con la messa in sicurezza di MySQL eseguendo uno script incluso con MySQL, che aumenterà la sicurezza e limiterà l'accesso ai tuoi database:

$ sudo mysql_secure_installation

A questo punto inizierà una procedura guidata che ti permetterà di configurare il livello di sicurezza di MySQL.

Per prima cosa ti verrà chiesto se vuoi abilitare il sistema di validazione delle password: se abiliti questo sistema quando imposterai una password per un utente questa sarà valutata e se non rispetterà i criteri di sicurezza verrà rifiutata con un errore.

In seguito ti verrà chiesto se vuoi cambiare la password di root con una di tua preferenza (se abiliti il sistema di validazione delle password dovrai inserire una password che rispetti i criteri di sicurezza).

Ti consigliamo di seguire alcune best practices per la creazione di una password sicura, tra cui:

  • Utilizzare sia maiuscole che minuscole

  • Utilizzare sia lettere che numeri

  • Utilizzare caratteri non alfanumerici come @#$%ˆ&!

  • Utilizzare password diverse da altre precedentemente utilizzate.

Infine dovrai scegliere se rimuovere gli utenti anonimi, i database di test e se disabilitare il login remoto con l'utente root: consigliamo di confermare tutte queste modifiche per avere un livello di sicurezza accettabile.

A questo punto conferma l'aggiornamento della tabella dei permessi per applicare i nuovi criteri di sicurezza.

Infine riavvia il servizio per applicare le modifiche:

$ sudo service mysql restart

Configurare la replica Master / Slave

Dopo aver effettuato l’installazione su entrambi i server (Master e Slave) puoi procedere configurando inizialmente il server Master.

Per prima cosa, modifica il file di configurazione presente 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 collegarsi da remoto al server Master, devi assicurarti che il servizio MySQL possa accettare connessioni esterne, andando a modificare il bind-address come segue:

bind-address            = 0.0.0.0

Una volta completato, riavvia il servizio per applicare le modifche:

$ sudo service mysql restart

A scopo dimostrativo e di verifica, crea un database di test sul server master (che chiameremo “tutorial”) con una tabella di nome “numbers” con dei dati fittizi. Dopo aver completato la procedura di configurazione andremo a verificare che tutti i dati qui inseriti vengano 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 appena inseriti siano presenti nella tabella di test:

mysql> SELECT * FROM numbers;
    
+-------+
| value |
+-------+
|     1 |
|     2 |
|     3 |
+-------+
3 rows in set (0.00 sec)

La tabella numbers dovrebbe contenere 3 righe di esempio come indicato sopra.

Procedi quindi creando dei dati di accesso per l’utente che verranno utilizzati dal database Slave:

mysql> GRANT REPLICATION SLAVE ON *.* TO 'usr_replica'@'%' IDENTIFIED BY 'SMDipmf#23$42';
mysql> FLUSH PRIVILEGES;

Prima di passare alla configurazione del server Slave, stampiamo a schermo lo stato attuale del Master e salviamo le seguente 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)

Questi dati ti serviranno durante la configurazione del server Slave.

Procedi uscendo dalla shell MySQL:

mysql> exit
Bye

Quindi salva un dump completo del database per caricarlo successivamente nel server Slave:

$ sudo mysqldump -u root -p --opt tutorial > slave-init.sql
Enter password:

Trasferisci il file appena creato nella macchina slave e procedi con la sua configurazione, sempre 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

Nota bene che abbiamo variato l’id del server utilizzando il numero 2 e ricordati inoltre di cambiare il bind-address come segue:

bind-address            = 0.0.0.0

Riavvia ora lo Slave per applicare le modifiche:

$ sudo service mysql restart

Procedi quindi creando un database di nome identico al server Master:

$ sudo mysql -u root -p

mysql> create database tutorial;

Query OK, 1 row affected (0.00 sec)
mysql> exit

Bye

Adesso puoi 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 sono sincronizzati in tempo reale e puoi uscire dalla shell MySQL.

Verificare il funzionamento della replica

Per verificare il funzionamento della replica puoi provare a inserire dei dati nel Master e controllare che arrivino 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 
You can 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

Procedi quindi interrogando il database Slave:

$ sudo mysql -u root -p

mysql> use tutorial;

Reading table information for completion of table and column names

You can 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 notare, sul database Slave sono arrivati i nuovi valori (4 e 5), quindi la sincronizzazione sta funzionando correttamente.