![Page 1: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/1.jpg)
Практический опыт использования решений
репликации MySQL Александр Чистяков
bOombate
http://alexclear.livejournal.com
![Page 2: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/2.jpg)
Докладчик?
• Разработчик серверных приложений• Администратор баз данных• Эксплуатационщик• Архитектор серверных приложений• Просто хороший человек
![Page 3: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/3.jpg)
Аудитория?
• Разработчики серверных приложений• Администраторы баз данных• Эксплуатационщики• Архитекторы серверных приложений• Просто хорошие люди
![Page 4: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/4.jpg)
Цель
• Традиционно СУБД является SPOF• Время восстановления после сбоя СУБД
может составлять несколько часов при отсутствии как минимум горячего резерва
• Перспектива несколько часов ничего не продавать очень не радует топ-менеджеров
![Page 5: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/5.jpg)
MySQL? А имеет ли смысл?
• Главный open source конкурент - PostgreSQL• Надо как-то оценить статистику
использования• http://www.indeed.com/jobs?q=postgresql&l=CA • http://www.indeed.com/jobs?q=mysql&l=CA• 575 против 5728• Кажется, у нас есть победитель• Это была не самая корректная метрика, я в
курсе
![Page 6: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/6.jpg)
Что мы хотим обеспечить?
• Несколько MySQL-серверов• Несколько клиентов• При отказе одного MySQL-сервера
клиенты работают с другими• Знакомая задача!• Имеет несколько традиционных
решений
![Page 7: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/7.jpg)
Платформа
• Хостинг среднего ценового диапазона• Подключение к сети 100Мбит• Машины в одном датацентре• Крайне желательно, чтобы через WAN
подключение тоже работало
![Page 8: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/8.jpg)
Что такое «репликация»?
• Процесс синхронизации нескольких копий данных
• Репликация возможна на нескольких уровнях:– Уровень блочного устройства– Уровень строк в таблице базы данных– Уровень SQL-запросов
![Page 9: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/9.jpg)
Виды репликации
• Синхронная (копии данных на нодах гарантированно одинаковые)
• Асинхронная (операция завершается раньше, чем о ней узнают все ноды)
• Какая лучше?• А каковы метрики?
![Page 10: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/10.jpg)
Метрики
• Простота настройки• Простота поддержки• Быстродействие• Простота восстановления после сбоя• Скорость восстановления после сбоя• Возможность автоматического
восстановления• Целостность данных
![Page 11: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/11.jpg)
На уровне блочного устройства
• MySQL + DRBD + Heartbeat• Упомянуто в официальной
документации• DRBD – сетевой RAID1• Может быть как sync, так и async• DRBD может быть active-active
– Но для СУБД это не подходит
![Page 12: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/12.jpg)
На уровне блочного устройства
• Минусы:– Для нашей платформы не очень подходит
(очень медленно)– Одна из нод полностью простаивает– Heartbeat устарел, и его кодом никто не
владеет• Плюсы:
– Донастройка MySQL не нужна
![Page 13: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/13.jpg)
Метрики - DRBD
• Простота настройки• Простота поддержки• Быстродействие• Простота восстановления после сбоя• Скорость восстановления после сбоя• Возможность автоматического
восстановления• Целостность данных (sync/async ?)
![Page 14: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/14.jpg)
На уровне базы данных
• Встроенная в MySQL• rubyrep• Galera Cluster for MySQL• Tungsten Replicator• MMM• PRM
![Page 15: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/15.jpg)
Встроенная в MySQL
• до версии 5.1 – только statement-based• 5.1 и выше – row-based• Плюсы:
– Может работать между разными версиями сервера (между 5.0 и 5.5)
– Очень проста в настройке
![Page 16: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/16.jpg)
Встроенная в MySQL
• Минусы– Информация о состоянии slave
записывается в обычный файл – может потеряться (со мной такое было)
– При использовании statement-based slave и master результаты запросов различаются – INSERT…. VALUES(NOW(),….)
![Page 17: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/17.jpg)
Встроенная в MySQL
• Можно настроить master-master и даже кольцевую репликацию
• auto_increment_increment, auto_increment_offset
• log-slave-update=TRUE• Минус: split brain• Выход: На разных узлах писать только в
разные таблицы
![Page 18: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/18.jpg)
Split brain?
• Пусть в кластере есть два узла• Или даже три• Между узлами нарушается связность,
при этом оба узла остаются в рабочем состоянии и обрабатывают запросы
• Рассинхронизация данных
![Page 19: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/19.jpg)
Метрики - встроенная
• Простота настройки• Простота поддержки• Быстродействие• Простота восстановления после сбоя• Скорость восстановления после сбоя• Возможность автоматического
восстановления• Целостность данных
![Page 20: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/20.jpg)
rubyrep
• Trigger-based• Ruby-based• Из-за того, что основана на триггерах,
изменения структуры базы требуют перезапуск репликации
• Несовместима с pt-online-schema-change• Версии MySQL могут быть разными
![Page 21: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/21.jpg)
Метрики - rubyrep
• Простота настройки• Простота поддержки• Быстродействие• Простота восстановления после сбоя• Скорость восстановления после сбоя• Возможность автоматического
восстановления• Целостность данных
![Page 22: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/22.jpg)
Взаимная совместимость
• Краткий ответ – лучше никогда не пытайтесь
• Однажды я настроил rubyrep между серверами со штатной master-slave репликацией
• Возникла петля
![Page 23: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/23.jpg)
Galera Cluster for MySQL
• Синхронная репликация• Производитель заявляет active-active
multi-master• Поддержка MySQL 5.1, 5.5• InnoDB only (MyISAM все равно не
нужен)
![Page 24: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/24.jpg)
Galera Cluster - установка
• MySQL w/wsrep patch .deb/.rpm• wsrep provider .deb/.rpm• По умолчанию wsrep provider отключен• Поменять установки в файле
/etc/mysql/conf.d/wsrep.cnf
![Page 25: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/25.jpg)
Galera Cluster – настройка 1
• binlog_format=ROW• default-storage-engine=InnoDB• innodb_locks_unsafe_for_binlog=1• Отключить query_cache• innodb_autoinc_lock_mode=2
![Page 26: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/26.jpg)
Galera Cluster – настройка 2
• wsrep_cluster_name• wsrep_provider• wsrep_cluster_address – можно
устанавливать динамически в случае, если state transfer method не rsync
• wsrep_retry_autocommit=1• wsrep_certify_non_PK=1
![Page 27: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/27.jpg)
Galera Cluster – передача состояния
• mysqldump – обычный обмен дампом (очень медленно)
• rsync – передача самих файлов DB, гораздо быстрее
• В момент передачи состояния от ноды к ноде кластер недоступен
![Page 28: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/28.jpg)
Galera Cluster - производительность
• Один и тот же дамп базы ~3 Gb• Два узла MySQL, один арбитратор • 100Мб сеть, сервера в одном ДЦ• 60 мин – заливка дампа в кластер• 7 мин – заливка дампа на отдельно
стоящий сервер
![Page 29: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/29.jpg)
Galera Cluster - балансировка
• Блокировка на уровне строк – можно попробовать использовать балансировщик уровня TCP
• Мы использовали HAProxy• Python-based скрипт проверки
состояния MySQL
![Page 30: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/30.jpg)
Galera Cluster – split brain
• Если узла только два, при нарушении связности оба перестанут обрабатывать запросы
• Поэтому узла должно быть три (или любое нечетное число)
• Арбитратор – приложение, которое участвует в обмене данными репликации, но не пишет на диск
![Page 31: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/31.jpg)
Galera Cluster - проблемы
• При конкурентных вставках в одну и ту же таблицу возможен deadlock (и у нас он возникал постоянно)
• Варианты:– Переписать бизнес-логику– Поменять балансировщик
• (кстати, Python скрипт с предыдущего слайда зависал)
![Page 32: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/32.jpg)
Балансировщик уровня приложения - yybal
• Написан на python/greenlets• Не готов для публичного использования• Перенаправляет запросы с учетом их
смысла (все запросы на изменение данных идут на один и тот же узел)
![Page 33: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/33.jpg)
Galera Cluster – проблемы 2
• ID у суррогатных ключей при вставке перескакивал на несколько тысяч
• Разработчик Galera сообщил, что проблема в самом MySQL
• Так как от конкурентной вставки уже отказались, отключили смещение в конфигурационном файле
![Page 34: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/34.jpg)
Galera Cluster – проблемы 3
• Внезапное и необъяснимое увеличение потребления CPU
• Разбираться было некогда
![Page 35: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/35.jpg)
Метрики - Galera
• Простота настройки• Простота поддержки• Быстродействие• Простота восстановления после сбоя• Скорость восстановления после сбоя• Возможность автоматического
восстановления• Целостность данных
![Page 36: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/36.jpg)
MMM
• MMM – Multi-Master Replication Manager• http://www.google.ru/#
q=MMM+MySQL+problems • http://www.xaprb.com/blog/2011/05/04/wh
ats-wrong-with-mmm/
![Page 37: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/37.jpg)
Percona Replication Manager
• Позиционируется как замена MMM• Основан на Pacemaker• Pacemaker предоставляет надежный
коммуникационный канал и занимается арбитражем
• Pacemaker оперирует виртуальными IP-адресами
![Page 38: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/38.jpg)
PRM - настройка
• Как быть с виртуальными IP-адресами, если машины в разных подсетях?
• IPsec туннель, поверх него – GRE туннель с разрешенным multicast
• Quagga с включенным OSPF• Виртуальные адреса на алиасе
локального интерфейса (lo)
![Page 39: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/39.jpg)
PRM – split brain
• PRM очень консервативен и делает выбор нового мастера только один раз
• Логика переключения IP ложится на Pacemaker
• Документация pacemaker• Welcome to Vietnam! (ключевые слово:
STONITH device)
![Page 40: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/40.jpg)
Метрики - PRM
• Простота настройки• Простота поддержки• Быстродействие• Простота восстановления после сбоя• Скорость восстановления после сбоя• Возможность автоматического
восстановления• Целостность данных (semisync?)
![Page 41: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/41.jpg)
Планы на будущее
• Drizzle – очень большое внимание уделено репликации:– формат Google protobuf– replication log – таблица InnoDB– Один slave для нескольких master– Replication state записывается
транзакционно• Semisync plugins для MySQL 5.5
![Page 42: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/42.jpg)
Выводы
• Репликация MySQL требует жертв• Универсального решения не существует• Galera Cluster – неплохое решение при
не очень большой нагрузке (Alexa rank in RU < 500)
• Следите за сообществом
![Page 43: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/43.jpg)
Вопросы?
• • • • • •
![Page 44: Практический опыт использования решений репликации MySQL](https://reader033.vdocuments.site/reader033/viewer/2022061608/56815b3c550346895dc9185f/html5/thumbnails/44.jpg)
Спасибо за внимание!
• С вами был Александр Чистяков• http://alexclear.livejournal.com• [email protected]• http://github.com/alexclear