Interoperabilità dei checksum del log binario
L'introduzione dei checksums degli eventi del log binario modifica il formato degli eventi che sono registrati nel file del log binario e inviati agli slave via rete. Questo solleva la questione su cosa accade quando si replica attraverso versioni diverse del server, dove uno dei server è una nuova versione in cui il checksum degli eventi è stato implementato, mentre l'altro è una versione più vecchia che non sa nulla di questi checksum.
Quando i checksum sono disabilitati sul master (o il master ha una vecchia versione, senza i checksum), non ci sono problemi. In questo caso il formato del log binario è compatibile all'indietro e la replica funziona bene.
Quando il master è una versione più recente, con i checksum degli eventi abilitati, ma lo slave è una versione più vecchia, la replica non funzione. Il master disconnette lo slave con un errore e registra un warning nel suo log degli errori. In questo modo si evita di inviare gli eventi a uno slave che non è in grado di gestirli, ma bisogna notare che i checksum non funzionano con i vecchi slave. Con il percorso di upgrade raccomandato, dove gli slave vengono aggiornati prima dei master, non ci sono problemi.
La replica da un nuovo master MySQL con i checksum abilitati a un MariaDB con i checksum abilitati funziona, e lo slave MariaDB verifica i checksum sugli eventi replicati.
Vi è però un problema quando uno slave MySQL recente replica su un master MariaDB ancora più recente con i checksum abilitati. Lo slave controlla la versione del master per sapere se gli eventi comprendono i checksum o meno, e MySQL non sa ancora che MariaDB svolge questa operazione già dalla versione 5.3.0 (al momento della stesura di questo articolo, MySQL 5.6.2). Perciò, se MariaDB ha una versione da 5.3.0 in avanti ma meno di 5.6.1, e viene usato come master con i checksum abilitati, uno slave MySQL non interpreta correttamente gli eventi che riceve. La replica quindi fallisce con un errore che dice che ci sono eventi corrotti, o addirittura nel peggiore dei casi i dati replicati vengono corrotti. Per risolvere questo problema sono necessarie modifiche a MySQL.
Ecco una tabella riassuntiva dello stato della replica tra diverse combinazioni di master e slave, e di checksum abilitati/disabilitati:
- OLD: MySQL <5.6.1 o MariaDB < 5.3.0 senza checksum
- NEW-MARIA: MariaDB >= 5.3.0 con i checksum
- NEW-MYSQL: MySQL >= 5.6.1 con i checksum
Master mysqlbinlog | Slave / enabled? | Checksums | Status |
---|---|---|---|
OLD | OLD | - | Ok |
OLD | NEW-MARIA | - | Ok |
OLD | MYSQL | - | Ok |
NEW-MARIA | OLD | No | Ok |
NEW-MARIA | OLD | Yes | Master produce errore |
NEW-MARIA | NEW-MARIA | Yes/No | Ok |
NEW-MARIA | NEW-MYSQL | No | Ok |
NEW-MARIA | NEW-MYSQL | Yes | Fallisce. Richiede modifiche a MySQL, altrimenti non capisce che MariaDB < 5.6.1 esegue i checksum. |
NEW-MYSQL | OLD | No | Ok |
NEW-MYSQL | OLD | Yes | Master produce errore |
NEW-MYSQL | NEW-MARIA | Yes/No | Ok |
NEW-MYSQL | NEW-MYSQL | Yes/No | Ok |
I checksums e mysqlbinlog
Quando si usa il programma http://kb.askmonty.org/it/usare-mysqlbinlog
si riscontrano problemi simili.
Una versione di mysqlbinlog
che capisce i checksum può leggere i file dei log binari sia dai server recenti sia dai vecchi, con o senza i checksum abilitati.
Le vecchie versioni di mysqlbinlog
possono leggere i file del log binario create da una versione recente del server se i checksum erano disabilitati al momento della creazione. Le vecchie versioni di mysqlbinlog
che leggono un file del binlog recente che contengono i checksum sono confuse, e l'output è scombussolato, con i checksum interpretati come rumore aggiunto alla fine delle query e di altri eventi. In questo caso non si ha alcun errore, solo un output sbagliato.
Una versione di mysqlbinlog
da MySQL >= 5.6.1 avrà problemi simili come slave, finché il problema in MySQL non verrà corretto. Quando si legge un file del log binario con i checksum creati da MariaDB >= 5.3.0 ma < 5.6.1, non capisce che vi sono i checksum, e produce un output sbagliato esattamente come le vecchie versioni di mysqlbinlog
. La versione di MariaDB di mysqlbinlog
legge correttamente sia i file prodotti da MySQL sia da MariaDB.