Dopo l’articolo sulla semplice replicazione di MySql master-slave, passiamo ad una configurazione leggermente più complessa. Nella replicazione di MySql master-slave, il concetto di base è che il master viene usato per tutte le operazioni di scrittura/lettura, mentre lo slave solo per la lettura, vuoi come backup, vuoi come bilanciamento del carico. Con la configurazione per la replica multimaster invece, si ha la possibilità di usare entrambi i server MySql sia in lettura che in scrittura, dato che avviene la sincronizzazione in entrambi i sensi. In pratica ogni server mysql diventa sia master che slave.
A questo punto nasce un problema:
supponiamo che entrambi i server abbiano lo stesso valore di autoincrement per una certa tabella e casualmente scriviamo contemporaneamente su entrambi i server MySql. Quale sarà la riga da replicare? Entrambe! Il risultato è ovvio: abbiamo 2 righe duplicate e la sincronizzazione si ferma.
Nasce così l’esigenza di gestire gli indici in modo diverso e quindi bisogna introdurre il concetto di offset per gli indici auto_increment. Ecco un esempio:
Server MySql-1 :
auto_increment_increment = 2
auto_increment_offset = 1
Server MySql-2:
auto_increment_increment = 2
auto_increment_offset = 2
(ovviamente i valori vanno scelti in base al numero di server che utilizziamo)
Quindi, riassumendo, ciascuno dei server MySql in replica multi-master avrà una configurazione simile a questa (ogni server ha i suoi id, ip, usr e pwd):
auto_increment_increment = 2
auto_increment_offset = 1
server_id = 2
log_bin = /var/log/mysql/mysql-bin.log
master_host = 10.0.0.5
master_user = user_name
master_password = user_pwd
master_port = 3306
log_slave_updates
replicate_same_server_id = 0
Ciao e alla prossima!
Se aggiungo un terzo server qualsiasi combinazione di auto_increment_increment eauto_increment_offset caschera’ su un numero che appartiene o alla sequenza generata dal server 1 0 dal server 2 (il primo genera tutti i pari il secondo tutti i dispari). Posso al massimo gestire altri due server che mi coprano il sottoinsieme dei numeri interi negativi ma dopo sono completo. O sbaglio qualche cosa?