Binlog Event Checksum Interoperability
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.
Note: This page describes features in the source repository for MariaDB 5.3
There are currently no official packages or binaries available for download which contain the features. If you want to try out any of the new features described here you will need to get and compile the code yourself.
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 |
Checksums and mysqlbinlog
When using the mysqlbinlog
client program, there are similar issues.
A version of mysqlbinlog
which understands checksums can read binlog files
from either old or new servers, with or without checksums enabled.
An old version of mysqlbinlog
can read binlog files produced by a new
server version if checksums were disabled when the log was produced. Old
versions of mysqlbinlog
reading a new binlog file containing checksums will
be confused, and output will be garbled, with the added checksums being
interpreted as extra garbage at the end of query strings and similar entries. No
error will be reported in this case, just wrong output.
A version of mysqlbinlog
from MySQL >= 5.6.1 will have similar problems as
a slave until this is fixed in MySQL. When reading a binlog file with checksums
produced by MariaDB >= 5.3.0 but < 5.6.1, it will not realise that checksums
are included, and will produce garbled output just like an old version of
mysqlbinlog
. The MariaDB version of mysqlbinlog
can read binlog files
produced by either MySQL or MariaDB just fine.