68
Как мы готовим MySQL Николай Королёв Site Reliability Engineer Badoo

Как мы готовим MySQL

Embed Size (px)

Citation preview

Page 1: Как мы готовим MySQL

Как мы готовим MySQLНиколай КоролёвSite Reliability EngineerBadoo

Page 2: Как мы готовим MySQL

• 320 млн пользователей

• 12 млн пользователей ежедневно

• 32 млн пользователей ежемесячно

• ~ 3000 серверов

О компании

Page 3: Как мы готовим MySQL

C/Go9%

PHP32%

Other22%

Photos15%MySQL

22%

Наша инфраструктура

Page 4: Как мы готовим MySQL

Подробнее о наших базах*

• 310 серверов

• 370 Тб

• 64 млн таблиц

• Пиковый QPS > 1 900 000

*кластер пользовательских данных

Page 5: Как мы готовим MySQL

Секрет успеха DBA

• Стабильность работы баз данных

• Приемлемое время выполнения запросов

• Сохранность и доступность данных пользователей

Page 6: Как мы готовим MySQL

Пользователь

Page 7: Как мы готовим MySQL

Активный пользователь

Page 8: Как мы готовим MySQL

Активный пользователь с подпиской

Page 9: Как мы готовим MySQL

Пользователь глазами DBA

ШАРДИРОВАНИЕ

Page 10: Как мы готовим MySQL

ШАРДИРОВАНИЕ

Старт проекта

Page 11: Как мы готовим MySQL

ШАРДИРОВАНИЕ

Развитие проекта

Page 12: Как мы готовим MySQL

ШАРДИРОВАНИЕ

Первая проблема

Page 13: Как мы готовим MySQL

Варианты масштабирования

• Партицирование

ШАРДИРОВАНИЕ

Page 14: Как мы готовим MySQL

• Партицирование

• Репликация

Варианты масштабирования

ШАРДИРОВАНИЕ

Page 15: Как мы готовим MySQL

• Партицирование

• Репликация

• Шардирование

Варианты масштабирования

ШАРДИРОВАНИЕ

Page 16: Как мы готовим MySQL

Шардирование по ключу user_id

ШАРДИРОВАНИЕ

Page 17: Как мы готовим MySQL

Шардирование по ключу user_id

ШАРДИРОВАНИЕ

Page 18: Как мы готовим MySQL

Шардирование по ключу user_id

ШАРДИРОВАНИЕ

Page 19: Как мы готовим MySQL

набор шардированных таблиц, связанных с определенными пользователями

Спот – это …

ШАРДИРОВАНИЕ

Page 20: Как мы готовим MySQL

Что такое UDB?

• KV Storage: user_id => spot_id

• HandlerSocket

✓QPS ~ 50k

✓Request time ~ 5ms

ШАРДИРОВАНИЕ

Page 21: Как мы готовим MySQL

Что делать со spot_id?

В коде есть карта; оригинал карты в базе

ШАРДИРОВАНИЕ

Page 22: Как мы готовим MySQL

Что получилось?

• Реализовали схему шардирования данных

• Создали кластер серверов бд - dbs

• Сделали сервис UDB и карту спотов

ШАРДИРОВАНИЕ

Page 23: Как мы готовим MySQL

Badoo в 2006

РЕПЛИКАЦИЯ

Page 24: Как мы готовим MySQL

Badoo в 2008

РЕПЛИКАЦИЯ

Page 25: Как мы готовим MySQL

Badoo в 2008

РЕПЛИКАЦИЯ

Page 26: Как мы готовим MySQL

• RTT ~ 120 ms• connect ~ 0.6 s

Badoo в 2008

РЕПЛИКАЦИЯ

Page 27: Как мы готовим MySQL

A. Проблема внешняя:

– Запрос информации с удаленной площадки

B. Проблема внутренняя:

– Скрипты, работающие со всеми пользователями, работают слишком долго

Почему это проблема ?

РЕПЛИКАЦИЯ

Page 28: Как мы готовим MySQL

Идея!

РЕПЛИКАЦИЯ

Page 29: Как мы готовим MySQL

Требования• Данные только для чтения

• Нужна только часть спота

• Другой профиль нагрузки

=> репликация “много к 1”

РЕПЛИКАЦИЯ

Page 30: Как мы готовим MySQL

Готовое решение? (2008)

MySQL replication:

1. Работает в 1 поток

2.Позволяет только схему “1 к 1”

РЕПЛИКАЦИЯ

Page 31: Как мы готовим MySQL

Пилим велосипед: своя репликация

•Логирование

•Доставка

•Проигрывание

РЕПЛИКАЦИЯ

Page 32: Как мы готовим MySQL

Логирование: пишем DML в таблицу

РЕПЛИКАЦИЯ

Page 33: Как мы готовим MySQL

Доставка: сохраняем на диск

РЕПЛИКАЦИЯ

Page 34: Как мы готовим MySQL

Доставка: сжимаем и отправляем

РЕПЛИКАЦИЯ

Page 35: Как мы готовим MySQL

Проигрывание: распаковываем, применяем

РЕПЛИКАЦИЯ

Page 36: Как мы готовим MySQL

Проигрывание: распаковываем, применяем

РЕПЛИКАЦИЯ

✓IOPS✓Memory (fs cache / running scripts )

Page 37: Как мы готовим MySQL

Общая схема репликации

РЕПЛИКАЦИЯ

Page 38: Как мы готовим MySQL

• Перезаливка полного отношенияИнструменты

РЕПЛИКАЦИЯ

Page 39: Как мы готовим MySQL

• Перезаливка одной/нескольких таблиц в отношенииИнструменты

РЕПЛИКАЦИЯ

Page 40: Как мы готовим MySQL

• Проверяем отставание репликации

• Репликационный лаг мы мониторим Zabbix-ом

Репликация: мониторинг

РЕПЛИКАЦИЯ

Page 41: Как мы готовим MySQL

Плюсы и минусы нашего решенияМинусы:• Репликационный лаг от 10 сек до 1 мин• Диагностика и исправление проблем подразумевает наличие глубоких знаний о нашей системе

РЕПЛИКАЦИЯ

Page 42: Как мы готовим MySQL

Плюсы и минусы нашего решенияМинусы:• Репликационный лаг от 10 сек до 1 мин• Диагностика и исправление проблем подразумевает наличие глубоких знаний о нашей системеПлюсы:• Репликация “много”=>”много”• Проигрывание репликации в несколько потоков• Инструменты для восстановления данных на реплике (dbb)

РЕПЛИКАЦИЯ

Page 43: Как мы готовим MySQL

DDL

DDL

Page 44: Как мы готовим MySQL

Зачем нам DDL?

DDL

Page 45: Как мы готовим MySQL

Зачем нам DDL?

DDL

Page 46: Как мы готовим MySQL

В споте этих изменений нет!

DDL

Миграция БД

Page 47: Как мы готовим MySQL

В споте этих изменений нет!

DDL

Репликационная пара

Page 48: Как мы готовим MySQL

В споте этих изменений нет!

До релиза задачи схема должна

быть изменена

DDL

Page 49: Как мы готовим MySQL

Вот так выглядит флоу

• Разработчик ставит тикет на DDL (ALTER request)

• DBA делает ревью DDL

• Выполняется ALTER request на всём кластере

• Разработчик выкатывает фичу в продакшн

DDL

Page 50: Как мы готовим MySQL

Выполнение DDL

• Обычный блокирующий ALTER / CREATE / DROP (MySQL 5.6 FTW)• Небольшой размер спота• Среднее время выполнения ~ 40 минут

DDL

Page 51: Как мы готовим MySQL

Результат выполнения DDL•Скрипт отправляет письмо о завершении и его статусе

•DBA убеждается что ALTER успешно выполнен и закрывает тикет

•Разработчик может релизить свою задачу (договоренность)

DDL

Page 52: Как мы готовим MySQL

• Разработчиков много => задач на DDL много

• “Легкие” DDL можно сгруппировать, но что делать с остальными?

• Нужна очередь

Растущие запросы на DDL

DDL

Page 53: Как мы готовим MySQL

Очередь DDL

• Выстраивается вручную DBA

• По принципу FIFO

• Порядок очереди может быть нарушен

DDL

Page 54: Как мы готовим MySQL

Вот так и живём!

DDL

Page 55: Как мы готовим MySQL

Наш кластер• ~ 100 dbs

•Железо не гомогенное (серверы покупались в разное

время)

• Разное соотношение активных/неактивных пользователей

Устанавливаем новый сервер => появляются пользователи

На сколько хватит сервера?РАСПРЕДЕЛЕНИЕ НАГРУЗКИ

Page 56: Как мы готовим MySQL

“Температура” спота

РАСПРЕДЕЛЕНИЕ НАГРУЗКИ

Page 57: Как мы готовим MySQL

Жизненный цикл сервера

РАСПРЕДЕЛЕНИЕ НАГРУЗКИ

Page 58: Как мы готовим MySQL

“Температура” спота v.2

РАСПРЕДЕЛЕНИЕ НАГРУЗКИ

Page 59: Как мы готовим MySQL

РАСПРЕДЕЛЕНИЕ НАГРУЗКИ

Активный пользователь

Неактивный пользователь

CPU

Memory Disk space

IOPS

Каждому своё…

Page 60: Как мы готовим MySQL

Разделяем профили нагрузки

РАСПРЕДЕЛЕНИЕ НАГРУЗКИ

Page 61: Как мы готовим MySQL

Проект “кладбище”• Миграция осуществляется в фоновом режиме

• DBA активного участия не принимает

• Освободилось до 25% ресурсов основного кластера

РАСПРЕДЕЛЕНИЕ НАГРУЗКИ

Page 62: Как мы готовим MySQL

last but not least

БЭКАП

Page 63: Как мы готовим MySQL

Бэкап

• Общее количество спотов - 360 000

• Количество таблиц в споте > 80

• Общий объем данных > 190 Тб

Как это бэкапить?

БЭКАП

Page 64: Как мы готовим MySQL

Условия успешного бэкапа• Консистентность данных важна в пределах спота

• Все таблицы в InnoDB

• Маленький размер спота

• DDL происходит по расписанию

mysqldump

БЭКАП

Page 65: Как мы готовим MySQL

Схема бэкапа

БЭКАП

Page 66: Как мы готовим MySQL

Итого мы бэкапим

• 25 Тб сжатых данных

• Время полного бэкапа - менее 24 часов

• Последняя копия – на sqlbackup

• Остальные – на ленте

БЭКАП

Page 67: Как мы готовим MySQL

KISS

Page 68: Как мы готовим MySQL

Спасибо!

Вопросы?

Николай Королёв[email protected]

@BadooDevhttps://habrahabr.ru/company/badoo/

https://tech.badoo.com/ru/