Replica MySQL Master-Slave sulla stessa macchina

Pubblicato: 2022-03-11

La 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.

Replica MySQL master-slave

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.

Replica MySQL master-slave

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.

Replica MySQL master-slave

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.