Database Replication · 8 min read · Jan 29, 2026

Replicare un database master utilizzando MariaDB 10 su Debian 8

Replicare i database crea ridondanza che può proteggere contro la perdita di dati e consentire prestazioni ottimizzate per le applicazioni. Questo tutorial coprirà le basi della replicazione di un database master esistente MariaDB 10.0 su uno o più slave. Negli esempi seguenti, il sistema operativo host è Debian 8.

Queste istruzioni possono essere applicate ad altri sistemi operativi, ma sii consapevole che diversi comandi e posizioni predefinite dei file saranno diversi. In particolare, dovresti sostituire i percorsi di /etc/mysql/my.cnf, /var/lib/mysql, il nome e il percorso predefiniti del tuo file di log binario e i comandi per avviare, fermare e riavviare mysqld in base alle specifiche del tuo sistema.

1. Verifica la connettività

Prima di procedere, assicurati che il master e lo slave possano raggiungersi a vicenda sulla rete e che ciascuno abbia una voce per l’altro nei rispettivi file /etc/hosts. Ogni host dovrebbe essere in grado di pingare l’altro e dovresti essere in grado di ssh da ciascuno all’altro come utente normale.

2. Abilita il log binario mysqld sul master

Sull’host master, controlla che il logging binario sia abilitato. Invocando mysqld con i parametri –verbose –help verranno visualizzati i valori operativi per il demone MariaDB. Come root:

mysqld --verbose --help | grep log-bin
...
log-bin         (Nessun valore predefinito)
...

Il valore dell’entrata log-bin definisce la convenzione di denominazione dei file di log binari. Su Debian, questi file risiedono in /var/lib. Se il valore di log-bin è (Nessun valore predefinito), dovrai abilitare il logging modificando il file di configurazione my.cnf. Su Debian, my.cnf risiede nella directory /etc/mysql.

Apri /etc/mysql/my.cnf in un editor di testo e trova il gruppo [mysqld]. Se non esiste, crealo e inserisci una riga che legga semplicemente log-bin.

[mysqld]  
log-bin

Includere questa voce abiliterà il logging binario quando mysqld viene riavviato.

Puoi scegliere di impostare un valore per log-bin, ad esempio log-bin= filename, per definire un nome personalizzato per il file di log binario. In questo tutorial, non imposteremo un valore e verranno utilizzati i nomi di file di log predefiniti.

Riavvia mysqld:

service mysql restart

Verifica che la modifica abbia avuto effetto:

mysqld --verbose --help | grep log-bin
...
log-bin         mysqld-bin
...

Come mostrato qui, il nome predefinito del file di log binario su Debian inizia con mysqld-bin, ad esempio mysqld-bin. nnnnnn.

3. Concedi diritti a un utente di replicazione

È buona pratica far eseguire tutti i compiti di replicazione da un utente di replicazione dedicato. In questi esempi, chiameremo l’utente repluser e imposteremo la password di questo utente sulla stringa replpass.

Concedi a questo utente i privilegi globali SUPER, RELOAD e REPLICATION SLAVE. Questi consentiranno all’utente di replicazione di eseguire comandi da superutente, svuotare le cache del database e recuperare aggiornamenti dal server master.

Accedi al client MariaDB come root del database:

mysql -u root -p

Al prompt di MariaDB, inserisci il comando:

GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';

Qui, il carattere jolly dell’hostname ‘%‘ consente all’utente di replicazione di connettersi da qualsiasi host.

Verifica che i diritti siano stati concessi:

SHOW GRANTS FOR 'repluser'

4. Svuota le cache del database e imposta le tabelle in sola lettura

In preparazione per creare uno snapshot dei database, svuota tutte le tabelle e impostale su READ LOCK. Questo dovrebbe essere fatto rapidamente, durante le ore di bassa affluenza o un periodo di manutenzione del sistema.

Sul master:

FLUSH TABLES WITH READ LOCK;

Ora che le tabelle sono bloccate, controlla lo stato del master:

SHOW MASTER STATUS;

+-------------------+----------+--------------+------------------+  
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |  
+-------------------+----------+--------------+------------------+  
| mysqld-bin.000005 |      995 |              |                  |  
+-------------------+----------+--------------+------------------+

Le tue informazioni saranno diverse, ma annota i valori di File e Position. Utilizzerai queste informazioni nel passo 7.

Esci dal client MariaDB:

\q

5. Crea uno snapshot dei database per l’host slave

Crea un archivio del database o dei database che esistono sul master che desideri replicare. Ognuno di questi database ha la propria directory in /var/lib/mysql. In questo esempio, archivieremo un singolo database, situato nel percorso /var/lib/mysql/dbname.

Questo comando archivia un singolo database. Se stai archiviando database aggiuntivi, aggiungi i loro percorsi completi al comando, ad esempio /var/lib/mysql/dbname1 /var/lib/mysql/dbname2

tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname

Ora, come utente normale username, trasferisci questo file a un account utente normale sull’host slave:

rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.

oppure, usando scp:

scp mysql-master.tar.bz2 [username]@slavehost:~/.

Quindi, SSH nell’host slave:

ssh [username]@slavehost

Come root, ferma mysqld sullo slave:

service mysql stop

…e estrai l’archivio:

tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.

6. Configura gli ID del server per master e slave

Modifica /etc/mysql/my.cnf sul master, aggiungendo l’entrata server-id= n nel gruppo [mysqld], dove n è un intero unico che identifica il server. Comunemente, n =1 per il server master, ma n può essere qualsiasi intero unico nell’intervallo [ 1, 2^32-1 ]. Imposteremo il nostro master su server-id=1 e il nostro slave su server-id=100.

(Se my.cnf non esiste sullo slave, crealo. Se esiste, cerca un’entrata esistente server-id e decommenta/modifica quella riga).

In /etc/mysql/my.cnf sull’host master:

[mysqld]  
server-id=1

In /etc/mysql/my.cnf sull’host slave:

[mysqld]  
server-id=100

7. Sblocca le tabelle e avvia/riavvia mysqld su master e slave

Sul server master, nel client MariaDB come root del database, sblocca le tabelle:

mysql -u root -p
UNLOCK TABLES;
\q

Riavvia mysqld sul master:

service mysql restart

E avvialo sullo slave:

service mysql start

Puoi verificare che il nuovo valore server-id abbia avuto effetto su ciascun host. Come root:

mysqld --verbose --help | grep server-id

8. Configura l’identità del master sullo slave

Sullo slave, configura l’identità del server master. Accedi al client MariaDB:

mysql -u root -p

Esegui il seguente comando, sostituendo i valori di MASTER_LOG_FILE e MASTER_LOG_POS con il log binario File e Position che hai registrato nel passo 4, e i valori di MASTER_HOST, MASTER_USER e MASTER_PASSWORD con i tuoi valori.

CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;

9. Attiva lo slave

Sullo slave, nel client MariaDB come root del database:

START SLAVE;

Ora puoi controllare lo stato dello slave:

SHOW SLAVE STATUS \G;
************************* 1. row *************************  
               Slave_IO_State: Waiting for master to send event  
                  Master_Host: masterhost  
                  Master_User: repluser  
                  Master_Port: 3306  
                Connect_Retry: 60  
              Master_Log_File: mysqld-bin.000009  
          Read_Master_Log_Pos: 1330  
               Relay_Log_File: mysqld-relay-bin.000008  
                Relay_Log_Pos: 1618  
        Relay_Master_Log_File: mysqld-bin.000009  
               Slave_IO_Running: Yes  
            Slave_SQL_Running: Yes  
              Replicate_Do_DB:   
          Replicate_Ignore_DB:   
           Replicate_Do_Table:   
       Replicate_Ignore_Table:   
      Replicate_Wild_Do_Table:   
  Replicate_Wild_Ignore_Table:   
                   Last_Errno: 0  
                   Last_Error:   
                   Skip_Counter: 0  
          Exec_Master_Log_Pos: 1330  
              Relay_Log_Space: 2204  
              Until_Condition: None  
               Until_Log_File:   
                Until_Log_Pos: 0  
           Master_SSL_Allowed: No  
           Master_SSL_CA_File:   
           Master_SSL_CA_Path:   
              Master_SSL_Cert:   
            Master_SSL_Cipher:   
               Master_SSL_Key:   
        Seconds_Behind_Master: 0  
Master_SSL_Verify_Server_Cert: No  
                Last_IO_Errno: 0  
                Last_IO_Error:   
               Last_SQL_Errno: 0  
               Last_SQL_Error:   
  Replicate_Ignore_Server_Ids:   
               Master_Server_Id: 1  
               Master_SSL_Crl:   
           Master_SSL_Crlpath:   
                   Using_Gtid: No  
                  Gtid_IO_Pos:

Se ci sono errori nei processi di replicazione, li vedrai elencati qui.

10. Apporta modifiche sul master e verifica la replicazione sullo slave

Puoi verificare che la replicazione stia avvenendo creando un nuovo database sul master e vedendo le modifiche sullo slave.

mysql -u root -p

Crea un nuovo database:

CREATE DATABASE repltest;
USE repltest

Crea una tabella e inserisci un valore:

CREATE TABLE test (hello VARCHAR(10));
INSERT INTO test VALUES ('world');
\q

Ora accedi al client MariaDB sullo slave:

mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+  
| hello |  
+-------+  
| world |  
+-------+  
1 row in set (0.00 sec)

11. Ripeti il processo per ulteriori slave

Puoi ripetere questo processo per ciascun slave aggiuntivo. In particolare, esegui questi passaggi:

11 ( a) . Sul master, nel client MariaDB come root del database, svuota e blocca le tabelle:

FLUSH TABLES WITH READ LOCK;

Dopo aver bloccato, mostra lo stato del master:

**SHOW MASTER STATUS;

Annota i valori di File e Position.

11 ( b) . Sul master, come root:

tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname

11 ( c) . Sul master, come utente normale:

rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.

11 ( d) . Sullo slave, come root:

service mysql stop
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.

11 ( e) . In /etc/mysql/my.cnf sull’host slave, aggiungi o modifica la riga server-id= nel gruppo [mysqld], dove il valore di server-id è nuovo e unico:

[mysqld]  
server-id=200

11 ( f) . Sul master, nel client MariaDB come root del database, sblocca le tabelle:

UNLOCK TABLES;

11 ( g) . Sul master, come root, riavvia mysqld:

service mysql restart

11 ( h) . Sullo slave, come root, avvia mysqld:

**service mysql start

11 ( i) . Sullo slave, nel client MariaDB come root del database, configura l’identità del master e il nome del file di log binario e la posizione dal passo 10(a):

CHANGE MASTER TO MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;

11 ( j) . Sullo slave, nel client MariaDB come root del database, attiva la replicazione:

START SLAVE;

12. Risoluzione dei problemi: Slave non in grado di connettersi al master

Controlla /var/mysql/my.cnf sul master per un’entrata bind-address. Se bind-address è impostato su 127.0.0.1, il server accetterà solo connessioni da localhost. Decommenta questa riga o imposta il valore su * per consentire connessioni da tutti gli indirizzi IPv4 e IPv6. Se modifichi my.cnf, non dimenticare di riavviare mysqld.

Se le connessioni non funzionano ancora, assicurati che il tuo server stia consentendo connessioni sulla porta 3306. Sul master, elenca le tabelle del firewall del kernel:

iptables -L

Puoi creare un’autorizzazione per le connessioni sulla porta 3306 con il seguente comando, sostituendo il nome del tuo dispositivo di interfaccia di rete per eth0 se necessario:

iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT
Share: X/Twitter LinkedIn

Ricevi i nuovi post nella tua casella di posta.

Nessuno spam. Disiscriviti in qualsiasi momento.