Производительность репликации MySQL

У меня серьезная проблема с производительностью репликации MySQL 5.5 между двумя компьютерами, в основном таблицами myISAM с репликацией на основе операторов. Двоичные журналы и каталог данных mysql находятся на одном и том же Fusion ioDrive.

Проблема была большой проблемой в последнее время, когда нам нужно было приостановить репликацию на ок. 3 часа. Потребовалось около 10 часов, чтобы наверстать упущенное без дополнительной нагрузки.

10 часов, чтобы наверстать упущенное

Как я могу увеличить производительность репликации? Машина B в основном простаивает (мало, IO, 2 из 16 ядер, много свободной оперативной памяти), так как только 1 поток mySQL записывает данные. Вот несколько идей, которые у меня были:

  • Переключитесь на репликацию на основе строк. В тестах это только дало прирост производительности на 10-20%
  • Обновление до MySQL 5.6 с многопоточной репликацией. Мы могли бы легко разделить наши данные на отдельные базы данных, и тесты, кажется, указывают, что это помогло бы, но код не кажется готовым к работе.
  • Некоторые переменные конфигурации, которые помогут ускорить репликацию

Основная проблема заключается в том, что если после паузы в течение 3 часов требуется 10 часов, это означает, что репликация записывает 13 часов данных за 10 часов или может записывать со скоростью 130% от скорости поступления данных. по крайней мере двойные записи на главном компьютере в ближайшем будущем, поэтому отчаянно нужен способ улучшить производительность репликации.

Машина А:

  • Мастер
  • 24 ГБ оперативной памяти
  • 1.2TB Fusion ioDrive2
  • 2x E5620
  • Гигабитное соединение

my.cnf:

[mysqld]
server-id=71
datadir=/data_fio/mysqldata
socket=/var/lib/mysql/mysql.sock
tmpdir=/data_fio/mysqltmp

log-error = /data/logs/mysql/error.log
log-slow-queries = /data/logs/mysql/stats03-slowquery.log
long_query_time = 2
port=3306

log-bin=/data_fio/mysqlbinlog/mysql-bin.log
binlog-format=STATEMENT
replicate-ignore-db=mysql

log-slave-updates = true

# Performance Tuning
max_allowed_packet=16M
max_connections=500
table_open_cache = 2048
max_connect_errors=1000
open-files-limit=5000

# mem = key_buffer + ( sort_buffer_size + read_buffer_size ) * max_connections
key_buffer=4G
max_heap_table_size = 1G
tmp_table_size = 4G
myisam_sort_buffer_size = 256M
sort_buffer_size=4M
read_buffer_size=2M
query_cache_size=16M
query_cache_type=2
thread_concurrency=32

user=mysql

symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

Машина Б:

  • рабыня
  • 36 ГБ оперативной памяти
  • 1.2TB Fusion ioDrive2
  • 2x E5620
  • Гигабитное соединение

my.cnf:

[mysqld]
server-id=72
datadir=/data_fio/mysqldata
socket=/var/lib/mysql/mysql.sock
tmpdir=/data_fio/mysqltmp

log-error = /data/logs/mysql/error.log
log-slow-queries = /data/logs/mysql/stats03-slowquery.log
long_query_time = 2
port=3306

# Performance Tuning
max_allowed_packet=16M
max_connections=500
table_open_cache = 2048
max_connect_errors=1000
open-files-limit=5000

# mem = key_buffer + ( sort_buffer_size + read_buffer_size ) * max_connections
key_buffer=4G
max_heap_table_size = 1G
tmp_table_size = 4G
myisam_sort_buffer_size = 256M
sort_buffer_size=4M
read_buffer_size=2M
query_cache_size=16M
query_cache_type=2
thread_concurrency=32

user=mysql

symbolic-links=0

plugin-load=archive=ha_archive.so;blackhole=ha_blackhole.so

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

3 ответа

Решение

Вау, у вас есть какое-то ужасное оборудование для этой проблемы. Не так много, что вы можете использовать в аппаратном плане, за исключением обновления до, возможно, процессоров Sandy/Ivy Bridge для повышения производительности на 20-50% по сравнению с поиском Btree и т. Д.

Обратите внимание, что моя сильная сторона - Innodb, поэтому я собираюсь

  1. Не обращайте внимания на то, что вы myisam и ведите себя так, как будто это ничего не изменит.
  2. Предположим, что эта проблема является достаточным стимулом, чтобы заставить вас обновить. Да, это обновление.

Innodb может помочь извлечь выгоду из всей этой памяти, храня эти часто используемые строки в своем пуле буферов. Вы можете настроить его так, чтобы он был настолько большим, насколько вы хотите (скажем, 80% памяти), и новые операции чтения / записи останутся в памяти до тех пор, пока не потребуется перенести их на диск, чтобы освободить место для последних доступных данных. В памяти это на порядок быстрее, чем у ваших FusionIO.

Есть много других функций Innodb, таких как адаптивные хеши, механизмы автоматической блокировки и т. Д., Которые могут быть благом для вашей среды. Вы, однако, знаете свои данные лучше, чем я.

В мире innodb хорошим краткосрочным решением является оптимизация вашего ведомого устройства - вам действительно нужны все индексы на ведомом устройстве, которые есть на вашем ведущем устройстве? Индексы - это шарик и цепочка на вставках / обновлениях / удалениях, ДАЖЕ с картами Fusion IO. IOPS не все здесь. Мосты Sandy/Ivy Bridge имеют намного лучшую пропускную способность памяти и производительность вычислений - они могут иметь огромное значение для Westmeres, который вы сейчас имеете. (Рисунок 20-50% в целом). Удалите все индексы, которые вам не нужны на ведомом устройстве!

Во-вторых, и почти наверняка применимо только к innodb, mk-prefetch может знать, какие обновления и до того, как ведомый записывает их. Это позволяет mk-prefetch сначала выполнить запрос на чтение, тем самым вынуждая данные находиться в памяти к моменту, когда отдельный реплик выполняет запрос на запись. Это означает, что данные находятся в памяти, а не в fusionIO, что дает быстрый прирост производительности. Это имеет огромное значение, больше, чем можно было бы ожидать. Многие компании используют это как постоянное решение. Узнайте больше, ознакомившись с инструментарием Percona.

В-третьих, и, самое главное, после того, как вы перейдете на Innodb, обязательно оформите Tokutek. У этих ребят есть несколько потрясающе крутых вещей, которые намного превышают производительность записи / обновления / удаления Innodb. Они отмечают повышение скорости репликации как одно из ключевых преимуществ, и из их тестов видно, что Fusions crazy IOPS все равно не поможет вам в случае Btrees. (Примечание: я не проверен независимо). Они используют вставную замену индекса btree, которая, хотя и ужасно более сложна, улучшает многие из алгоритмических ограничений скорости индексов btree.

Я нахожусь в процессе рассмотрения вопроса об усыновлении Tokutek. Если они освобождают так много скорости записи, это позволяет мне добавлять больше индексов. Так как они сжимают данные и индексы в таких замечательных соотношениях (25-кратное, по их словам), вы даже не платите (производительность, обслуживание) за увеличение объема данных. Вы платите ($) за их движок, хотя, $2500/ год за предварительно сжатый ГБ, IIRC. У них есть скидки, если у вас есть реплицированные данные, но вы можете даже просто установить Tokutek на своем подчиненном устройстве и сохранить ваш мастер как есть. Ознакомьтесь с техническими подробностями в лекции MIT Algoritms Open Courseware. Кроме того, у них есть тонны технических вещей в их блоге и регулярные технические документы для тех, у кого нет 1:20 для просмотра видео. Я полагаю, что это видео также дает формулу Big-O для того, как быстро читается. Я должен предположить, что чтение происходит медленнее (всегда есть компромисс!), Но формула слишком сложна, чтобы я мог оценить, сколько. Они утверждают, что это примерно то же самое, но я бы лучше понял математику (маловероятно!). Вы можете оказаться в лучшем положении, чтобы обнаружить это, чем я.

Ps Я не связан с Tokutek, я никогда не запускал их продукт, и они даже не знают, что я смотрю на них.

Обновление:

Я вижу, у вас есть другие вопросы на этой странице, и я подумал:

Во-первых, ведомая предварительная выборка почти наверняка не подойдет для myisam, если у вас нет исключительной среды. Это происходит главным образом потому, что предварительная выборка будет блокировать те таблицы, в которые вы собираетесь писать, или у ведомого потока заблокирована таблица, необходимая демону предварительной выборки. Если ваши таблицы очень хорошо сбалансированы для репликации, а разные таблицы пишутся в циклическом порядке, это может сработать, но имейте в виду, что это очень теоретически. Книга "High Performance Mysql" содержит дополнительную информацию в разделе "Проблемы с репликацией".

Во-вторых, предположительно, ваш ведомый имеет нагрузку 1,0-1,5, он может быть выше, если у вас запущены другие процессы или запросы, но базовый уровень 1,0. Это означает, что вы, скорее всего, связаны с процессором, что, вероятно, с вашим FusionIO на борту. Как я упоминал ранее, Sandy/Ivy Bridge собирается дать немного больше веселья, но, вероятно, этого недостаточно, чтобы провести вас через более грубые времена с минимальной задержкой. Если нагрузка на это ведомое устройство в основном предназначена только для записи (то есть, не много операций чтения), ваш ЦП почти наверняка тратит свое время на вычисление позиций для вставок / удалений btree. Это должно подкрепить мою мысль об удалении некритических индексов - вы всегда можете добавить их позже. Отключение гиперпоточности не сработает, больше ЦП не ваш враг. Как только вы получите более 32 ГБ оперативной памяти, скажем, 64 ГБ, вам нужно беспокоиться о распределении оперативной памяти, но даже тогда симптомы будут другими.

Наконец, и самое главное (не пропустите эту часть;)), я предполагаю, что вы сейчас запускаете RBR (репликацию на основе строк), потому что вы упомянули нетривиальное повышение производительности при его переключении. Однако здесь может быть способ получить еще большую производительность. Ошибка MySQL 53375 может проявиться, если у вас есть реплицируемые таблицы без первичного ключа. Ведомый в основном не достаточно умен, чтобы использовать что-либо кроме первичного ключа, поэтому его отсутствие заставляет поток репликации выполнять полное сканирование таблицы для каждого обновления. Исправление - просто добавление мягкого, суррогатного автоинкрементного первичного ключа. Я сделал бы это только если бы таблица была большой (скажем, несколько десятков тысяч строк или больше). Это, конечно, происходит за счет наличия другого индекса на столе, который поднимает цену, которую вы платите в CPU. Обратите внимание, что теоретических аргументов против этого очень мало, поскольку InnoDB добавляет один закулисный, если вы этого не сделаете. Призрачный, однако, не является полезной защитой от 53375. Вольфрам также может решить эту проблему, но вы должны быть уверены, что при использовании вольфрама у вас правильная кодировка. В последний раз, когда я играл с ним, он ужасно умирал, когда любая реплика не-UTF8 требовала репликации. Это время, когда я отказался от этого.

Не ответ, но вы могли бы рассмотреть вольфрам репликатор и их коммерческие продукты для большей гибкости. является ли узким местом использование 100% процессоров на одном ядре?

Поэтому, если вы делаете резервные копии на ведомом устройстве... и используете таблицы myiasm... вы блокируете таблицы для создания резервных копий, чтобы предотвратить повреждение. Таким образом, репликация не может работать, пока резервное копирование не будет завершено.. тогда оно догоняет.

Другие вопросы по тегам