В процессе тестирования Cetus была обнаружена ошибка в транзакциях XA MySQL версии 5.7.21. Метод тестирования: запуск тестового задания для имитации перевода средств между банковскими счетами, случайное уничтожение экземпляра MySQL на сервере с помощью команды kill -9 и перезапуск экземпляра. Были выявлены две ситуации с зависшими транзакциями:
Только основная база данных имеет зависшую транзакцию: Основная база данных MySQL получила уведомление о фиксации транзакции XA (XA commit), но до завершения фиксации была уничтожена с помощью kill -9. После перезапуска основной базы данных обнаружилась зависшая транзакция. В то же время в реплике распределённая транзакция уже была зафиксирована. Для фиксации распределённой транзакции в основной базе данных требуется выполнить команду XA commit. Это действие синхронизируется с репликой, что приводит к ошибке в приложении SQL, которое сообщает об отсутствии данной распределённой транзакции.
Только реплика имеет зависшую транзакцию: Cetus отправляет запрос XA prepare на сервер. Запрос XA prepare принимается основной базой данных MySQL, но до его завершения основная база данных уничтожается с помощью kill -9, а затем перезапускается. Основная база данных возвращается к предыдущему состоянию, и зависшей транзакции нет. Однако в реплике возникает зависшая транзакция. Чтобы обеспечить согласованность данных, необходимо откатить транзакцию XA в реплике.
В обоих случаях состояние транзакции XA основной базы данных не соответствует состоянию, записанному в двоичном журнале. Согласно документации MySQL, неожиданное завершение работы может привести к несогласованности состояния базы данных и двоичного журнала. Эти ошибки возникают только при ненормальном завершении работы MySQL и не проявляются при нормальном завершении. Если возникает зависание транзакции XA, можно использовать инструмент обработки зависания XA от Cetus для автоматического решения проблемы.
XA не полностью устойчива к неожиданному завершению работы относительно двоичного журнала (на мастере). Если происходит неожиданное завершение перед XA PREPARE, между XA PREPARE и XA COMMIT (или XA ROLLBACK) или после XA COMMIT (или XA ROLLBACK), сервер и двоичный журнал корректно восстанавливаются и переходят в согласованное состояние. Однако если происходит неожиданное прерывание во время выполнения одного из этих операторов, сервер может не восстановиться до правильного состояния, оставляя сервер и двоичный журнал в несогласованном состоянии.
Отправленная в официальный баг XA: «XA prepare записывается раньше engine prepare». https://bugs.mysql.com/bug.php?id=76233
Детальная проверка ошибки XA в MySQL 5.7.21 включает анализ внешних проявлений и анализ кода.
Внешние проявления ошибки XA MySQL 5.7.21: https://github.com/Lede-Inc/cetus/blob/master/doc/MySQL-5.7.21-XA-bug-phenomena.pdf
Анализ кода ошибки XA MySQL 5.7.21: https://github.com/Lede-Inc/cetus/blob/master/doc/MySQL-5.7.21-XA-bug-code-analysis.pdf
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )