Всегда будет компромисс между отказоустойчивостью и производительностью.
При использовании MySQL на ext4 значение по умолчанию «барьеры = 1» действительно приводит к замедлению, однако первым действием не должно быть отключение ведения журнала или включение data = writeback.
Во-первых, если устойчивость очень важна, RAID с резервным питанием от батареи, безусловно, того стоит.
Варианты монтирования, которые я выбрал, особенно для RAID без аккумулятора:
/dev/mapper/vg-mysql--data /var/lib/mysql/data ext4 defaults,noatime,nodiratime,barrier=1,data=ordered 0 0
Это намеренно не использует data = writeback, потому что я не хочу рисковать повреждением файловой системы, в результате чего «старые данные появляются в файлах после сбоя и восстановления журнала» (цитата из man mount
).
Идеальная конфигурация в my.cnf для полной устойчивости вокруг настроек, связанных с вводом / выводом:
[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
Я выбрал следующую последовательность компромиссов для повышения производительности:
sync_binlog = 0
Это первый конфиг MySQL, который я изменил от полной отказоустойчивости. Причина этого заключается в том, что это дает значительное улучшение производительности, особенно там, гдеbinlog_format=row
(к сожалению, требуется для Jira). Я использую достаточное количество реплик MySQL в кластере, чтобы в случае повреждения бинлога из-за сбоя питания я сделал бы двоичную копию из другой реплики.
innodb_flush_log_at_trx_commit = 2
: Хотя для полного соответствия ACID требуется значение 1, со значением 2 "буфер журнала записывается в файл при каждой фиксации, но на нем не выполняется операция очистки на диск. Однако очистка на Файл журнала выполняется один раз в секунду, а также при значении 2. Обратите внимание, что сбрасывание один раз в секунду не гарантируется на 100% каждую секунду из-за проблем с планированием процесса ». (цитата из документации по MySQL)
- Обновите параметры монтирования для использования
data=writeback
. Обратите внимание, что если это ваша корневая файловая система, вам также нужно будет указать параметр командной строки ядра. Я собрал несколько шагов по этому вопросу в coderwall .
- Проверьте различные значения
innodb_flush_method
. Показано, что O_DIRECT улучшает производительность в некоторых рабочих нагрузках, но не считается, что это будет работать в вашей среде.
- Обновление до SSD - накопителей, в этом случае вы также хотите увеличить
innodb_io_capacity
, а также настраивать параметры , такие как innodb_adaptive_flushing
, innodb_read_io_threads
, innodb_write_io_threads
, innodb_purge_threads
, и другие возможные настройки.