GNU/Linux >> Linux Esercitazione >  >> Debian

Configurazione della replica Master-Master con MySQL su Debian 8 (Jessie)

Questo tutorial descrive una configurazione MySQL replicata (replicazione Mater/Master) con 2 nodi in cui i dati possono essere letti e scritti su entrambi i nodi contemporaneamente. MySQL si occupa di replicare i dati sull'altro nodo e assicura che le chiavi primarie di incremento automatico non entrino in conflitto.

Dalla versione 5, MySQL viene fornito con il supporto integrato per la replica master-master, risolvendo il problema che può verificarsi con le chiavi autogenerate. Nelle versioni precedenti di MySQL, il problema con la replica master-master era che i conflitti si verificavano immediatamente se il nodo A e il nodo B inserivano entrambi una chiave con incremento automatico sulla stessa tabella. I vantaggi della replica master-master rispetto alla tradizionale replica master-slave sono che non è necessario modificare le applicazioni per consentire l'accesso in scrittura solo al master e che è più facile fornire un'elevata disponibilità perché se il master si guasta, hai ancora l'altro master.

1 Nota preliminare

In questo tutorial mostrerò come replicare il database exampledb dal server server1.example.com con l'indirizzo IP 192.168.1.101 al server server2.example.com con l'indirizzo IP 192.168.1.102 e viceversa. Ciascun sistema è contemporaneamente slave dell'altro master e master dell'altro slave. Entrambi i sistemi eseguono Debian 8; tuttavia, la configurazione dovrebbe essere applicata a quasi tutte le distribuzioni con poche o nessuna modifica.

2 Installazione di MySQL 5.5

Se MySQL non è già installato su server1 e server2, installalo ora:

server1/server2:

apt-get -y install mysql-server-5.5 mysql-client-5.5

Per assicurarci che la replica possa funzionare, dobbiamo fare in modo che MySQL sia in ascolto su tutte le interfacce, quindi commentiamo la riga bind-address =127.0.0.1 in /etc/mysql/my.cnf:

server1/server2:

nano /etc/mysql/my.cnf
[...]
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1
[...]

Riavvia MySQL in seguito:

server1/server2:

service mysql restart

Quindi verifica con

server1/server2:

netstat -tap | grep mysql

che MySQL è davvero in ascolto su tutte le interfacce:

netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 15437/mysqld
server1:~#

Ora impostiamo un utente di replica slave2_user che può essere utilizzato da server2 per accedere al database MySQL sul server1.

server1:

Accedi alla shell MySQL:

mysql --defaults-file=/etc/mysql/debian.cnf

Sulla shell MySQL, esegui i seguenti comandi:

server1:

GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'secretpassword';
FLUSH PRIVILEGES;
quit;

Sostituisci la parola "password segreta " con una password sicura a tua scelta. Ora eseguiamo nuovamente gli ultimi due passaggi sul server2:

server2:

mysql --defaults-file=/etc/mysql/debian.cnf
GRANT REPLICATION SLAVE ON *.* TO [email protected]'%' IDENTIFIED BY 'secretpassword';
FLUSH PRIVILEGES;
quit;

Sostituisci la parola "password segreta " con una password sicura anche qui. Annota le password perché ci serviranno in seguito. 

3 Alcune note

Di seguito assumerò che entrambi i server MySQL siano vuoti (non contengono ancora alcun database ad eccezione del database 'mysql').

Se questo non è il caso sul tuo server, devi bloccare e scaricare i database sul primo server e importarli sul secondo prima di continuare. Non sbloccare i database prima che la replica sia stata configurata. Di seguito alcuni comandi che mostrano come copiare tutti i database su un nuovo server nel caso in cui non si inizi con una configurazione MySQL "pulita".

Esempio su come bloccare tutte le tabelle del database in un database MySQL.

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;

Esempio su come eseguire il dump di tutti i database in un file all_databases.sql.

mysqldump --defaults-file=/etc/mysql/debian.cnf -cCeQ --hex-blob --quote-names --routines --events --triggers --all-databases -r all_databases.sql

Esempio su come importare tutte le tabelle sul secondo server dal file all_databses.sql.

mysql --defaults-file=/etc/mysql/debian.cnf < all_databases.sql

4 Configurazione della replica

Ora impostiamo la replica master-master in /etc/mysql/my.cnf. Le opzioni di configurazione cruciali per la replica master-master sono auto_increment_increment e auto_increment_offset:

  • auto_increment_increment controlla l'incremento tra valori AUTO_INCREMENT successivi.
  • auto_increment_offset determina il punto di partenza per i valori delle colonne AUTO_INCREMENT.

Supponiamo di avere N nodi MySQL (N=2 in questo esempio), quindi auto_increment_increment ha il valore N su tutti i nodi e ogni nodo deve avere un valore diverso per auto_increment_offset (1, 2, ..., N).

Ora configuriamo i nostri due nodi MySQL:

server1:

nano /etc/mysql/my.cnf

Cerca la sezione che inizia con [mysqld] e inserisci le seguenti opzioni (commentando tutti i conflitti esistenti opzioni):

[...]
[mysqld]

# Unique Server ID
server-id = 1

# Do not replicate the following databases
binlog-ignore-db = mysql
replicate-ignore-db = mysql

# Auto increment offset
auto-increment-increment = 2

# Do not replicate sql queries for the local server ID
replicate-same-server-id = 0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset = 1

# Delete binlog data after 10 days
expire_logs_days = 10

# Max binlog size
max_binlog_size = 500M

# Binlog file path
log_bin = /var/log/mysql/mysql-bin.log

[...]

Quindi riavvia MySQL:

server1:

service mysql restart

Ora fai lo stesso su server2:

server2:

nano /etc/mysql/my.cnf
[...]

# Unique Server ID
server-id = 2

# Do not replicate the following databases
binlog-ignore-db = mysql
replicate-ignore-db = mysql

# Auto increment offset
auto-increment-increment = 2

# Do not replicate sql queries for the local server ID
replicate-same-server-id = 0

# Beginne automatisch inkrementelle Werte mit 1
auto-increment-offset = 2

# Delete binlog data after 10 days
expire_logs_days = 10

# Max binlog size
max_binlog_size = 500M

# Binlog file path
log_bin = /var/log/mysql/mysql-bin.log

[...]

server2:

service mysql restart

Quindi blocchiamo il database exampledb su server1, scopriamo lo stato principale di server1, creiamo un dump SQL di exampledb (che importeremo in exampledb su server2 in modo che entrambi i database contengano gli stessi dati) e sblocchiamo il database in modo che può essere riutilizzato:

server2:

Ora iniziamo la replica sul Server 2. Apriamo la shell MySQL:

mysql --defaults-file=/etc/mysql/debian.cnf

Ed eseguire il seguente comando SQL per attivare la replica dal server1 al server2:

CHANGE MASTER TO MASTER_HOST='192.168.1.101', MASTER_USER='repl', MASTER_PASSWORD='secretpassword';

Sostituisci password segreta con la password per il repl Utente MySQL che hai impostato nel capitolo 2.

Ora controlla lo stato dello slave eseguendo il comando "show slave status\G" nella shell MySQL.

show slave status\G

L'output sarà simile a questo:

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.101
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000003
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
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: 107
Relay_Log_Space: 410
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: NULL
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
1 row in set (0.00 sec)

Le Linee che dovresti controllare sono queste:

Master_Host: 192.168.1.101
Master_User: repl
Master_Port: 3306
Master_Log_File: mysql-bin.000001
Relay_Log_File: mysqld-relay-bin.000003
Slave_IO_Running: No
Slave_SQL_Running: No

Ora avvia la replica con questo comando sulla shell MySQL:

start slave;

e poi ricontrolla lo stato dello slave:

show slave status\G

Le due righe seguenti dovrebbero mostrare "yes" ora:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

Se "Seconds_Behind_Master" non è 0, attendere alcuni secondi e controllare di nuovo lo stato. Questo campo mostra se master e slave sono sincronizzati.

Per il passaggio successivo, abbiamo bisogno di conoscere i valori di "Master_Log_File" e "Read_Master_Log_Pos" il comando "show slave status\G". Nel mio caso questi sono:

Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107

Annota i valori che ottieni sul tuo server, ne abbiamo bisogno per il passaggio successivo sul server 1.

Successivamente puoi lasciare la shell MySQL:

quit

server1:

Continuiamo sul primo server, apriamo la shell MySQL sul server1:

mysql --defaults-file=/etc/mysql/debian.cnf

Ed esegui il seguente comando MySQL:

CHANGE MASTER TO MASTER_HOST='192.168.1.102', MASTER_USER='repl', MASTER_PASSWORD='secretpassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107;

Devi sostituire alcune cose nel comando precedente:

  1. L'indirizzo IP deve essere l'IP del tuo secondo server MySQL.
  2. La password "secretpassword" deve essere quella che hai scelto nel capitolo 2 per la risposta utente.
  3. Il MASTER_LOG_FILE e MASTER_LOG_POS devono essere i valori che abbiamo annotato nell'ultimo passaggio.

Ora controlla con:

show slave status\G

sulla shell MySQL se non ci sono errori.

mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB: mysql
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: 107
Relay_Log_Space: 107
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: NULL
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: 0
1 row in set (0.00 sec)

E avvia lo schiavo.

start slave;

Ricontrolla lo stato dello slave:

show slave status\G

Le due righe seguenti dovrebbero mostrare "yes" ora:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Successivamente puoi lasciare la shell MySQL:

quit

Se nulla è andato storto, la replica master-master di MySQL dovrebbe ora funzionare. In caso contrario, controlla /var/log/syslog per gli errori MySQL su server1 e server2.

5 Testare la replica

Ora è il momento di testare la nostra configurazione di replica. Creerò un database exampledb1 sul server1 e quindi verificherò sul server2 se il database è stato replicato sul secondo server:

server1:

Accedi alla console MySQL sul server1 e crea il database:

mysql --defaults-file=/etc/mysql/debian.cnf
CREATE DATABASE exampledb1;

server2

Ora accedi alla console MySQL su server2 e controlla se exampledb1 esiste ora:

mysql --defaults-file=/etc/mysql/debian.cnf
show databases;

Come possiamo vedere, il nuovo database compare anche su server2.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| exampledb1 |
| mysql |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

Successivamente proverò se la replica funziona anche nell'altra direzione. Siamo ancora loggati su server2 e creiamo lì un database exampledb2:

CREATE DATABASE exampledb2;

Ora torna al server1 ed esegui "mostra database" nella console MySQL:

server1

show databases;

Il risultato mostra il nostro nuovo database exampledb2, quindi la replica funziona in entrambe le direzioni.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| exampledb1 |
| exampledb2 |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.01 sec)

  • MySQL:http://www.mysql.com
  • Debian:http://www.debian.org

Debian
  1. Come configurare la replica master-slave MySQL (MariaDB) su Debian 10

  2. Come impostare la replica master-master di MySQL

  3. Come configurare la replica di streaming PostgreSQL con slot di replica su Debian 10

  4. Come installare WebDAV con Lighttpd su Debian 8 (Jessie)

  5. Come installare MySQL v5.7 usando apt-get su Debian 8 Jessie

Chroot di Apache 2.4 con mod_unixd su Debian 8 (Jessie)

Installazione di un cluster di database Web, e-mail e MySQL su Debian 8.4 Jessie con ISPConfig 3.1

Come installare Nginx con PHP + MySQL (LEMP) su Debian 9

Come installare LAMP (Apache, MySQL, PHP) su Debian 8 Jessie

Replica Master-Master con MariaDB

Installa Zabbix su Debian 11 Bullseye con MySQL/MariaDB e Apache