Как мы готовим MySQL
-
Upload
badoo-development -
Category
Technology
-
view
76 -
download
0
Transcript of Как мы готовим MySQL
![Page 1: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/1.jpg)
Как мы готовим MySQLНиколай КоролёвSite Reliability EngineerBadoo
![Page 2: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/2.jpg)
• 320 млн пользователей
• 12 млн пользователей ежедневно
• 32 млн пользователей ежемесячно
• ~ 3000 серверов
О компании
![Page 3: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/3.jpg)
C/Go9%
PHP32%
Other22%
Photos15%MySQL
22%
Наша инфраструктура
![Page 4: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/4.jpg)
Подробнее о наших базах*
• 310 серверов
• 370 Тб
• 64 млн таблиц
• Пиковый QPS > 1 900 000
*кластер пользовательских данных
![Page 5: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/5.jpg)
Секрет успеха DBA
• Стабильность работы баз данных
• Приемлемое время выполнения запросов
• Сохранность и доступность данных пользователей
![Page 6: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/6.jpg)
Пользователь
![Page 7: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/7.jpg)
Активный пользователь
![Page 8: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/8.jpg)
Активный пользователь с подпиской
![Page 9: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/9.jpg)
Пользователь глазами DBA
ШАРДИРОВАНИЕ
![Page 10: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/10.jpg)
ШАРДИРОВАНИЕ
Старт проекта
![Page 11: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/11.jpg)
ШАРДИРОВАНИЕ
Развитие проекта
![Page 12: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/12.jpg)
ШАРДИРОВАНИЕ
Первая проблема
![Page 13: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/13.jpg)
Варианты масштабирования
• Партицирование
ШАРДИРОВАНИЕ
![Page 14: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/14.jpg)
• Партицирование
• Репликация
Варианты масштабирования
ШАРДИРОВАНИЕ
![Page 15: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/15.jpg)
• Партицирование
• Репликация
• Шардирование
Варианты масштабирования
ШАРДИРОВАНИЕ
![Page 16: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/16.jpg)
Шардирование по ключу user_id
ШАРДИРОВАНИЕ
![Page 17: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/17.jpg)
Шардирование по ключу user_id
ШАРДИРОВАНИЕ
![Page 18: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/18.jpg)
Шардирование по ключу user_id
ШАРДИРОВАНИЕ
![Page 19: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/19.jpg)
набор шардированных таблиц, связанных с определенными пользователями
Спот – это …
ШАРДИРОВАНИЕ
![Page 20: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/20.jpg)
Что такое UDB?
• KV Storage: user_id => spot_id
• HandlerSocket
✓QPS ~ 50k
✓Request time ~ 5ms
ШАРДИРОВАНИЕ
![Page 21: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/21.jpg)
Что делать со spot_id?
В коде есть карта; оригинал карты в базе
ШАРДИРОВАНИЕ
![Page 22: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/22.jpg)
Что получилось?
• Реализовали схему шардирования данных
• Создали кластер серверов бд - dbs
• Сделали сервис UDB и карту спотов
ШАРДИРОВАНИЕ
![Page 23: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/23.jpg)
Badoo в 2006
РЕПЛИКАЦИЯ
![Page 24: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/24.jpg)
Badoo в 2008
РЕПЛИКАЦИЯ
![Page 25: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/25.jpg)
Badoo в 2008
РЕПЛИКАЦИЯ
![Page 26: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/26.jpg)
• RTT ~ 120 ms• connect ~ 0.6 s
Badoo в 2008
РЕПЛИКАЦИЯ
![Page 27: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/27.jpg)
A. Проблема внешняя:
– Запрос информации с удаленной площадки
B. Проблема внутренняя:
– Скрипты, работающие со всеми пользователями, работают слишком долго
Почему это проблема ?
РЕПЛИКАЦИЯ
![Page 28: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/28.jpg)
Идея!
РЕПЛИКАЦИЯ
![Page 29: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/29.jpg)
Требования• Данные только для чтения
• Нужна только часть спота
• Другой профиль нагрузки
=> репликация “много к 1”
РЕПЛИКАЦИЯ
![Page 30: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/30.jpg)
Готовое решение? (2008)
MySQL replication:
1. Работает в 1 поток
2.Позволяет только схему “1 к 1”
РЕПЛИКАЦИЯ
![Page 31: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/31.jpg)
Пилим велосипед: своя репликация
•Логирование
•Доставка
•Проигрывание
РЕПЛИКАЦИЯ
![Page 32: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/32.jpg)
Логирование: пишем DML в таблицу
РЕПЛИКАЦИЯ
![Page 33: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/33.jpg)
Доставка: сохраняем на диск
РЕПЛИКАЦИЯ
![Page 34: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/34.jpg)
Доставка: сжимаем и отправляем
РЕПЛИКАЦИЯ
![Page 35: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/35.jpg)
Проигрывание: распаковываем, применяем
РЕПЛИКАЦИЯ
![Page 36: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/36.jpg)
Проигрывание: распаковываем, применяем
РЕПЛИКАЦИЯ
✓IOPS✓Memory (fs cache / running scripts )
![Page 37: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/37.jpg)
Общая схема репликации
РЕПЛИКАЦИЯ
![Page 38: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/38.jpg)
• Перезаливка полного отношенияИнструменты
РЕПЛИКАЦИЯ
![Page 39: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/39.jpg)
• Перезаливка одной/нескольких таблиц в отношенииИнструменты
РЕПЛИКАЦИЯ
![Page 40: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/40.jpg)
• Проверяем отставание репликации
• Репликационный лаг мы мониторим Zabbix-ом
Репликация: мониторинг
РЕПЛИКАЦИЯ
![Page 41: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/41.jpg)
Плюсы и минусы нашего решенияМинусы:• Репликационный лаг от 10 сек до 1 мин• Диагностика и исправление проблем подразумевает наличие глубоких знаний о нашей системе
РЕПЛИКАЦИЯ
![Page 42: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/42.jpg)
Плюсы и минусы нашего решенияМинусы:• Репликационный лаг от 10 сек до 1 мин• Диагностика и исправление проблем подразумевает наличие глубоких знаний о нашей системеПлюсы:• Репликация “много”=>”много”• Проигрывание репликации в несколько потоков• Инструменты для восстановления данных на реплике (dbb)
РЕПЛИКАЦИЯ
![Page 43: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/43.jpg)
DDL
DDL
![Page 44: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/44.jpg)
Зачем нам DDL?
DDL
![Page 45: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/45.jpg)
Зачем нам DDL?
DDL
![Page 46: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/46.jpg)
В споте этих изменений нет!
DDL
Миграция БД
![Page 47: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/47.jpg)
В споте этих изменений нет!
DDL
Репликационная пара
![Page 48: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/48.jpg)
В споте этих изменений нет!
До релиза задачи схема должна
быть изменена
DDL
![Page 49: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/49.jpg)
Вот так выглядит флоу
• Разработчик ставит тикет на DDL (ALTER request)
• DBA делает ревью DDL
• Выполняется ALTER request на всём кластере
• Разработчик выкатывает фичу в продакшн
DDL
![Page 50: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/50.jpg)
Выполнение DDL
• Обычный блокирующий ALTER / CREATE / DROP (MySQL 5.6 FTW)• Небольшой размер спота• Среднее время выполнения ~ 40 минут
DDL
![Page 51: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/51.jpg)
Результат выполнения DDL•Скрипт отправляет письмо о завершении и его статусе
•DBA убеждается что ALTER успешно выполнен и закрывает тикет
•Разработчик может релизить свою задачу (договоренность)
DDL
![Page 52: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/52.jpg)
• Разработчиков много => задач на DDL много
• “Легкие” DDL можно сгруппировать, но что делать с остальными?
• Нужна очередь
Растущие запросы на DDL
DDL
![Page 53: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/53.jpg)
Очередь DDL
• Выстраивается вручную DBA
• По принципу FIFO
• Порядок очереди может быть нарушен
DDL
![Page 54: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/54.jpg)
Вот так и живём!
DDL
![Page 55: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/55.jpg)
Наш кластер• ~ 100 dbs
•Железо не гомогенное (серверы покупались в разное
время)
• Разное соотношение активных/неактивных пользователей
Устанавливаем новый сервер => появляются пользователи
На сколько хватит сервера?РАСПРЕДЕЛЕНИЕ НАГРУЗКИ
![Page 56: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/56.jpg)
“Температура” спота
РАСПРЕДЕЛЕНИЕ НАГРУЗКИ
![Page 57: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/57.jpg)
Жизненный цикл сервера
РАСПРЕДЕЛЕНИЕ НАГРУЗКИ
![Page 58: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/58.jpg)
“Температура” спота v.2
РАСПРЕДЕЛЕНИЕ НАГРУЗКИ
![Page 59: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/59.jpg)
РАСПРЕДЕЛЕНИЕ НАГРУЗКИ
Активный пользователь
Неактивный пользователь
CPU
Memory Disk space
IOPS
Каждому своё…
![Page 60: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/60.jpg)
Разделяем профили нагрузки
РАСПРЕДЕЛЕНИЕ НАГРУЗКИ
![Page 61: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/61.jpg)
Проект “кладбище”• Миграция осуществляется в фоновом режиме
• DBA активного участия не принимает
• Освободилось до 25% ресурсов основного кластера
РАСПРЕДЕЛЕНИЕ НАГРУЗКИ
![Page 62: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/62.jpg)
last but not least
БЭКАП
![Page 63: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/63.jpg)
Бэкап
• Общее количество спотов - 360 000
• Количество таблиц в споте > 80
• Общий объем данных > 190 Тб
Как это бэкапить?
БЭКАП
![Page 64: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/64.jpg)
Условия успешного бэкапа• Консистентность данных важна в пределах спота
• Все таблицы в InnoDB
• Маленький размер спота
• DDL происходит по расписанию
mysqldump
БЭКАП
![Page 65: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/65.jpg)
Схема бэкапа
БЭКАП
![Page 66: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/66.jpg)
Итого мы бэкапим
• 25 Тб сжатых данных
• Время полного бэкапа - менее 24 часов
• Последняя копия – на sqlbackup
• Остальные – на ленте
БЭКАП
![Page 67: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/67.jpg)
KISS
![Page 68: Как мы готовим MySQL](https://reader033.fdocument.pub/reader033/viewer/2022042907/58803e5d1a28abfd0a8b599b/html5/thumbnails/68.jpg)
Спасибо!
Вопросы?
Николай Королёв[email protected]
@BadooDevhttps://habrahabr.ru/company/badoo/
https://tech.badoo.com/ru/