Replica MySQL Master-Slave sulla stessa macchina
Pubblicato: 2022-03-11La replica di MySQL è un processo che consente di copiare automaticamente i dati da un server di database MySQL (il master) su uno o più server di database MySQL (gli slave). Di solito viene utilizzato per diffondere l'accesso in lettura su più server per la scalabilità, sebbene possa essere utilizzato anche per altri scopi come il failover o l'analisi dei dati sullo slave per non sovraccaricare il master.
Poiché la replica master-slave è una replica unidirezionale (da master a slave), per le operazioni di scrittura viene utilizzato solo il database master, mentre le operazioni di lettura possono essere distribuite su più database slave. Ciò significa che se la replica master-slave viene utilizzata come soluzione con scalabilità orizzontale, è necessario disporre di almeno due origini dati definite, una per le operazioni di scrittura e la seconda per le operazioni di lettura.
Gli sviluppatori MySQL di solito lavorano su una sola macchina e tendono ad avere il loro intero ambiente di sviluppo su quella macchina, con la logica che non dipendono da una rete o da una connessione Internet. Se è necessaria una replica master-slave perché, ad esempio, devono testare la replica in un ambiente di sviluppo prima di distribuire le modifiche altrove, devono crearla sulla stessa macchina. Sebbene la configurazione di una singola istanza MySQL sia abbastanza semplice, è necessario fare uno sforzo in più per configurare una seconda replica, quindi una replica master-slave.
Per questo tutorial passo dopo passo, ho scelto Ubuntu Linux come sistema operativo host e i comandi forniti sono per quel sistema operativo. Se vuoi configurare la tua replica MySQL master-slave su qualche altro sistema operativo, dovrai apportare modifiche ai suoi comandi specifici. Tuttavia, i principi generali per impostare la replica MySQL master-slave sulla stessa macchina sono gli stessi per tutti i sistemi operativi.
Installazione della prima istanza MySQL
Se hai già un'istanza del database MySQL installata sul tuo computer, puoi saltare questo passaggio.
Il modo più semplice per installare MySQL su Ubuntu è eseguire il seguente comando da un prompt del terminale:
sudo apt-get install mysql-server
Durante il processo di installazione, ti verrà chiesto di impostare una password per l'utente root
di MySQL.
Configurazione mysqld_multi
Per gestire in modo efficiente due istanze MySQL sulla stessa macchina, è necessario utilizzare mysqld_multi
.
Il primo passo nella configurazione di mysqld_multi
è la creazione di due gruppi [mysqld]
separati nel file my.cnf
esistente. La posizione predefinita del file my.cnf
su Ubuntu è /etc/mysql/
. Quindi, apri il file my.cnf
con il tuo editor di testo preferito e rinomina il gruppo [mysqld]
esistente in [mysqld1]
. Questo gruppo rinominato verrà utilizzato per la configurazione della prima istanza MySQL e verrà configurato anche come istanza master. Poiché nella replica MySQL master-slave ogni istanza deve avere il proprio server-id
univoco , aggiungi la seguente riga nel gruppo [mysqld1]
:
server-id = 1
Poiché abbiamo bisogno di un gruppo [mysqld]
separato per la seconda istanza MySQL, copia il gruppo [mysqld1]
con tutte le configurazioni correnti e incollalo di seguito nello stesso file my.cnf
. Ora, rinomina il gruppo copiato in [mysqld2]
e apporta le seguenti modifiche alla configurazione per lo slave:
server-id = 2 port = 3307 socket = /var/run/mysqld/mysqld_slave.sock pid-file = /var/run/mysqld/mysqld_slave.pid datadir = /var/lib/mysql_slave log_error = /var/log/mysql_slave/error_slave.log relay-log = /var/log/mysql_slave/relay-bin relay-log-index = /var/log/mysql_slave/relay-bin.index master-info-file = /var/log/mysql_slave/master.info relay-log-info-file = /var/log/mysql_slave/relay-log.info read_only = 1
Per configurare la seconda istanza MySQL come slave, impostare server-id
su 2, poiché deve essere diverso dall'id server del master.
Poiché entrambe le istanze verranno eseguite sulla stessa macchina, impostare la port
per la seconda istanza su 3307
poiché deve essere diversa dalla porta utilizzata per la prima istanza, che è 3306
per impostazione predefinita.
Per consentire a questa seconda istanza di utilizzare gli stessi binari MySQL, è necessario impostare valori diversi per socket
, pid-file
, datadir
e log_error
.
È inoltre necessario abilitare relay-log
per utilizzare la seconda istanza come slave (parametri relay-log
, relay-log-index
e relay-log-info-file
), nonché impostare master-info-file
.
Infine, per rendere l'istanza slave di sola lettura, il parametro read_only
è impostato su 1
. Dovresti stare attento con questa opzione poiché non impedisce completamente le modifiche sullo slave. Anche quando read_only
è impostato su 1
, gli aggiornamenti saranno consentiti solo dagli utenti che dispongono del privilegio SUPER
. MySQL ha recentemente introdotto il nuovo parametro super_read_only
per impedire agli utenti SUPER
di apportare modifiche. Questa opzione è disponibile con la versione 5.7.8.
Oltre ai [mysqld1]
e [mysqld2]
, dobbiamo anche aggiungere un nuovo gruppo [mysqld_multi]
al file my.cnf
:
[mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin user = multi_admin password = multipass
Dopo aver installato la seconda istanza MySQL e aver avviato entrambe, daremo i privilegi appropriati all'utente multi_admin
per poter chiudere le istanze MySQL.
Crea nuove cartelle per la seconda istanza MySQL
Nel passaggio precedente abbiamo preparato il file di configurazione per la seconda istanza MySQL. In quel file di configurazione vengono utilizzate due nuove cartelle. I seguenti comandi Linux dovrebbero essere usati per creare quelle cartelle con i privilegi appropriati:
mkdir -p /var/lib/mysql_slave chmod --reference /var/lib/mysql /var/lib/mysql_slave chown --reference /var/lib/mysql /var/lib/mysql_slave mkdir -p /var/log/mysql_slave chmod --reference /var/log/mysql /var/log/mysql_slave chown --reference /var/log/mysql /var/log/mysql_slave
Impostazioni di sicurezza aggiuntive in AppArmor
In alcuni ambienti Linux, sono necessarie le impostazioni di sicurezza di AppArmor per eseguire la seconda istanza MySQL. Almeno, sono richiesti su Ubuntu.
Per configurare correttamente AppArmor, modifica il file /etc/apparmor.d/usr.sbin.mysqld
con il tuo editor di testo preferito, aggiungi le seguenti righe:
/var/lib/mysql_slave/ r, /var/lib/mysql_slave/** rwk, /var/log/mysql_slave/ r, /var/log/mysql_slave/* rw, /var/run/mysqld/mysqld_slave.pid rw, /var/run/mysqld/mysqld_slave.sock w, /run/mysqld/mysqld_slave.pid rw, /run/mysqld/mysqld_slave.sock w,
Dopo aver salvato il file, riavviare la macchina per rendere effettive queste modifiche.
Installazione della seconda istanza MySQL
È possibile seguire diversi approcci per l'installazione della seconda istanza MySQL. L'approccio presentato in questo tutorial utilizza gli stessi binari MySQL del primo, con file di dati separati necessari per la seconda installazione.
Poiché abbiamo già preparato il file di configurazione e le cartelle e le modifiche di sicurezza necessarie nei passaggi precedenti, il passaggio finale di installazione della seconda istanza MySQL è l'inizializzazione della directory dei dati MySQL.
Eseguire il comando seguente per inizializzare la nuova directory di dati MySQL:
mysql_install_db --user=mysql --datadir=/var/lib/mysql_slave
Una volta inizializzata la directory dei dati MySQL, puoi avviare entrambe le istanze MySQL utilizzando il servizio mysqld_multi
:

mysqld_multi start
Imposta la password di root
per la seconda istanza MySQL utilizzando mysqladmin
con l'host e la porta appropriati. Tieni presente che se host e porta non sono specificati, mysqladmin
si connetterà alla prima istanza MySQL per impostazione predefinita:
mysqladmin --host=127.0.0.1 --port=3307 -u root password rootpwd
Nell'esempio sopra ho impostato la password su "rootpwd", ma si consiglia di utilizzare una password più sicura.
Configurazione aggiuntiva di mysqld_multi
Alla fine della sezione "Configurazione di mysqld_multi", ho scritto che daremo i privilegi appropriati all'utente multi_admin
in seguito, quindi ora è il momento. Dobbiamo fornire a questo utente i privilegi appropriati in entrambe le istanze, quindi connettiamoci prima alla prima istanza:
mysql --host=127.0.0.1 --port=3306 -uroot -p
Una volta effettuato l'accesso, eseguire i seguenti due comandi:
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;
Esci dal client MySQL e connettiti alla seconda istanza:
mysql --host=127.0.0.1 --port=3307 -uroot -p
Una volta effettuato l'accesso, eseguire gli stessi due comandi di cui sopra:
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass'; mysql> FLUSH PRIVILEGES;
Esci dal client MySQL.
Avvia entrambe le istanze MySQL automaticamente all'avvio
Il passaggio finale della configurazione di mysqld_multi
è l'installazione dello script di avvio automatico nel file init.d
.
Per farlo, crea un nuovo file chiamato mysqld_multi
in /etc/init.d
e assegnagli i privilegi appropriati:
cd /etc/init.d touch mysqld_multi chmod +x /etc/init.d/mysqld_multi
Apri questo nuovo file con il tuo editor di testo preferito e copia il seguente script:
#!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac
'fermare' )#!/bin/sh ### BEGIN INIT INFO # Provides: scriptname # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start daemon at boot time # Description: Enable service provided by daemon. ### END INIT INFO bindir=/usr/bin if test -x $bindir/mysqld_multi then mysqld_multi="$bindir/mysqld_multi"; else echo "Can't execute $bindir/mysqld_multi"; exit; fi case "$1" in 'start' ) "$mysqld_multi" start $2 ;; 'stop' ) "$mysqld_multi" stop $2 ;; 'report' ) "$mysqld_multi" report $2 ;; 'restart' ) "$mysqld_multi" stop $2 "$mysqld_multi" start $2 ;; *) echo "Usage: $0 {start|stop|report|restart}" >&2 ;; esac
Aggiungi il servizio mysqld_multi
ai runlevels
predefiniti con il seguente comando:
update-rc.d mysqld_multi defaults
Riavvia la macchina e verifica che entrambe le istanze MySQL siano in esecuzione utilizzando il comando seguente:
mysqld_multi report
Configurazione della replica master-slave
Ora, quando abbiamo due istanze MySQL in esecuzione sulla stessa macchina, configureremo la prima istanza come master e la seconda come slave.
Una parte della configurazione è stata già eseguita nel capitolo “Configurazione di mysqld_multi”. L'unica modifica rimasta nel file my.cnf
consiste nell'impostare la registrazione binaria sul master. Per fare ciò, modifica il file my.cnf
con le seguenti modifiche e aggiunte nel gruppo [mysqld1]
:
log_bin = /var/log/mysql/mysql-bin.log innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 binlog-format = ROW
Riavvia l'istanza MySQL principale per rendere effettive queste modifiche:
mysqld_multi stop 1 mysqld_multi start 1
Affinché lo slave si connetta al master con i privilegi di replica corretti, è necessario creare un nuovo utente sul master. Connettiti all'istanza master utilizzando il client MySQL con l'host e la porta appropriati:
mysql -uroot -p --host=127.0.0.1 --port=3306
Crea un nuovo utente per la replica:
mysql> CREATE USER 'replication'@'%' IDENTIFIED BY 'replication'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
Esci dal client MySQL.
Eseguire il comando seguente per creare un dump dei dati anagrafici:
mysqldump -uroot -p --host=127.0.0.1 --port=3306 --all-databases --master-data=2 > replicationdump.sql
Qui utilizziamo l'opzione --master-data=2
per avere un commento contenente un'istruzione CHANGE MASTER
all'interno del file di backup. Quel commento indica le coordinate di replica al momento del backup e avremo bisogno di tali coordinate in seguito per l'aggiornamento delle informazioni master nell'istanza slave. Ecco l'esempio di quel commento:
-- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=349;
Importa il dump che hai creato nel passaggio precedente nell'istanza slave:
mysql -uroot -p --host=127.0.0.1 --port=3307 < replicationdump.sql
Infine, affinché l'istanza slave si connetta all'istanza master, le informazioni master sullo slave devono essere aggiornate con i parametri di connessione appropriati.
Connettiti all'istanza slave utilizzando il client MySQL con l'host e la porta appropriati:
mysql -uroot -p --host=127.0.0.1 --port=3307
Eseguire il comando seguente per aggiornare le informazioni master (prendere le coordinate di replica dal file di dump replicationdump.sql
, come spiegato sopra):
mysql> CHANGE MASTER TO -> MASTER_HOST='127.0.0.1', -> MASTER_USER='replication', -> MASTER_PASSWORD='replication', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=349;
Eseguire il comando seguente per avviare lo slave:
mysql> START SLAVE;
Eseguire il comando seguente per verificare che la replica sia attiva e in esecuzione:
mysql> SHOW SLAVE STATUS \G
Congratulazioni. La tua replica MySQL master-slave sulla stessa macchina è ora configurata correttamente.
Incartare
Avere una replica master-slave configurata nell'ambiente di sviluppo è utile se è necessaria per una soluzione con scalabilità orizzontale nell'ambiente di produzione. In questo modo, avrai anche origini dati separate configurate per operazioni di scrittura e lettura in modo da poter verificare localmente che tutto funzioni come previsto prima di un'ulteriore distribuzione.
Inoltre, potresti voler configurare più istanze slave sulla stessa macchina per testare il sistema di bilanciamento del carico che distribuisce le operazioni di lettura a più slave. In tal caso, è possibile utilizzare questo stesso manuale per configurare altre istanze slave ripetendo tutti gli stessi passaggi.