Как мы готовим mysql / Николай Королёв (badoo)

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

Upload: ontico

Post on 06-Jan-2017

146 views

Category:

Engineering


6 download

TRANSCRIPT

Page 1: Как мы готовим MySQL / Николай Королёв (Badoo)

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

Page 2: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

• ~ 3000 серверов

О компании

Page 3: Как мы готовим MySQL / Николай Королёв (Badoo)

C/Go9%

PHP32%

Other22%

Photos15%MySQL

22%

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

Page 4: Как мы готовим MySQL / Николай Королёв (Badoo)

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

• 310 серверов

• 370 Тб

• 64 млн таблиц

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

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

Page 5: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

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

Page 6: Как мы готовим MySQL / Николай Королёв (Badoo)

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

Page 7: Как мы готовим MySQL / Николай Королёв (Badoo)

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

Page 8: Как мы готовим MySQL / Николай Королёв (Badoo)

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

Page 9: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 10: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 11: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 12: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 13: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

Page 14: Как мы готовим MySQL / Николай Королёв (Badoo)

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

• Репликация

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

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

Page 15: Как мы готовим MySQL / Николай Королёв (Badoo)

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

• Репликация

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

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

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

Page 16: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 17: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 18: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 19: Как мы готовим MySQL / Николай Королёв (Badoo)

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

Спот – это …

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

Page 20: Как мы готовим MySQL / Николай Королёв (Badoo)

Что такое UDB?

• KV Storage:

user_id => spot_id

• HandlerSocket

✓QPS ~ 50k

✓Request time ~ 5ms

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

Page 21: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

Page 22: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

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

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

Page 23: Как мы готовим MySQL / Николай Королёв (Badoo)

Badoo в 2006

РЕПЛИКАЦИЯ

Page 24: Как мы готовим MySQL / Николай Королёв (Badoo)

Badoo в 2008

РЕПЛИКАЦИЯ

Page 25: Как мы готовим MySQL / Николай Королёв (Badoo)

Badoo в 2008

РЕПЛИКАЦИЯ

Page 26: Как мы готовим MySQL / Николай Королёв (Badoo)

• RTT ~ 120 ms• connect ~ 0.6 s

Badoo в 2008

РЕПЛИКАЦИЯ

Page 27: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

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

работают слишком долго

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

РЕПЛИКАЦИЯ

Page 28: Как мы готовим MySQL / Николай Королёв (Badoo)

Идея!

РЕПЛИКАЦИЯ

Page 29: Как мы готовим MySQL / Николай Королёв (Badoo)

Требования

• Данные только для чтения

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

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

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

РЕПЛИКАЦИЯ

Page 30: Как мы готовим MySQL / Николай Королёв (Badoo)

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

MySQL replication:

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

2. Позволяет только

схему “1 к 1”

РЕПЛИКАЦИЯ

Page 31: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

•Доставка

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

РЕПЛИКАЦИЯ

Page 32: Как мы готовим MySQL / Николай Королёв (Badoo)

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

РЕПЛИКАЦИЯ

Page 33: Как мы готовим MySQL / Николай Королёв (Badoo)

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

РЕПЛИКАЦИЯ

Page 34: Как мы готовим MySQL / Николай Королёв (Badoo)

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

РЕПЛИКАЦИЯ

Page 35: Как мы готовим MySQL / Николай Королёв (Badoo)

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

РЕПЛИКАЦИЯ

Page 36: Как мы готовим MySQL / Николай Королёв (Badoo)

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

РЕПЛИКАЦИЯ

✓IOPS✓Memory (fs cache / running scripts )

Page 37: Как мы готовим MySQL / Николай Королёв (Badoo)

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

РЕПЛИКАЦИЯ

Page 38: Как мы готовим MySQL / Николай Королёв (Badoo)

• Перезаливка полного отношения

Инструменты

РЕПЛИКАЦИЯ

Page 39: Как мы готовим MySQL / Николай Королёв (Badoo)

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

Инструменты

РЕПЛИКАЦИЯ

Page 40: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

РЕПЛИКАЦИЯ

Page 41: Как мы готовим MySQL / Николай Королёв (Badoo)

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

глубоких знаний о нашей системе

РЕПЛИКАЦИЯ

Page 42: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

РЕПЛИКАЦИЯ

Page 43: Как мы готовим MySQL / Николай Королёв (Badoo)

DDL

DDL

Page 44: Как мы готовим MySQL / Николай Королёв (Badoo)

Зачем нам DDL?

DDL

Page 45: Как мы готовим MySQL / Николай Королёв (Badoo)

Зачем нам DDL?

DDL

Page 46: Как мы готовим MySQL / Николай Королёв (Badoo)

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

DDL

Миграция БД

Page 47: Как мы готовим MySQL / Николай Королёв (Badoo)

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

DDL

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

Page 48: Как мы готовим MySQL / Николай Королёв (Badoo)

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

До релиза задачи схема должна быть изменена

DDL

Page 49: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

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

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

DDL

Page 50: Как мы готовим MySQL / Николай Королёв (Badoo)

Выполнение DDL

• Обычный блокирующий ALTER / CREATE / DROP (MySQL 5.6 FTW)

• Небольшой размер спота

• Среднее время выполнения ~ 40 минут

DDL

Page 51: Как мы готовим MySQL / Николай Королёв (Badoo)

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

статусе

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

закрывает тикет

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

(договоренность)

DDL

Page 52: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

остальными?

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

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

DDL

Page 53: Как мы готовим MySQL / Николай Королёв (Badoo)

Очередь DDL

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

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

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

DDL

Page 54: Как мы готовим MySQL / Николай Королёв (Badoo)

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

DDL

Page 55: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

время)

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

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

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

Page 56: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 57: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 58: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 59: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

CPU

Memory Disk space

IOPS

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

Page 60: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

Page 61: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

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

Page 62: Как мы готовим MySQL / Николай Королёв (Badoo)

last but not least

БЭКАП

Page 63: Как мы готовим MySQL / Николай Королёв (Badoo)

Бэкап

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

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

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

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

БЭКАП

Page 64: Как мы готовим MySQL / Николай Королёв (Badoo)

Условия успешного бэкапа

• Консистентность данных важна в

пределах спота

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

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

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

mysqldump

БЭКАП

Page 65: Как мы готовим MySQL / Николай Королёв (Badoo)

Схема бэкапа

БЭКАП

Page 66: Как мы готовим MySQL / Николай Королёв (Badoo)

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

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

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

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

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

БЭКАП

Page 67: Как мы готовим MySQL / Николай Королёв (Badoo)

KISS

Page 68: Как мы готовим MySQL / Николай Королёв (Badoo)

Спасибо!

Вопросы?

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

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

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