Upload
dev1ant
View
203
Download
0
Embed Size (px)
Citation preview
История успеха Яндекс.Почты
Владимир Бородин
Запущена в 2000
10+ миллионов пользователей в сутки
200.000 RPS в бэкенды web/mobile/imap
150+ миллионов писем покладки в сутки
20+ ПБ данных
3
О Яндекс.Почте
Миграция из Oracle в PostgreSQL
300+ ТБ метаданных без избыточности
250k запросов в секунду
OLTP: 80% чтений, 20% записи
Предыдущие попытки
MySQL
Самописное решение
4
Об этом рассказе
5
О почтовых метаданных
6
Назад в 2012
Всё хранилось в Oracle
Очень много PL/SQL логики
Эффективная утилизация аппаратного обеспечения
10+ ТБ данных на шард
Рабочий LA 100
Много ручных операций
Тёплые (SSD) и холодные (SATA) базы для разных пользователей
75% SSD, 25% SATA
8
Метаданные Яндекс.Почты
9
Шардирование и отказоустойчивость
10
Внутри приложения
11
Реальность
PL/SQL deploy
Library cache
Множество ручных операций
Переключение мастера, наливка новой базы, переносы данных
Только синхронный интерфейс в OCCI
Проблемы с разработческими окружениями
Не очень отзывчивая поддержка
12
Наиболее популярные проблемы
Хронология
Октябрь 2012 — политическое решение
Избавиться от Oracle за 3 года
Апрель 2013 — первые эксперименты с разными СУБД
PostgreSQL
Множество NoSQL решений
Самописное решение на основе поискового бэкенды
Июль 2013 — июнь 2014 — эксперимент со сборщиками
https://simply.name/ru/video-pg-meetup-yandex.html
15
Эксперименты
Август 2014 — декабрь 2014
Прокладка всего боевого потока писем в PostgreSQL
Асинхронно
Первоначальные решения со схемой данных
Важно для слоя абстракции
Нагрузочное тестирование под живой нагрузкой
Выбор аппаратного обеспечения
Множество другого опыта работы с PostgreSQL
https://simply.name/ru/postgresql-and-systemtap.html
16
Прототип всей почты
Январь 2015 — январь 2016 — разработка
Июнь 2015 — dog fooding
Ускорение разработки
Сентябрь 2015 — начало миграции неактивных пользователей
Исправление ошибок в коде переноса
Обратный перенос (план Б)
Январь 2016 — апрель 2016 — миграция
17
Основная работа
Переписывание всего кода для работы с Oracle и PostgreSQL
10 человеколет
19
Миграция
20
Завершение
Основные изменения
22
macs
23
Шардирование и отказоустойчивость
24
Аппаратное обеспечение
Тёплые базы (SSD) для большинства активных пользователей
Холодные базы (SATA) для всех неактивных пользователей
Горячие базы для очень активных пользователей
2% пользователей создают 50% нагрузки
Автоматизация переноса пользователей между типами шардов
TBD: перемещение старых писем активных пользователей с SSD на SATA
25
Аппаратное обеспечение
В Oracle все идентификаторы (mid, fid, lid, tid) глобально уникальны
Диапазоны для sequence’ов каждого шарда в отдельной БД
NUMBER(20, 0) — 20 байт
В PostgreSQL идентификаторы уникальны в пределах одного логина
Вместо уникального mid уникальная пара (uid, mid)
Bigint + bigint — 16 байт
26
Идентификаторы
Меньше конкуренция за одну страницу индекса
Обычный B-Tree вместо реверсивных индексов
Ревизии для всех объектов
Возможность читать с реплик только актуальные данные
Инкрементальные обновления для IMAP и мобильных
Денормализация части данных
Массивы и GIN
Композитные типы
27
Изменения схемы
xdb01g/maildb M # \dS mail.box
Table "mail.box"
Column | Type | Modifiers
---------------+--------------------------+------------------------
uid | bigint | not null
mid | bigint | not null
lids | integer[] | not null
<...>
Indexes:
"pk_box" PRIMARY KEY, btree (uid, mid)
"i_box_uid_lids" gin (mail.ulids(uid, lids)) WITH (fastupdate=off)
<...>
xdb01g/maildb M #
28
Пример
PL/pgSQL прекрасен
Сильно сократили количество логики
Только для гарантии логической целостности данных
Сильно увеличили покрытие тестами
Цена ошибки очень высока
Простой deploy
29
Хранимая логика
SaltStack
Детальный diff между текущим и ожидаемым состоянием
Все изменения схемы и кода через миграции
Все частые операции автоматизированы
Репрезентативные тестовые окружения
30
Подход к обслуживанию
Проблемы
Problem with ExclusiveLock on inserts
Checkpoint distribution
ExclusiveLock on extension of relation with huge shared_buffers
Hanging startup process on the replica after vacuuming on master
Replication slots and isolation levels
Segfault in BackendIdGetTransactionIds
Значительно больше решено без помощи сообщества
32
До начала основного переноса
Oracle DBA
В любой непонятной ситуации виноват autovacuum
https://simply.name/ru/pg-stat-wait.html
Wait_event in pg_stat_activity (9.6)
https://simply.name/ru/slides-pgday2015.html
34
Диагностика
В Oracle бэкапы (inc0 + 6 * inc1) и archive логи ≈ размер БД
В PostgreSQL с barman’ом ≈ N * размер БД, где N > 5
WAL’ы сжимаются, а бэкапы нет
File-level increment’ы толком не работают
Все операции однопоточные и очень медленные
Для 300 ТБ данных понадобилось бы ≈ 2 ПБ под бэкапы
https://github.com/2ndquadrant-it/barman/issues/21
http://pgday.ru/ru/2016/papers/80
35
Резервные копии
Проблемы не с PostgreSQL
Проблемы с данными
Очень много legacy за 10+ лет
Ошибки в коде переноса
36
Во время основного переноса
Завершение
Declarative partitioning
Хороший recovery manager
Параллелизм/сжатие/page-level increment’ы
Частичное восстановление (например, одной таблицы) в online
Дальнейшее развитие интерфейса ожиданий
Большой разделяемый кэш, O_DIRECT и асинхронное I/O
Quorum commit
38
Нам не хватает в PostgreSQL
1 PB с отказоустойчивостью (100+ миллиардов строк)
250k TPS
Три календарных года / 10+ человеколет
Быстрее deploy / эффективнее использование времени DBA
Рефакторинг кода всего бэкенда
В 3 раза больше аппаратного обеспечения
Ни одной крупной аварии пока :)
Linux, nginx, postfix, PostgreSQL
39
Итоги
Владимир Бородин
Системный администратор
Вопросы?
@man_brain
https://simply.name
+7 (495) 739 70 00, доб. 7255