Un paio di giorni fa ho scritto un tutorial su come fare la replica con MariaDB (o MySQL). Questa è una replica unidirezionale:da master a slave; ciò significa che il server slave riceve le transazioni dal master. Ma il mio cliente ha bisogno della replica bidirezionale, perché non sappiamo quale server riceverà la transazione e gli stessi dati devono essere su entrambi. Qui ti mostrerò come configurare la replica master-master con MariaDB per raggiungere questo obiettivo.
La mia configurazione
Nel caso ti fossi perso l'articolo precedente, quelle sono le funzionalità delle macchine virtuali su cui eseguo questa replica.
- OS:Debian testando "Bookworm"
- Versione MariaDB:10.5.12
- Master1:192.168.122.13
- Master2:192.168.122.223
Configurazione Master
Entrambi i master ottengono la stessa configurazione, edit /etc/mysql/mariadb.conf.d/50-server.cnf
e sostituisci i seguenti valori:
bind-address = <master.X.ip.address> server-id = <X> report_host = masterX log_bin = /var/log/mysql/mysql-bin.log relay_log = /var/lib/mysql/relay-bin relay_log_index = /var/lib/mysql/relay-bin.index log-slave-updates auto_increment_increment=2 auto_increment_offset=X
Dove X è 1 per il primo master e 2 per il secondo.
I valori di autoincremento significano che nei campi di tipo id uno dei master otterrà sempre numeri pari e l'altro otterrà sempre numeri dispari. Questo per evitare che lo stesso numero ID venga assegnato contemporaneamente a entrambi i master.
Ora riavvia il servizio mariadb e accedi a mysql per creare un utente (esclavo significa schiavo in spagnolo) con privilegi di replica:
CREATE USER 'esclavo1'@'ip.mysql.master.2' IDENTIFIED BY 'SlavePass' ; GRANT REPLICATION SLAVE ON *.* TO 'esclavo1'@'ip.mysql.master.2'; FLUSH PRIVILEGES;
Ripetere su entrambi i master modificando le informazioni di conseguenza (es. su master2 creare un utente [email protected] ). Ma prima, ottieni un dump sql del tuo primo master e caricalo nel secondo:
master1: mysqldump -u root --all-databases -p --master-data > data.sql master2: mysql -uroot < data.sql
Ora ottieni alcune informazioni su questo master di cui abbiamo bisogno per abilitare la modalità slave sull'altro host.
MariaDB [(none)]> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003| 358 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.000 sec) STOP SLAVE;
Configurazione slave
Ora è il momento di configurare la modalità slave su entrambi gli host mariadb/mysql:
CHANGE MASTER TO MASTER_HOST='ip.mysql.master.X', MASTER_USER='esclavoX',MASTER_PASSWORD='SlavePass MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS = 358'; START SLAVE;
Il valore master_host è l'ip dell'altro master, il valore master_user è l'utente che hai creato sull'altro master e infine ottieni i valori master_log_file e master_log_post da show master sta
comando tu.
Controllo tutto
Per vedere se sono stato in grado di abilitare la replica master-master con MariaDB, ho eseguito alcuni test molto semplici:
Ho creato un database su un master, quindi una tabella semplice (solo 1 campo) e inserito un paio di record. Quindi ho verificato con una selezione che i dati vengono visualizzati su entrambi gli host. Infine ho aggiunto una colonna id auto incrementale su un host e ho inserito altri dati per vedere come appare:
Solo per aggiungere più confusione a quegli screenshot:ho aggiunto la configurazione auto_increment (incremento e offset) a my.cnf durante questo test e non dall'inizio, perché non lo sapevo fino a quando non ho iniziato i test.
Ad ogni modo, è così che ho abilitato la replica master-master con MariaDB, che è anche la replica slave-slave. O master-slave e replica slave-master, lo chiami.
Penso che il prossimo passo logico sia quello di ricercare e utilizzare alcuni Galera Cluster.