La replica dei database crea ridondanza che può proteggere dalla perdita di dati e consentire prestazioni ottimizzate per le applicazioni. Questo tutorial tratterà le basi della replica di un database master MariaDB 10.0 esistente su uno o più slave. Negli esempi seguenti, il sistema operativo host è Debian 8.
Queste istruzioni possono essere applicate ad altri sistemi operativi, ma tieni presente che diversi comandi e percorsi di file predefiniti saranno diversi. In particolare, dovresti sostituire i percorsi di /etc/mysql/my.cnf , /var/lib/mysql , il nome e il percorso predefiniti del file di log binario e i comandi per avviare, arrestare 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 sulla rete e che ciascuno abbia una voce per l'altro nei rispettivi /etc/hosts File. Ciascun host dovrebbe essere in grado di ping l'altro e dovresti essere in grado di ssh dall'uno all'altro come un normale utente.
2. Abilita il log binario mysqld sul master
Sull'host master, verificare che la registrazione binaria sia abilitata. Invocando mysqld con le opzioni --verbose --help visualizzerà i valori operativi per il demone MariaDB. Come root:
mysqld --verbose --help | grep log-bin
...
log-bin (No default value)
...
Il valore della voce log-bin definisce la convenzione di denominazione dei file di registro binari. Su Debian, questi file risiedono in /var/lib . Se il valore di log-bin è (Nessun valore predefinito) , dovrai abilitare la registrazione 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 individua [mysqld] gruppo. Se non esiste, crealo e inserisci una riga che legge semplicemente log-bin .
[mysqld]
log-bin
L'inclusione di questa voce consentirà la registrazione binaria al riavvio di mysqld.
Puoi scegliere di impostare un valore per log-bin , per esempio. log-bin=nome file , per definire un nome personalizzato per il file di log binario. In questo tutorial, non imposteremo un valore e verranno utilizzati i nomi dei file di registro predefiniti.
Riavvia mysqld:
service mysql restart
Verifica che la modifica sia entrata in vigore:
mysqld --verbose --help | grep log-bin
...
log-bin mysqld-bin
...
Come mostrato qui, il nome del file di registro binario predefinito su Debian inizia con mysqld-bin , per esempio. mysqld-bin.nnnnnn .
3. Concedi i diritti a un utente di replica
È consigliabile che tutte le attività di replica vengano eseguite da un utente di replica dedicato. In questi esempi, chiameremo l'utente repluser e imposta la password di questo utente sulla stringa replpass .
Concedi a questo utente i privilegi globali SUPER , RICARICA e REPLICAZIONE SLAVE . Questi consentiranno all'utente di replica di eseguire comandi di superutente, svuotare la cache del database e recuperare gli aggiornamenti dal server principale.
Inserisci il client MariaDB come radice 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 del nome host '% ' consente all'utente di replica di connettersi da qualsiasi host.
Verifica che i diritti siano stati concessi:
SHOW GRANTS FOR 'repluser'\G;
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 non di punta o durante un periodo di manutenzione del sistema.
Sul maestro:
FLUSH TABLES WITH READ LOCK;
Ora che le tabelle sono bloccate, controlla lo stato principale:
MOSTRA STATO MASTER;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000005 | 995 | | |
+-------------------+----------+--------------+------------------+
Le tue informazioni saranno diverse, ma annota i valori di File e Posizione . Utilizzerai queste informazioni nel passaggio 7.
Esci dal client MariaDB:
\q
5. Database di snapshot per l'host slave
Creare un archivio del database o dei database esistenti sul master che si desidera replicare. Ciascuno di questi database ha la propria directory in /var/lib/mysql . In questo esempio, eseguiremo il tar su un unico database, residente 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 es. /var/lib/mysql/dbname1 /var/lib/mysql/dbname2 ...
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
Ora, come utente normale nome utente , trasferisci questo file su un normale account utente sull'host slave:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
oppure, usando scp:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
Quindi, SSH all'host slave:
ssh [username]@slavehost
Come root, ferma mysqld sullo slave:
service mysql stop
...ed estrai l'archivio:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
6. Configura gli ID server per master e slave
Modifica /etc/mysql/my.cnf sul master, aggiungendo la voce server-id=n in [mysqld] gruppo, dove n è un numero intero univoco che identifica il server. Comunemente, n =1 per il server principale, ma n può essere qualsiasi numero intero univoco nell'intervallo [1 , 2^32-1 ]. Imposteremo il nostro master su server-id=1 e il nostro schiavo di server-id=100 .
(Se mio.cnf non esiste sullo slave, crealo. Se esiste, cerca un ID server esistente voce e rimuovere il commento/modificare quella riga).
In /etc/mysql/my.cnf sull'host principale:
[mysqld]
server-id=1
In /etc/mysql/my.cnf sull'host slave:
[mysqld]
server-id=100
7. Sblocca tabelle e avvia/riavvia mysqld su master e slave
Sul server master, nel client MariaDB come database root, 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 ID server valore ha avuto effetto su ciascun host. Come root:
mysqld --verbose --help | grep server-id
8. Configura l'identità del master sullo slave
Nello slave, configurare l'identità del server master. Inserisci il client MariaDB:
mysql -u root -p
Esegui il comando seguente, sostituendo i valori di MASTER_LOG_FILE e MASTER_LOG_POS con il registro binario File e Posizione che hai registrato nel passaggio 4 e i valori di MASTER_HOST , MASTER_USER e PASSWORD_MASTER 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 slave
Nello slave, nel client MariaDB come database root:
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 replica, li vedrai elencati qui.
10. Apporta modifiche sul master e verifica la replica sullo slave
Puoi verificare che la replica sia in corso creando un nuovo database sul master e visualizzando 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 inserisci il client MariaDB sullo slave:
mysql -u root -p
USE repltest
SELECT * FROM test;
+-------+
| hello |
+-------+
| world |
+-------+
1 row in set (0.00 sec)
11. Ripetere il processo per gli slave aggiuntivi
È possibile ripetere questo processo per ogni slave aggiuntivo. In particolare, eseguire questi passaggi:
11 (a ). Sul master, nel client MariaDB come radice del database, svuota e blocca le tabelle:
FLUSH TABLES WITH READ LOCK;
Dopo il blocco, mostra lo stato master:
SHOW MASTER STATUS;
Annota il File e Posizione valori.
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 ). Nello 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 server-id= riga nella [mysqld] gruppo, dove il valore di server-id è nuovo e unico:
[mysqld]
server-id=200
11 (f ). Sul master, nel client MariaDB come database root, 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 (io ). Sullo slave, nel client MariaDB come database root, configura l'identità del master e il nome del file di log binario e la posizione dal passaggio 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 database root, attiva la replica:
START SLAVE;
12. Risoluzione dei problemi:lo slave non riesce a connettersi al master
Controlla /var/mysql/my.cnf sul master per un indirizzo di rilegatura iscrizione. Se indirizzo vincolante è impostato su 127.0.0.1 , il server accetterà solo connessioni da localhost. Commenta questa riga o imposta il valore su * per consentire le connessioni da tutti gli indirizzi IPv4 e IPv6. Se modifichi my.cnf , non dimenticare di riavviare mysqld.
Se le connessioni continuano a non funzionare, assicurati che il tuo server consenta le connessioni sulla porta 3306 . Sul master, elenca le tabelle del firewall del kernel:
iptables -L
Puoi creare un limite per le connessioni sulla porta 3306 con il comando seguente, sostituendo il nome del dispositivo dell'interfaccia di rete con eth0 se necessario:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT