Почему в MySQL безопасно отключать innodb_support_xa для однопоточных обновлений? - PullRequest
2 голосов
/ 20 мая 2011

В документации MySQL о параметре innodb_support_xa говорится следующее:

Включает поддержку InnoDB для двухфазной фиксации в транзакциях XA, вызывая дополнительную очистку диска для подготовки транзакции.Этот параметр используется по умолчанию.Механизм XA используется внутри и важен для любого сервера, у которого включен двоичный журнал и который принимает изменения в своих данных из более чем одного потока. Если вы отключите его, транзакции могут записываться в двоичный журнал в другом порядке, отличном от того, в котором их выполняет живая база данных. Это может привести к другим данным, когда двоичный журнал воспроизводится в аварийном восстановлении.или на подчиненном репликации.Не выключайте его на главном сервере репликации, если у вас нет необычной настройки, в которой только один поток может изменять данные.

Для сервера, принимающего изменения данных только из одного потока, этоБезопасно и рекомендуется отключить этот параметр для повышения производительности для таблиц InnoDB. Например, вы можете отключить его на ведомых устройствах репликации, где только поток SQL репликации изменяет данные.

Однако, насколько я понимаю из чтения печально известной ошибки групповой фиксации , 2PC используется для гарантии того, что журнал транзакций и бинлог содержат одинаковый набор транзакций, в то время какprepare_commit_mutex отвечает за обеспечение того же порядка.

При prepare_commit_mutex запись в журнал транзакций и в binlog уже сериализована, тогда в чем разница между многопоточными и однопоточными обновлениями?

С другой стороны, даже если существует только один поток, который может изменять данные, без 2PC, если происходит сбой после записи транзакции в журнал, но перед записью в журнал транзакций, как работает Innodb?собираетесь разобраться с этой ситуацией в восстановлении?Теоретически он может просто выполнить невыполненную транзакцию в binlog, точно так же, как это делают рабы, но я сомневаюсь, что на самом деле это делает Innodb, потому что иначе зачем вообще нужен 2PC?все с внутренностями MySQL, поэтому, пожалуйста, прости меня, если я ужасно неправ.Спасибо!

1 Ответ

2 голосов
/ 22 ноября 2011

Для начала ...

http://yoshinorimatsunobu.blogspot.com/2009/08/great-performance-effect-of-fixing.html

До InnoDB Plugin 1.0.4 это было похоже на:

obtain mutex
  write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log and fsync, for commit-phase
release mutex

Вкл и после InnoDB Plugin 1.0.4 (и MySQL 5.5), теперь это:

write innodb log and fsync, for prepare-phase (skip if innodb_support_xa=0)
obtain mutex
  write binlog (fsync as appropriate if sync_binlog > 0)
  write innodb log, for commit-phase
release mutex
fsync innodb log, for commit-phase

Как вы видите, в новой версии ничего (кроме случая sync_binlog> 0) в критической секции не fsync'd,Таким образом, групповая фиксация теперь работает и обеспечивает гораздо лучшую параллельную пропускную способность.

Например, в предыдущей «сломанной» версии, если у вас было 100 потоковых одновременных коммитов, все fsyncs были сериализованы, и вы получили бы 100 fsyncs дляподготовить и еще 100 fsyncs для коммита.Поэтому групповая фиксация была полностью нарушена.

Теперь с более новой реализацией fsyncs сгруппированы в зависимости от параллелизма транзакций, обеспечивая при этом порядок операций между журналом innodb и binlog.Это также означает, что если есть только один поток, то прирост производительности отсутствует.

Что касается вашего вопроса, то, когда происходит сбой после записи транзакции в binlog, но до ее записи в журнале транзакций - I 'm на той же странице, что и вы.

Если сервер завершил работу до последнего шага, есть небольшая вероятность того, что у вас есть расхождение между журналом innodb и binlog (один из них может быть впереди другого), но этогарантируется, что у вас есть вся информация о том, что проверять в журнале innodb, как это записано на этапе подготовки.

Однако, что делать с незафиксированным, все еще не определено,Например, если только sync_binlog = 1 есть вероятность, что ведомый получил данные, но еще не полностью выполнил бинлог на главном сервере.Вы не можете просто повторить неудачную транзакцию, поскольку она уже может быть запущена на одном из ведомых устройств.

Это также означает, что binlog может быть короче, чем журнал innodb, возвращая «Двоичный журнал [file_name] isкороче его ожидаемого размера. "как описано в официальном документе, и вы должны восстановить раб с нуля.Не очень дружелюбный к людям.

http://dev.mysql.com/doc/refman/5.1/en/binary-log.html

Поскольку согласованность с точки зрения порядка работы гарантируется независимо от настройки innodb_support_xa (что противоречит тому, что сказано в официальном документе по innodb_support_xa,возможно, потому что это было написано о стандартной innodb 5.0.3 задолго до исправления параллелизма), и согласованность между журналом innodb на главном сервере и журналом ретрансляции на ведомом устройстве не гарантируется строго даже с innodb_support_xa, я не вижу никакого смыслав использовании innodb_support_xa.Страшно не следовать официальной рекомендации, хотя во многих отношениях она кажется устаревшей и неправильной.

Мне интересно, есть ли какая-либо корреляция между настройкой innodb_flush_log_at_trx_commit и поведением innodb_support_xa, когда перваяустановлен на 2 или 0.

Один практический способ мышления заключается в том, что отработка отказа подчиненному безопасна - в конце концов, неудачная транзакция была тем, что вы хотели выполнить, но никогда не возвращались к мастеру., поскольку могут быть некоторые расхождения в данных.Вам необходимо полностью скопировать данные с ведомого устройства, прежде чем вы сделаете мастер новым подчиненным устройством.Другими словами, когда мастер вышел из строя, доверяйте ведомому с этого момента - таким образом, вам не нужно связываться с журналом innodb для восстановления после сбоя.

Также обратите внимание, что MySQL 5.5 поддерживает полусинхронную репликацию,по тому же принципу, что и «доверяй рабу» - подумал, что тебя это может заинтересовать.

http://dev.mysql.com/doc/refman/5.5/en/replication-semisync.html

...