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

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

Jan 19, 2017

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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/