Il MySQL è un sistema di gestione di database relazionali che è uno dei progetti open source più popolari. Sebbene noto per la sua stabilità, MySQL è ancora più affidabile se è configurata la replica della replica sorgente. Nella replica, un server MySQL è generalmente designato come origine . Un'origine invia le modifiche al database e gli aggiornamenti dei dati a una o più replica server di database. La procedura di replica dei dati di MySQL è flessibile e non è necessario che i server di replica siano collegati permanentemente all'origine. Questa guida spiega come configurare la replica dei dati della replica sorgente in MySQL.
Come funziona la replica dei dati MySQL
Il processo di replica archivia i dati prima nel database di origine, quindi li copia in qualsiasi replica. Dopo aver elaborato l'istruzione, il server del database di origine tiene traccia della modifica in un registro binario. Il registro funge da registrazione sequenziale di tutte le modifiche alla struttura e al contenuto del database. SELECT
le dichiarazioni non vengono registrate perché non modificano il contenuto del database.
Gli aggiornamenti avvengono in modo asincrono, quindi le repliche non devono essere continuamente connesse. Ciò contrasta con le architetture sincrone dei sistemi ad alta affidabilità. Se è richiesta la sincronizzazione in tempo reale, MySQL consiglia di utilizzare il cluster NDB .
Ogni replica estrae i dati dall'origine richiedendo il contenuto del log binario dell'origine. La replica applica quindi le istruzioni in ordine, riproducendo efficacemente gli eventi che si sono verificati sulla fonte. Ogni replica è indipendente e tiene traccia della sua posizione corrente con il log binario di origine. Inoltre, ogni replica può sincronizzarsi con l'origine in base alla propria pianificazione. I dati possono essere letti da qualsiasi server, comprese le repliche.
MySQL consente un elevato grado di granularità. È possibile replicare su determinati database o persino tabelle specifiche all'interno di un database. Il formato di replica predefinito è Replica basata su istruzioni (SBR), in cui viene replicata l'intera istruzione SQL. Tuttavia, Replica basata su righe (RBR) è anche disponibile. Questo formato replica le righe che sono state modificate. È anche possibile configurare configurazioni molti-a-molti più complicate. Consulta la documentazione di MySQL per ulteriori informazioni sulle diverse opzioni di replica.
Nota MySQL in precedenza si riferiva alla replica della replica sorgente come "replica master-slave". L'organizzazione MySQL ha recentemente cambiato la terminologia, spiegando il loro ragionamento nell'aggiornamento della terminologia. Il vecchio termine "master" è stato cambiato in "source", mentre uno "slave" viene ora chiamato "replica". I vecchi termini potrebbero ancora apparire in alcuni comandi e display di output mentre MySQL aggiorna la sua base di codice. Questa guida utilizza i termini preferiti di MySQL in tutte le istruzioni.
Vantaggi della replica dei dati MySQL
L'abilitazione della replica della replica del codice sorgente offre molti vantaggi significativi rispetto a un sistema non ridondante. L'elenco seguente fornisce una panoramica di alcuni vantaggi:
-
È facile creare una copia di backup live in qualsiasi momento. Poiché il processo di replica è asincrono, la replica può essere eseguita in base a qualsiasi pianificazione. Le repliche non devono essere mantenute sincronizzate con l'origine per funzionare in modo affidabile.
-
L'aggiunta di una replica può aumentare il tempo di attività e l'affidabilità dell'intero sistema. Il controllo primario può passare alla replica se è necessaria la manutenzione o se il database di origine non è disponibile.
-
Ogni replica fornisce un'altra istanza leggibile del database. Ciò consente ai programmi di data mining o analisi di eseguire query sulla replica senza caricare ulteriormente il database di origine originale.
-
Questa architettura aumenta la scalabilità e le prestazioni. Il database legge e
SELECT
le istruzioni possono essere bilanciate tra i server, riducendo la latenza. -
Terze parti possono ottenere l'accesso in sola lettura a un database tramite una replica e non richiedono più l'accesso all'origine. Un database di replica può essere creato su richiesta quando è necessario e distrutto quando non è più necessario. Questa tecnica migliora la sicurezza e garantisce l'impossibilità di manomettere i dati originali.
Prima di iniziare
-
Se non l'hai già fatto, crea un account Linode e un'istanza di calcolo. Consulta le nostre guide Introduzione a Linode e Creazione di un'istanza di calcolo.
-
Segui la nostra guida alla configurazione e alla protezione di un'istanza di calcolo per aggiornare il tuo sistema. Potresti anche voler impostare il fuso orario, configurare il tuo nome host, creare un account utente limitato e rafforzare l'accesso SSH.
-
È necessario disporre di almeno due Linode separati per configurare la replica della replica sorgente di MySQL. Un Linode ospita il database di origine, mentre un altro nodo è necessario per il server di replica.
Nota I passaggi in questa guida sono scritti per un utente non root. I comandi che richiedono privilegi elevati sono preceduti dasudo
. Se non hai familiarità consudo
comando, vedere la guida per utenti e gruppi Linux.
Configura replica replica sorgente in MySQL
Per configurare la replica della replica sorgente, MySQL deve essere installato su due server separati in grado di comunicare tra loro. Queste istruzioni sono orientate alla distribuzione Ubuntu ma sono generalmente applicabili a tutte le distribuzioni Linux. Il processo consiste nei seguenti passaggi:
- Installa MySQL.
- Configura il database di origine MySQL.
- Configura un nuovo utente MySQL per la replica.
- Prepara i dati MySQL per la replica.
- Configura il database di replica MySQL.
- Importa i dati MySQL replicati e attiva la replica.
Installa MySQL
Se MySQL non è già disponibile su entrambi i Linode, installalo seguendo i seguenti passaggi:
-
Aggiorna i Linode.
sudo apt-get update && sudo apt-get upgrade
-
Installa il server MySQL e le applicazioni client sia sul server di origine che su quello di replica.
sudo apt-get install mysql-server mysql-client -y
-
Configura le opzioni di sicurezza, inclusa la password di root, usando
mysql_secure_installation
comando.sudo mysql_secure_installation
-
Se stai utilizzando un firewall come
ufw
, assicurati che consenta il passaggio del traffico MySQL. Aggiungi la seguente regola per aprire la porta3306
sul firewall.ufw allow mysql
Configura il database sorgente MySQL
Per abilitare la replica di MySQL, modifica alcune variabili nel file di configurazione MySQL principale. Apporta le seguenti modifiche alla configurazione del database di origine.
-
Individua il file di configurazione MySQL principale sul server del database di origine. Questo file si trova solitamente in
/etc/mysql/mysql.conf.d/mysqld.cnf
. Tuttavia, nelle installazioni precedenti, potrebbe trovarsi in/etc/my.cnf
o/etc/mysql/my.cnf
. Potrebbe anche essere referenziato da uno dei file tramite unincludedir
direttiva. -
Apri il file di configurazione di MySQL e cambia il
bind-address
all'indirizzo IP del server di origine.- File:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = <source_ip_address>
-
Decommenta o aggiungi le righe per
server-id
elog-bin
. Imposta ilserver-id
a1
elog-bin
a/var/log/mysql/mysql-bin.log
.Nota Assicurati di
skip_networking
la variabile non è dichiarata da nessuna parte. Commentalo se appare all'interno di questo file. Per replicare un singolo database, aggiungi la rigabinlog_do_db = <database_name>
al file.- File:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Riavvia il servizio MySQL.
sudo systemctl restart mysql
-
Verifica lo stato di MySQL e assicurati che sia
active
.sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago
Configura un nuovo utente MySQL per la replica
È necessario creare un nuovo utente sul server di origine per rappresentare la replica. I nuovi utenti vengono creati all'interno della shell MySQL.
-
Entra nella shell MySQL.
sudo mysql -u root -p
-
Aggiungi un utente per l'account di replica utilizzando MySQL
CREATE USER
sintassi. Il nome utente deve essere costituito dal nome dell'account di replica, un@
simbolo e l'indirizzo IP del server di replica. Scegli una password più sicura per l'account al posto diREPLICA_PASSWORD
.CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
Nota Per consentire alla replica di connettersi da qualsiasi indirizzo, specifica l'utente come
'replica_account_name'@'%'
. Il%
il simbolo rappresenta qualsiasi indirizzo o dominio. Ciò fornisce ulteriore flessibilità a scapito di una certa sicurezza. -
Concedi i diritti di replica all'utente della replica remota.
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
Prepara i dati MySQL per la replica
A questo punto, è necessario svuotare e bloccare il database di origine per organizzare i dati per la replica.
-
Rimani all'interno della shell MySQL e svuota i privilegi per ricaricare le tabelle di concessione senza riavviare il database.
FLUSH PRIVILEGES;
-
Blocca il database per bloccare il database in un punto stabile da cui esportare i dati. Mantieni il client MySQL in esecuzione fino a quando non esporti il database. L'immissione di qualsiasi comando di scrittura o l'uscita dalla shell MySQL rilascia il blocco.
FLUSH TABLES WITH READ LOCK;
Attenzione Questo comando blocca tutti i commit nel database di origine. Esporta i dati prima di consentire all'origine di elaborare altri commit. In caso contrario, il database di replica potrebbe danneggiarsi o risultare incoerente con il database di origine. Completa i due passaggi rimanenti in questa sezione il prima possibile.
-
Verificare lo stato del database utilizzando il comando seguente. Questo comando visualizza il file di registro corrente insieme alla posizione dell'ultimo record in questo file. Registra queste informazioni perché sono necessarie per avviare la replica sulla replica in un secondo momento.
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1301 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
Usando la shell Linux da una console diversa, esporta il database usando
mysqldump
attrezzo. Seleziona un nome memorabile per il file di destinazione. Includi il–master-data
opzione per aggiungere informazioni sul file di registro e la posizione del record corrente al registro.sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
Nota Per esportare un singolo database, includi il
--opt <database_name>
opzione anziché-–all-databases
. -
Nella shell MySQL originale, sblocca il database di origine.
UNLOCK TABLES;
-
Esci dalla shell MySQL.
QUIT;
-
Copiare il file di database esportato sul server di database di replica, utilizzando
ftp
,scp
o un altro metodo per trasferire il file.scp databasecopy.sql [email protected]<replica_ip_address>
Configura il database di replica MySQL
La configurazione seguente deve essere applicata alla configurazione del database di replica. Per installare MySQL sul server di replica, vedere la sezione Installazione MySQL.
-
Apri il file MySQL principale, che di solito si trova in
/etc/mysql/mysql.conf.d/mysqld.cnf
e cambia l'bind-address
in modo che corrisponda all'indirizzo IP del server di replica.- File:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = xx.xx.xx.xx
-
Decommenta o aggiungi le righe per
server-id
elog-bin
. L'server-id
deve essere impostato su2
sulla replica, mentre illog-bin
la variabile deve essere impostata su/var/log/mysql/mysql-bin.log
. Aggiungi una variabile perrelay-log
e impostalo su/var/log/mysql/mysql-relay-bin.log
.Nota Assicurati di
skip_networking
la variabile non è impostata da nessuna parte all'interno di questo file. Per replicare un singolo database, aggiungi la seguente direttiva al filebinlog_do_db = database_name
. Per configurare più di una replica, numerareserver-id
valori in modo sequenziale. Ad esempio, una seconda replica avrebbe unserver-id
di3
.- File:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3 4
server-id = 2 log_bin = /var/log/mysql/mysql-bin.log relay-log = /var/log/mysql/mysql-relay-bin.log
-
Riavvia il servizio MySQL per incorporare le modifiche.
sudo systemctl restart mysql
-
Verifica lo stato di MySQL e assicurati che sia
active
.sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
-
(Facoltativo ) MySQL consiglia di utilizzare SSL per connettersi alla sorgente per una maggiore sicurezza. Ulteriori informazioni sulla configurazione di SSL sono disponibili nella documentazione SSL MySQL. LoStrumento di configurazione RSA può essere utilizzato per accelerare questo processo.
Importa i dati MySQL replicati e attiva la replica
Il passaggio successivo consiste nell'importare la copia dei dati del database, impostare l'origine della replica e riavviare il server del database di replica. La replica dovrebbe quindi essere sincronizzata e pronta per l'uso.
-
Immettere il seguente comando dalla shell Linux per importare il database di origine. Specificare il nome del database utilizzato per esportare i dati in precedenza.
sudo mysql -u root -p < databasecopy.sql
-
Accedi alla shell MySQL.
sudo mysql -u root -p
-
Interrompi la replica.
STOP REPLICA;
-
Inserisci il
CHANGE REPLICATION SOURCE
comando, insieme ai seguenti dettagli. Sostituisci l'indirizzo IP del server del database di origine al posto disource_ip_address
. PerSOURCE_USER
eSOURCE_PASSWORD
, inserisci il nome utente e la password della replica nella sezione Configura un nuovo utente MySQL per la replica. Per ilSOURCE_LOG_FILE
eSOURCE_LOG_POS
valori, inserisci le informazioni che hai registrato daSHOW MASTER STATUS;
comando.CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
Nota Per utilizzare SSL per la connessione, consigliata da MySQL, aggiungi l'attributo
SOURCE_SSL=1
al comando. Ulteriori informazioni sull'utilizzo di SSL in un contesto di replica sorgente sono disponibili nella documentazione di MySQL. -
Riavvia la replica.
START REPLICA;
-
Verificare lo stato della replica. La replica dovrebbe essere in attesa di eventi e non dovrebbe esserci alcun
Last_IO_Error
oLast_Error
eventi. LoSlave_SQL_Running_State
voce dovrebbe indicare che la replica ha letto il registro di inoltro.SHOW REPLICA STATUS\G
Slave_IO_State: Waiting for master to send event Master_Host: 178.79.153.39 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 156 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 371 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes .. Last_Errno: 0 Last_Error: .. 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_UUID: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Test replica replica sorgente MySQL
Se il database di origine era già popolato prima della creazione di un'istanza della replica, sono necessari ulteriori test. In questo caso, verificare che i database e le tabelle esistenti nell'origine siano presenti nella replica dopo l'importazione dei dati. Nel SHOW REPLICA STATUS
display, lo Slave_SQL_Running_State
la voce dovrebbe leggere Slave has read all relay log
.
Per verificare che la replica avvenga correttamente, creare un nuovo database o tabella nell'origine. Dopo alcuni secondi, la nuova voce dovrebbe essere presente sulla replica. Convalida la presenza del database utilizzando SHOW DATABASES;
comando. Per confermare la presenza di una tabella, passare al database utilizzando USE databasename;
e inserisci SHOW TABLES;
. È anche una buona idea eseguire SHOW REPLICA STATUS
comandare ed esaminare l'output per eventuali errori. Il Last_Error
e Last_IO_Error
i campi devono essere vuoti e la replica deve rimanere connessa.
Ulteriori informazioni sulla replica della replica sorgente di MySQL
La migliore fonte di informazioni sulla replica della replica sorgente è la documentazione ufficiale di MySQL. La sezione sulla replica contiene informazioni più dettagliate sull'architettura e sul processo di installazione. Potrebbero essere utili anche i forum MySQL.
Maggiori informazioni
Si consiglia di consultare le seguenti risorse per ulteriori informazioni su questo argomento. Sebbene questi siano forniti nella speranza che possano essere utili, tieni presente che non possiamo garantire l'accuratezza o la tempestività dei materiali ospitati esternamente.
- Documentazione MySQL