Проверка контрольных сумм событий binlog для межсетевого взаимодействия
Термины master и slave исторически использовались при репликации, но теперь предпочтительнее использовать термины primary и replica. Старые термины всё ещё используются в некоторых частях документации и в командах MariaDB, хотя MariaDB 10.5 начала процесс переименования. Процесс документации продолжается. Следите за прогрессом этого проекта на MDEV-18777.
Введение контрольных сумм для событий binlog изменяет формат хранения событий в файлах бинарного журнала и передачи их по сети репликам. Это поднимает вопрос о том, что происходит при репликации между разными версиями сервера, где один сервер является более новой версией с реализованной функцией контрольных сумм binlog, а другой сервер — более старой версией, которая не знает о контрольных суммах binlog.
Когда контрольные суммы отключены на основном сервере (или основной сервер использует старую версию без реализованных контрольных сумм), проблем нет. В этом случае формат binlog обратной совместим, и репликация работает нормально.
Когда основной сервер — это более новая версия с включенными контрольными суммами в binlog, а реплика — более старая версия, которая не понимает контрольные суммы, репликация завершится сбоем. Основной сервер отключит реплику с ошибкой и также запишет предупреждение в свой журнал ошибок. Это предотвращает отправку событий реплике, которую она не сможет правильно интерпретировать, но означает, что контрольные суммы binlog не могут использоваться со старыми репликами. (С рекомендуемым путём обновления, где реплики обновляются до основных серверов, это, конечно, не проблема).
Репликация с нового MySQL основного сервера с включенными контрольными суммами на новый MariaDB, который также понимает контрольные суммы, работает, и реплика MariaDB проверит контрольные суммы на реплицированных событиях.
Однако проблема возникает, когда более новая MySQL реплика выполняет репликацию на более новый MariaDB основной сервер с включенными контрольными суммами. Сервер реплики смотрит на версию основного сервера, чтобы узнать, содержат ли события контрольные суммы или нет, и MySQL ещё не обновлён, чтобы узнать, что MariaDB уже делает это с версии 5.3.0 (на момент написания, MySQL 5.6.2). Таким образом, если MariaDB как минимум версии 5.3.0, но меньше 5.6.1, используется в качестве основного сервера с включёнными контрольными суммами binlog, MySQL реплика неправильно интерпретирует полученные события, поскольку не понимает, что последняя часть событий — контрольная сумма. Поэтому репликация завершится сбоем с ошибкой о повреждённых событиях или даже с молчаливым повреждением реплицированных данных в неудачных случаях. Для исправления этого требуется изменение сервера MySQL.
Вот сводная таблица статуса репликации между различными комбинациями основных и реплицирующих серверов и включёнными/выключенными контрольными суммами:
- СТАРЫЙ: MySQL <5.6.1 или MariaDB < 5.3.0 без поддержки контрольных сумм
- НОВЫЙ-MARIA: MariaDB >= 5.3.0 с поддержкой контрольных сумм
- НОВЫЙ-MYSQL: MySQL >= 5.6.1 с поддержкой контрольных сумм
| Primary mariadb-lbinlog | Replica / enabled? | Checksums | Статус |
|---|---|---|---|
| СТАРЫЙ | СТАРЫЙ | - | Ok |
| СТАРЫЙ | НОВЫЙ-MARIA | - | Ok |
| СТАРЫЙ | MYSQL | - | Ok |
| НОВЫЙ-MARIA | СТАРЫЙ | Нет | Ok |
| НОВЫЙ-MARIA | СТАРЫЙ | Да | Основной сервер откажется с ошибкой |
| НОВЫЙ-MARIA | НОВЫЙ-MARIA | Да/Нет | Ok |
| НОВЫЙ-MARIA | НОВЫЙ-MYSQL | Нет | Ok |
| НОВЫЙ-MARIA | НОВЫЙ-MYSQL | Да | Ошибка. Требуются изменения в MySQL, иначе он не поймёт, что MariaDB < 5.6.1 использует контрольные суммы, и будет сбит с толку. |
| НОВЫЙ-MYSQL | СТАРЫЙ | Нет | Ok |
| НОВЫЙ-MYSQL | СТАРЫЙ | Да | Основной сервер откажется с ошибкой |
| НОВЫЙ-MYSQL | НОВЫЙ-MARIA | Да/Нет | Ok |
| НОВЫЙ-MYSQL | НОВЫЙ-MYSQL | Да/Нет | Ok |
Контрольные суммы и mariadb-binlog
При использовании программы-клиента mariadb-binlog возникают аналогичные проблемы.
Версия mariadb-binlog, которая понимает контрольные суммы, может читать файлы binlog с серверов старой или новой версии, с включёнными или выключенными контрольными суммами.
Старая версия mariadb-binlog может читать файлы binlog, созданные на сервере новой версии, если контрольные суммы были отключены при создании лога. Старые версии mariadb-binlog при чтении нового файла binlog, содержащего контрольные суммы, будут сбиты с толку, и вывод будет искажён, так как добавленные контрольные суммы будут интерпретироваться как мусор в конце строк запросов и других подобных записей. В этом случае ошибка не будет сообщена, а будет выведен неверный вывод.
Версия mysqlbinlog (аналог mariadb-binlog для MySQL и старое название бинарного файла для MariaDB) из MySQL >= 5.6.1 будет иметь аналогичные проблемы, как реплика, пока это не будет исправлено в MySQL. При чтении файла binlog с контрольными суммами, созданного MariaDB >= 5.3.0, но < 5.6.1, он не поймёт, что контрольные суммы включены, и выведет искажённый вывод, как и старая версия mysqlbinlog. Версия MariaDB mariadb-binlog может без проблем читать файлы binlog, созданные как MySQL, так и MariaDB.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/binlog-event-checksum-interoperability/