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