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

15

У меня серьезная проблема с производительностью репликации 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
Ник
источник
Машина Б в основном простаивает . Это мой опыт репликации на MySQL 5.1. Репликация является однопоточной, и один процессор будет максимально загружен, в то время как остальные будут простаивать.
Стефан Ласевский
ты делаешь резервные копии от раба?
Майк
@ stefan-lasiewski Для ясности, это MySQL 5.5, но да. Это однопоточный и очень расстраивает
Ник
@ Майк Да, а также тяжелые запросы, которые занимают много минут в течение дня. Репликация замедляется до ~ 100 с или около того, а затем требуется время, чтобы наверстать упущенное. Служба, которая выполняет эти запросы, будет запускать один запрос, ждать, пока он не догонит, затем запустить другой, ждать и т. Д. Если мы сможем ускорить репликацию, мы можем увеличить частоту выполнения этих запросов
Ник
1
@ stefan-lasiewski Да - если ничто не остановит репликацию, оно, очевидно, не отстанет. Основная проблема заключается в том, что скорость репликации является узким местом для увеличения числа записей на главном сервере. Если требуется 3,3 с, чтобы догнать 1 с, это означает, что репликация записывает 4,3 с данных за 3,3 с или может реплицироваться только на 130% скорости поступления данных. Я рассчитываю, по крайней мере, на двойную запись загрузить на этот сервер.
Ник

Ответы:

4

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

Обратите внимание, что моя сильная сторона - 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 строка нуждалась в репликации. Это время, когда я отказался от этого.

fimbulvetr
источник
Большое спасибо за ваше время! Я действительно ценю информацию, которую вы дали здесь. Переход на InnoDB был чем-то, что мы рассматривали некоторое время, главным образом из-за преимуществ блокировки на уровне строк. Это дает мне пищу для размышлений. Еще раз спасибо.
Ник
Ух ты, это какой-то серьёзный гениальный анализ mysql :)
Кевин
4

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

PQD
источник
Благодарность! Это интересное решение, хотя я немного колеблюсь, чтобы подключить стороннее программное обеспечение к MySQL. В документации говорится: «Не нужно обновляться, чтобы ждать будущих версий MySQL или перейти на непроверенные альтернативы», поэтому похоже, что MySQL 5.6 будет поддерживать. Есть ли у вас опыт работы с Tungsten Replicator?
Ник
Нет, просто знайте, что уважаемый участник MySQL работает на них [ datacharmer.blogspot.com ]. как насчет узкого места - вы уверены, что нагрузка на одно ядро ​​является ограничивающим фактором?
PQD
Спасибо за информацию. RE: ограничивающий фактор, нет, я совсем не уверен. Я не думаю, что это ввод-вывод, так как iostat сообщает, что Fusion ioDrive выполняет записи <10 МБ / с. Я уверен, что устройство способно на гораздо большее. С другой стороны, всегда есть 1 и периодически 1 дополнительное ядро, которые привязаны на 100%, в то время как остальные не работают. Как насчет отключения гиперпоточности?
Ник
@ Ник - извините, я не могу посоветовать насчет гиперпоточности. но попробуйте ... также - попробуйте установить munin или cacti с помощью шаблонов mysql и посмотрите подробнее, что происходит.
PQD
Прочтите этот пост от Континуента : scale-out-blog.blogspot.ca/2011/10/… Цитата: «В целом можно с уверенностью сказать, что однопотоковая собственная репликация, вероятно, не работает в I / O-связанный». без использования какой-либо комбинации твердотельных накопителей и / или ведомой предварительной выборки. "
HTTP500
2

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

Майк
источник
Абсолютно. Мы регулярно блокируем таблицы для резервного копирования или для длинных запросов, но проблема заключается в скорости репликации после возобновления потока ввода-вывода. Я полагаю, что репликация выполняется только на 130% от скорости поступающих данных, что ограничивает возможности дальнейшего масштабирования этой установки, если мы не сможем улучшить скорость репликации. Имеет ли это смысл?
Ник