SlideShare a Scribd company logo
Haystack
«Использование баз данных»
Цесько Вадим Александрович
https://incubos.org
@incubos
24 мая 2017 г.
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 1 / 46
Содержание
1 Введение
2 Background
3 Архитектура
4 Детали реализации
5 Заключение
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 2 / 46
Введение Материалы
Материалы
Doug Beaver, Sanjeev Kumar, Harry C. Li, Jason
Sobel, Peter Vajgel, Facebook Inc. Finding a needle
in Haystack: Facebook’s photo storage. 2010
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 3 / 46
Введение Мотивация
Мотивация
Зачем мы это рассматриваем:
Промышленная внедрённая технология
Логика проектирования
Интересные проектные решения
Просто интересно, как делают взрослые дядьки
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 4 / 46
Введение Цифры
Цифры
На 2010 год:
65 млрд. оригинальных фоток
4х размера = 260 млрд. фоток = 20 ПБ
+1 млрд. фоток (60 ТБ) каждую неделю
1 Mrps в пике
В проде 2 года
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 5 / 46
Введение Характер запросов
Характер запросов
Пишем — один раз
Читаем — часто
Никогда не перезаписываем
Удаляем — редко
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 6 / 46
Введение Основные цели
Основные цели
High throughput and low latency
UGC, CDN, User Experience
1 поиск по диску максимум
Микрометаданные в памяти
Fault-tolerant
UGC
Георепликация
Cost-effective
$ / TB, read rps / TB
$ / TB — на 28% меньше, read rps / TB — в 4
раза больше vs NAS
Simple
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 7 / 46
Background Типичная архитектура
Путь запроса
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 8 / 46
Background Типичная архитектура
CDN
Клиент получает URL от Web Server
Идёт с URL’ом в CDN
Если у CDN есть данные, то отдаёт
Если нет, то идёт в Photo Storage и кэширует
URL содержит необходимую CDN информацию
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 9 / 46
Background NFS
Главный урок
CDN не подходит для социальных фотосервисов
Эффективно раздаёт «горячие» фотки (профили
и свежие)
Длинный хвост (непопулярные и/или старые)
Длинный хвост невозможно кэшировать
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 10 / 46
Background NFS
Путь запроса
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 11 / 46
Background NFS
Хранение фоток
Каждая фотка в отдельном файле на
коммерческом NAS
Photo Store монтирует все разделы через NFS
Photo Store из URL вынимает путь, читает файл
по NFS и отдаёт CDN
Проблемы
Тысячи файлов в каждом каталоге
Больше 10 дисковых операций на одну фотку
Сотни файлов в каждом каталоге
Больше 3 дисковых операций на одну фотку
(метаданные каталога, inode, содержимое файла)
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 12 / 46
Background NFS
Оптимизации
Кэш из имени файла в файловый дескриптор
Пропатчили ядро — системный вызов
open_by_filehandle
Не сильно помогло на длинном хосте
Вывод
Кэш не всегда спасает
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 13 / 46
Background NFS
Альтернативы
Из используемого в Facebook:
Аналог GFS
MySQL
Hadoop
ФС (inode — сотни байт на файл)
Вывод
Всё не очень подходит для длинного хвоста
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 14 / 46
Архитектура Новая версия
Новая версия
CDN для популярных фоток (пока что)
Haystack для длинного хвоста
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 15 / 46
Архитектура Задача
Задача
Уменьшить нагрузку на диск
Только необходимые операции
Уменьшить расход памяти на метаданные
Держать все метаданные в памяти
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 16 / 46
Архитектура Подход
Подход
Haystack
Огромные файлы с кучей фоток в каждом
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 17 / 46
Архитектура Компоненты
Компоненты
Store
Physical volume (на каждой машине 100 х 100 ГБ =
10 ТБ)
Logical volume = Replica Set
Directory
Logical volume → Physical volume
Фотка → Logical volume
Logical volumes with free space
Cache
Прикрывает Store
Защищает при перезапуске CDN
Уменьшает зависимость от CDN
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 18 / 46
Архитектура Компоненты
Чтение фоток
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 19 / 46
Архитектура Компоненты
URL
CDN URL
http://<CDN>/<Cache>/<Store>/<LV, Photo>
Браузер идёт на <CDN>
CDN ищет у себя, используя <LV, Photo>
Если не нашёл, отрезает <CDN> и идёт в <Cache>
Cache ищет у себя, используя <LV, Photo>
Если не нашёл, отрезает <CDN> и идёт в <Store>
Direct URL
http://<Cache>/<Store>/<LV, Photo>
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 20 / 46
Архитектура Компоненты
Добавление фоток
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 21 / 46
Архитектура Directory
Функции Directory
Отображение из логических томов в физические
При добавлении фоток
При конструировании URL’ов фоток
Балансирует нагрузку
Запись по логическим томам
Чтение по физическим томам
Определяет, кто будет отдавать: CDN или Cache
Помечает логические тома как read-only
Эксплуатационные причины
Нет свободного места
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 22 / 46
Архитектура Directory
Write-enabling
Новые Store доступны на запись
Только на такие машины добавляются фотки
Когда место на машине кончается — помечается
как read-only
Внимание!
Это влечёт определённые последствия.
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 23 / 46
Архитектура Directory
Устройство Directory
Хранит данные в реплицированной БД
Простой сервис на PHP
Использует memcached
Если теряем Store, то удаляем соответствующее
отображение и добавляем после замены машины
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 24 / 46
Архитектура Cache
Функции Cache
Получает HTTP-запросы от CDN и браузеров
DHT: ключ — id фотки
Если нет в кэше, то идёт на Store
Кэширует фотку только при выполнении двух
условий:
Запрос пришёл от пользователя, а не от CDN
CDN сам закэширует
Фотка загружена с write-enabled Store
Свежие фотки более популярны — прикрываем
write-enabled Store
ФС на Store лучше работает, когда либо чтение, либо
запись, но не смесь
Планируется push свежих фоток в Cache
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 25 / 46
Архитектура Store
Функции Store
Простой интерфейс — get, add, delete по <LV,
Photo>
На каждом Store множество PV
Каждый PV содержит миллионы фоток
PV — большой файл (100 ГБ)
/hay/haystack_<LV_id>
Получение имени файла, смещения и размера для
фотки не требует дисковых операций
Открытые файловые дескрипторы для каждого
PV
Отображение в памяти из id фотки в метаданные
(файл, смещение и размер)
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 26 / 46
Детали реализации Store-файл
Store-файл
Superblock
Последовательность needle
Needle — фотка
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 27 / 46
Детали реализации Store-файл
Формат
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 28 / 46
Детали реализации Store-файл
Поля needle
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 29 / 46
Детали реализации Store-файл
Индекс
In-memory
(key, alternate-key) -> (flags, size,
offset)
Store может перестроить индекс при сбое
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 30 / 46
Детали реализации Запросы
Запросы
Read
Write (Append)
Delete
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 31 / 46
Детали реализации Запросы
Read
Cache передаёт с запросом: LV_id, key,
alternate_key, cookie
cookie генерируется и сохраняется в Directory при
загрузке фотки
cookie защищает от атак с подбором URL’ов
Store извлекает метаданные
Если фотка не удалена, то читает needle с диска
Проверяет cookie и checksum
Возвращает фотку Cache
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 32 / 46
Детали реализации Запросы
Write
Web server передаёт с запросом: LV_id, key,
alternate_key, cookie и данные
Каждый Store синхронно дописывает фотку в
PV и обновляет индекс
Модификация фотки:
Либо в тот же LV с теми же key и alternate_key:
для Store больший offset — свежее версия
Либо в другой LV: Directory обновляет метаданные и
больше не читает старую фотку
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 33 / 46
Детали реализации Запросы
Delete
Store выставляет флаг в памяти и синхронно на
диске
Запросы на чтение всегда проверяют флаг
Фотка физически не удаляется
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 34 / 46
Детали реализации Index
Функции Index
Оптимизация при перезагрузке Store
Индекс для каждого тома
Индекс содержит superblock и индексные записи
Порядок индексных записей соответствует тому
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 35 / 46
Детали реализации Index
Формат
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 36 / 46
Детали реализации Index
Обновление
Write:
Синхронное дописывание needle в том
Асинхронное — в индекс
Delete:
Синхронно выставляется флаг в томе
Индекс не обновляется
Работает быстрее
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 37 / 46
Детали реализации Index
Проблемы
Needle есть, а индексной записи нет (orphan)
«Лечится» при перезапуске
Последняя запись в индексе — последний
non-orphan needle
Индексные записи не отражают факт удаления
При чтении всегда проверяется флаг deleted
Обновляется индекс в памяти
Cache уведомляется, что фотка удалена
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 38 / 46
Детали реализации Оптимизации
Compaction
Выбрасывание удалённых и дублирующихся
needles
Копирование в новый файл с пропуском мусора
В это время удаления идут в оба файла
Дошли до конца — блокируем исходный файл на
изменение и атомарно переключаемся
Интересное наблюдение
Свежие фотки удаляются чаще
25% фоток/год
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 39 / 46
Детали реализации Оптимизации
Оперативная память
20% экономии:
Вместо флагов у удалённых фоток offset равен 0
cookie не хранятся в памяти, а проверяются
каждый раз после чтения needle
В итоге
10 байт на фотку (в среднем) vs 536 байт на
xfs_inode_t
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 40 / 46
Детали реализации Оптимизации
Batch
Диски любят последовательную запись
Загрузка альбомов — основной случай
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 41 / 46
Заключение Нагрузка
Нагрузка
98% чтений — лента новостей и альбомы
Возраст 2 дня — резкий спад числа обращений
CDN и Cache довольно эффективны, но длинный
хвост
80% — Cache hit rate
Haystack отвечает на 10% нагрузки CDN
Загрузка каждой фотки — 12 needles (4 размера х
3 реплики)
См. стресс тесты в оригинальной статье1
1
Doug Beaver, Sanjeev Kumar, Harry C. Li, Jason Sobel, Peter Vajgel,
Facebook Inc. Finding a needle in Haystack: Facebook’s photo storage. 2010
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 42 / 46
Заключение Нагрузка
Распределение трафика
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 43 / 46
Заключение Нагрузка
Рассмотрели
Архитектура Haystack
Основные компоненты: Directory, Cache, Store
Интересные решения
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 44 / 46
Заключение Нагрузка
Уроки
Особенности реальной нагрузки
Во что упираетесь
KISS2
2
http://en.wikipedia.org/wiki/KISS_principle
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 45 / 46
Вопросы?
Вопросы?
https://polis.mail.ru/blog/view/111/
https://incubos.org/contacts/
Не забудьте про ДЗ
Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 46 / 46

More Related Content

What's hot

Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. LuceneVadim Tsesko
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
Vadim Tsesko
 
Базы данных. Cassandra
Базы данных. CassandraБазы данных. Cassandra
Базы данных. Cassandra
Vadim Tsesko
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
Ontico
 
Ubuntu и другие OpenSource-продукты в компании «Яндекс»
Ubuntu и другие  OpenSource-продукты в компании «Яндекс»Ubuntu и другие  OpenSource-продукты в компании «Яндекс»
Ubuntu и другие OpenSource-продукты в компании «Яндекс»syndicut
 
История успеха Яндекс.Почты
История успеха Яндекс.ПочтыИстория успеха Яндекс.Почты
История успеха Яндекс.Почты
dev1ant
 
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
Ontico
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Ontico
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
Ontico
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
Ontico
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
Nikolay Samokhvalov
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Ontico
 
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
Ontico
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Ontico
 
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Ontico
 
Поиск наизнанку
Поиск наизнанкуПоиск наизнанку
Поиск наизнанку
Nikolay Sivko
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Tanya Denisyuk
 
Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...
Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...
Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...
Ontico
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Ontico
 

What's hot (20)

Базы данных. Lucene
Базы данных. LuceneБазы данных. Lucene
Базы данных. Lucene
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
 
Базы данных. Cassandra
Базы данных. CassandraБазы данных. Cassandra
Базы данных. Cassandra
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
 
Ubuntu и другие OpenSource-продукты в компании «Яндекс»
Ubuntu и другие  OpenSource-продукты в компании «Яндекс»Ubuntu и другие  OpenSource-продукты в компании «Яндекс»
Ubuntu и другие OpenSource-продукты в компании «Яндекс»
 
История успеха Яндекс.Почты
История успеха Яндекс.ПочтыИстория успеха Яндекс.Почты
История успеха Яндекс.Почты
 
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
История успеха Яндекс.Почты с PostgreSQL / Владимир Бородин (Яндекс)
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
 
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
 
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
ClickHouse: очень быстро и очень удобно / Виктор Тарнавский, Алексей Миловидо...
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
 
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
Linux API с точки зрения разработчика веб-сервера / Валентин Бартенев (NGINX,...
 
Поиск наизнанку
Поиск наизнанкуПоиск наизнанку
Поиск наизнанку
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
 
Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...
Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...
Дешевле, надежнее, проще. Хранение петабайтов видео и фото в ОК / Александр Х...
 
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
Распределенные системы в Одноклассниках / Олег Анастасьев (Одноклассники)
 

Haystack

  • 1. Haystack «Использование баз данных» Цесько Вадим Александрович https://incubos.org @incubos 24 мая 2017 г. Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 1 / 46
  • 2. Содержание 1 Введение 2 Background 3 Архитектура 4 Детали реализации 5 Заключение Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 2 / 46
  • 3. Введение Материалы Материалы Doug Beaver, Sanjeev Kumar, Harry C. Li, Jason Sobel, Peter Vajgel, Facebook Inc. Finding a needle in Haystack: Facebook’s photo storage. 2010 Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 3 / 46
  • 4. Введение Мотивация Мотивация Зачем мы это рассматриваем: Промышленная внедрённая технология Логика проектирования Интересные проектные решения Просто интересно, как делают взрослые дядьки Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 4 / 46
  • 5. Введение Цифры Цифры На 2010 год: 65 млрд. оригинальных фоток 4х размера = 260 млрд. фоток = 20 ПБ +1 млрд. фоток (60 ТБ) каждую неделю 1 Mrps в пике В проде 2 года Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 5 / 46
  • 6. Введение Характер запросов Характер запросов Пишем — один раз Читаем — часто Никогда не перезаписываем Удаляем — редко Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 6 / 46
  • 7. Введение Основные цели Основные цели High throughput and low latency UGC, CDN, User Experience 1 поиск по диску максимум Микрометаданные в памяти Fault-tolerant UGC Георепликация Cost-effective $ / TB, read rps / TB $ / TB — на 28% меньше, read rps / TB — в 4 раза больше vs NAS Simple Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 7 / 46
  • 8. Background Типичная архитектура Путь запроса Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 8 / 46
  • 9. Background Типичная архитектура CDN Клиент получает URL от Web Server Идёт с URL’ом в CDN Если у CDN есть данные, то отдаёт Если нет, то идёт в Photo Storage и кэширует URL содержит необходимую CDN информацию Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 9 / 46
  • 10. Background NFS Главный урок CDN не подходит для социальных фотосервисов Эффективно раздаёт «горячие» фотки (профили и свежие) Длинный хвост (непопулярные и/или старые) Длинный хвост невозможно кэшировать Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 10 / 46
  • 11. Background NFS Путь запроса Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 11 / 46
  • 12. Background NFS Хранение фоток Каждая фотка в отдельном файле на коммерческом NAS Photo Store монтирует все разделы через NFS Photo Store из URL вынимает путь, читает файл по NFS и отдаёт CDN Проблемы Тысячи файлов в каждом каталоге Больше 10 дисковых операций на одну фотку Сотни файлов в каждом каталоге Больше 3 дисковых операций на одну фотку (метаданные каталога, inode, содержимое файла) Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 12 / 46
  • 13. Background NFS Оптимизации Кэш из имени файла в файловый дескриптор Пропатчили ядро — системный вызов open_by_filehandle Не сильно помогло на длинном хосте Вывод Кэш не всегда спасает Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 13 / 46
  • 14. Background NFS Альтернативы Из используемого в Facebook: Аналог GFS MySQL Hadoop ФС (inode — сотни байт на файл) Вывод Всё не очень подходит для длинного хвоста Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 14 / 46
  • 15. Архитектура Новая версия Новая версия CDN для популярных фоток (пока что) Haystack для длинного хвоста Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 15 / 46
  • 16. Архитектура Задача Задача Уменьшить нагрузку на диск Только необходимые операции Уменьшить расход памяти на метаданные Держать все метаданные в памяти Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 16 / 46
  • 17. Архитектура Подход Подход Haystack Огромные файлы с кучей фоток в каждом Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 17 / 46
  • 18. Архитектура Компоненты Компоненты Store Physical volume (на каждой машине 100 х 100 ГБ = 10 ТБ) Logical volume = Replica Set Directory Logical volume → Physical volume Фотка → Logical volume Logical volumes with free space Cache Прикрывает Store Защищает при перезапуске CDN Уменьшает зависимость от CDN Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 18 / 46
  • 19. Архитектура Компоненты Чтение фоток Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 19 / 46
  • 20. Архитектура Компоненты URL CDN URL http://<CDN>/<Cache>/<Store>/<LV, Photo> Браузер идёт на <CDN> CDN ищет у себя, используя <LV, Photo> Если не нашёл, отрезает <CDN> и идёт в <Cache> Cache ищет у себя, используя <LV, Photo> Если не нашёл, отрезает <CDN> и идёт в <Store> Direct URL http://<Cache>/<Store>/<LV, Photo> Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 20 / 46
  • 21. Архитектура Компоненты Добавление фоток Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 21 / 46
  • 22. Архитектура Directory Функции Directory Отображение из логических томов в физические При добавлении фоток При конструировании URL’ов фоток Балансирует нагрузку Запись по логическим томам Чтение по физическим томам Определяет, кто будет отдавать: CDN или Cache Помечает логические тома как read-only Эксплуатационные причины Нет свободного места Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 22 / 46
  • 23. Архитектура Directory Write-enabling Новые Store доступны на запись Только на такие машины добавляются фотки Когда место на машине кончается — помечается как read-only Внимание! Это влечёт определённые последствия. Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 23 / 46
  • 24. Архитектура Directory Устройство Directory Хранит данные в реплицированной БД Простой сервис на PHP Использует memcached Если теряем Store, то удаляем соответствующее отображение и добавляем после замены машины Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 24 / 46
  • 25. Архитектура Cache Функции Cache Получает HTTP-запросы от CDN и браузеров DHT: ключ — id фотки Если нет в кэше, то идёт на Store Кэширует фотку только при выполнении двух условий: Запрос пришёл от пользователя, а не от CDN CDN сам закэширует Фотка загружена с write-enabled Store Свежие фотки более популярны — прикрываем write-enabled Store ФС на Store лучше работает, когда либо чтение, либо запись, но не смесь Планируется push свежих фоток в Cache Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 25 / 46
  • 26. Архитектура Store Функции Store Простой интерфейс — get, add, delete по <LV, Photo> На каждом Store множество PV Каждый PV содержит миллионы фоток PV — большой файл (100 ГБ) /hay/haystack_<LV_id> Получение имени файла, смещения и размера для фотки не требует дисковых операций Открытые файловые дескрипторы для каждого PV Отображение в памяти из id фотки в метаданные (файл, смещение и размер) Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 26 / 46
  • 27. Детали реализации Store-файл Store-файл Superblock Последовательность needle Needle — фотка Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 27 / 46
  • 28. Детали реализации Store-файл Формат Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 28 / 46
  • 29. Детали реализации Store-файл Поля needle Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 29 / 46
  • 30. Детали реализации Store-файл Индекс In-memory (key, alternate-key) -> (flags, size, offset) Store может перестроить индекс при сбое Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 30 / 46
  • 31. Детали реализации Запросы Запросы Read Write (Append) Delete Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 31 / 46
  • 32. Детали реализации Запросы Read Cache передаёт с запросом: LV_id, key, alternate_key, cookie cookie генерируется и сохраняется в Directory при загрузке фотки cookie защищает от атак с подбором URL’ов Store извлекает метаданные Если фотка не удалена, то читает needle с диска Проверяет cookie и checksum Возвращает фотку Cache Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 32 / 46
  • 33. Детали реализации Запросы Write Web server передаёт с запросом: LV_id, key, alternate_key, cookie и данные Каждый Store синхронно дописывает фотку в PV и обновляет индекс Модификация фотки: Либо в тот же LV с теми же key и alternate_key: для Store больший offset — свежее версия Либо в другой LV: Directory обновляет метаданные и больше не читает старую фотку Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 33 / 46
  • 34. Детали реализации Запросы Delete Store выставляет флаг в памяти и синхронно на диске Запросы на чтение всегда проверяют флаг Фотка физически не удаляется Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 34 / 46
  • 35. Детали реализации Index Функции Index Оптимизация при перезагрузке Store Индекс для каждого тома Индекс содержит superblock и индексные записи Порядок индексных записей соответствует тому Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 35 / 46
  • 36. Детали реализации Index Формат Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 36 / 46
  • 37. Детали реализации Index Обновление Write: Синхронное дописывание needle в том Асинхронное — в индекс Delete: Синхронно выставляется флаг в томе Индекс не обновляется Работает быстрее Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 37 / 46
  • 38. Детали реализации Index Проблемы Needle есть, а индексной записи нет (orphan) «Лечится» при перезапуске Последняя запись в индексе — последний non-orphan needle Индексные записи не отражают факт удаления При чтении всегда проверяется флаг deleted Обновляется индекс в памяти Cache уведомляется, что фотка удалена Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 38 / 46
  • 39. Детали реализации Оптимизации Compaction Выбрасывание удалённых и дублирующихся needles Копирование в новый файл с пропуском мусора В это время удаления идут в оба файла Дошли до конца — блокируем исходный файл на изменение и атомарно переключаемся Интересное наблюдение Свежие фотки удаляются чаще 25% фоток/год Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 39 / 46
  • 40. Детали реализации Оптимизации Оперативная память 20% экономии: Вместо флагов у удалённых фоток offset равен 0 cookie не хранятся в памяти, а проверяются каждый раз после чтения needle В итоге 10 байт на фотку (в среднем) vs 536 байт на xfs_inode_t Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 40 / 46
  • 41. Детали реализации Оптимизации Batch Диски любят последовательную запись Загрузка альбомов — основной случай Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 41 / 46
  • 42. Заключение Нагрузка Нагрузка 98% чтений — лента новостей и альбомы Возраст 2 дня — резкий спад числа обращений CDN и Cache довольно эффективны, но длинный хвост 80% — Cache hit rate Haystack отвечает на 10% нагрузки CDN Загрузка каждой фотки — 12 needles (4 размера х 3 реплики) См. стресс тесты в оригинальной статье1 1 Doug Beaver, Sanjeev Kumar, Harry C. Li, Jason Sobel, Peter Vajgel, Facebook Inc. Finding a needle in Haystack: Facebook’s photo storage. 2010 Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 42 / 46
  • 43. Заключение Нагрузка Распределение трафика Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 43 / 46
  • 44. Заключение Нагрузка Рассмотрели Архитектура Haystack Основные компоненты: Directory, Cache, Store Интересные решения Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 44 / 46
  • 45. Заключение Нагрузка Уроки Особенности реальной нагрузки Во что упираетесь KISS2 2 http://en.wikipedia.org/wiki/KISS_principle Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 45 / 46
  • 46. Вопросы? Вопросы? https://polis.mail.ru/blog/view/111/ https://incubos.org/contacts/ Не забудьте про ДЗ Цесько В. А. (Технополис) Haystack 24 мая 2017 г. 46 / 46