SlideShare a Scribd company logo
1 of 46
Download to read offline
Haystack
«Использование баз данных»
Цесько Вадим Александрович
https://incubos.org
@incubos
16 мая 2018 г.
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 1 / 46
Содержание
1 Введение
2 Background
3 Архитектура
4 Детали реализации
5 Заключение
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 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 16 мая 2018 г. 3 / 46
Введение Мотивация
Мотивация
Зачем мы это рассматриваем:
Промышленная внедрённая технология
Логика проектирования
Интересные проектные решения
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 4 / 46
Введение Цифры
Цифры
На 2010 год:
65 млрд. оригинальных фоток
4х размера = 260 млрд. фоток = 20 ПБ
+1 млрд. фоток (60 ТБ) каждую неделю
1 Mrps в пике
В проде 2 года
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 5 / 46
Введение Характер запросов
Характер запросов
Пишем — один раз
Читаем — часто
Никогда не перезаписываем
Удаляем — редко
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 6 / 46
Введение Основные цели
Основные цели
High throughput and low latency
UGC, CDN, User Experience
1 поиск по диску максимум
Микрометаданные в памяти
Fault-tolerance
UGC
Георепликация
Cost-effectiveness
$ / TB, read rps / TB
$ / TB — на 28% меньше, read rps / TB — в 4 раза больше vs NAS
Simple
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 7 / 46
Background Типичная архитектура
Путь запроса
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 8 / 46
Background Типичная архитектура
CDN
Клиент получает URL от Web Server
Идёт с URL’ом в CDN
Если у CDN есть данные, то отдаёт
Если нет, то идёт в Photo Storage и кэширует
URL содержит необходимую CDN информацию
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 9 / 46
Background NFS
Главный урок
CDN не подходит для социальных фотосервисов
Эффективно раздаёт «горячие» фотки (профили и свежие)
Длинный хвост (непопулярные и/или старые)
Длинный хвост невозможно кэшировать
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 10 / 46
Background NFS
Путь запроса
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 11 / 46
Background NFS
Хранение фоток
Каждая фотка в отдельном файле на коммерческом NAS
Photo Store монтирует все разделы через NFS
Photo Store из URL вынимает путь, читает файл по NFS и отдаёт
CDN
Проблемы
Тысячи файлов в каждом каталоге
Больше 10 дисковых операций на одну фотку
Сотни файлов в каждом каталоге
Больше 3 дисковых операций на одну фотку (метаданные каталога,
inode, содержимое файла)
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 12 / 46
Background NFS
Оптимизации
Кэш из имени файла в файловый дескриптор
Пропатчили ядро — системный вызов open_by_filehandle
Не сильно помогло на длинном хосте
Вывод
Кэш не всегда спасает
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 13 / 46
Background NFS
Альтернативы
Из используемого в Facebook:
Аналог GFS
MySQL
Hadoop
ФС (inode — сотни байт на файл)
Вывод
Всё не очень подходит для длинного хвоста
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 14 / 46
Архитектура Новая версия
Новая версия
CDN для популярных фоток (пока что)
Haystack для длинного хвоста
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 15 / 46
Архитектура Задача
Задача
Уменьшить нагрузку на диск
Только необходимые операции
Уменьшить расход памяти на метаданные
Держать все метаданные в памяти
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 16 / 46
Архитектура Подход
Подход
Haystack
Огромные файлы с кучей фоток в каждом
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 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 16 мая 2018 г. 18 / 46
Архитектура Компоненты
Чтение фоток
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 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 16 мая 2018 г. 20 / 46
Архитектура Компоненты
Добавление фоток
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 21 / 46
Архитектура Directory
Функции Directory
Отображение из логических томов в физические
При добавлении фоток
При конструировании URL’ов фоток
Балансирует нагрузку
Запись по логическим томам
Чтение по физическим томам
Определяет, кто будет отдавать: CDN или Cache
Помечает логические тома как read-only
Эксплуатационные причины
Нет свободного места
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 22 / 46
Архитектура Directory
Write-enabling
Новые Store доступны на запись
Только на такие машины добавляются фотки
Когда место на машине кончается — помечается как read-only
Внимание!
Это влечёт определённые последствия.
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 23 / 46
Архитектура Directory
Устройство Directory
Хранит данные в реплицированной БД
Простой сервис на PHP
Использует memcached
Если теряем Store, то удаляем соответствующее отображение и
добавляем после замены машины
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 24 / 46
Архитектура Cache
Функции Cache
Получает HTTP-запросы от CDN и браузеров
DHT: ключ — id фотки
Если нет в кэше, то идёт на Store
Кэширует фотку только при выполнении двух условий:
Запрос пришёл от пользователя, а не от CDN
CDN сам закэширует
Фотка загружена с write-enabled Store
Свежие фотки более популярны — прикрываем write-enabled Store
ФС на Store лучше работает, когда либо чтение, либо запись, но не смесь
Планируется push свежих фоток в Cache
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 25 / 46
Архитектура Store
Функции Store
Простой интерфейс — get, add, delete по <LV, Photo>
На каждом Store множество PV
Каждый PV содержит миллионы фоток
PV — большой файл (100 ГБ) /hay/haystack_<LV_id>
Получение имени файла, смещения и размера для фотки не
требует дисковых операций
Открытые файловые дескрипторы для каждого PV
Отображение в памяти из id фотки в метаданные (файл,
смещение и размер)
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 26 / 46
Детали реализации Store-файл
Store-файл
Superblock
Последовательность needle
Needle — фотка
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 27 / 46
Детали реализации Store-файл
Формат
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 28 / 46
Детали реализации Store-файл
Поля needle
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 29 / 46
Детали реализации Store-файл
Индекс
In-memory
(key, alternate-key) -> (flags, size, offset)
Store может перестроить индекс при сбое
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 30 / 46
Детали реализации Запросы
Запросы
Read
Write (Append)
Delete
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 31 / 46
Детали реализации Запросы
Read
Cache передаёт с запросом: LV_id, key, alternate_key, cookie
cookie генерируется и сохраняется в Directory при загрузке фотки
cookie защищает от атак с подбором URL’ов
Store извлекает метаданные
Если фотка не удалена, то читает needle с диска
Проверяет cookie и checksum
Возвращает фотку Cache
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 32 / 46
Детали реализации Запросы
Write
Web server передаёт с запросом: LV_id, key, alternate_key,
cookie и данные
Каждый Store синхронно дописывает фотку в PV и обновляет
индекс
Модификация фотки:
Либо в тот же LV с теми же key и alternate_key: для Store больший
offset — свежее версия
Либо в другой LV: Directory обновляет метаданные и больше не читает
старую фотку
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 33 / 46
Детали реализации Запросы
Delete
Store выставляет флаг в памяти и синхронно на диске
Запросы на чтение всегда проверяют флаг
Фотка физически не удаляется
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 34 / 46
Детали реализации Index
Функции Index
Оптимизация при перезагрузке Store
Индекс для каждого тома
Индекс содержит superblock и индексные записи
Порядок индексных записей соответствует тому
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 35 / 46
Детали реализации Index
Формат
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 36 / 46
Детали реализации Index
Обновление
Write:
Синхронное дописывание needle в том
Асинхронное — в индекс
Delete:
Синхронно выставляется флаг в томе
Индекс не обновляется
Работает быстрее
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 37 / 46
Детали реализации Index
Проблемы
Needle есть, а индексной записи нет (orphan)
«Лечится» при перезапуске
Последняя запись в индексе — последний non-orphan needle
Индексные записи не отражают факт удаления
При чтении всегда проверяется флаг deleted
Обновляется индекс в памяти
Cache уведомляется, что фотка удалена
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 38 / 46
Детали реализации Оптимизации
Compaction
Выбрасывание удалённых и дублирующихся needles
Копирование в новый файл с пропуском мусора
В это время удаления идут в оба файла
Дошли до конца — блокируем исходный файл на изменение и
атомарно переключаемся
Интересное наблюдение
Свежие фотки удаляются чаще
25% фоток/год
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 39 / 46
Детали реализации Оптимизации
Оперативная память
20% экономии:
Вместо флагов у удалённых фоток offset равен 0
cookie не хранятся в памяти, а проверяются каждый раз после
чтения needle
В итоге
10 байт на фотку (в среднем) vs 536 байт на xfs_inode_t
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 40 / 46
Детали реализации Оптимизации
Batch
Диски любят последовательную запись
Загрузка альбомов — основной случай
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 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 16 мая 2018 г. 42 / 46
Заключение Нагрузка
Распределение трафика
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 43 / 46
Заключение Нагрузка
Рассмотрели
Архитектура Haystack
Основные компоненты: Directory, Cache, Store
Интересные решения
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 44 / 46
Заключение Нагрузка
Уроки
Особенности реальной нагрузки
Во что упираетесь
KISS2
2
http://en.wikipedia.org/wiki/KISS_principle
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 45 / 46
Вопросы?
Вопросы?
https:
//polis.mail.ru/curriculum/program/discipline/604/
https://incubos.org/contacts/
Не забудьте про ДЗ
Цесько В. А. (Технополис) Haystack 16 мая 2018 г. 46 / 46

More Related Content

What's hot

Базы данных. Cassandra
Базы данных. CassandraБазы данных. Cassandra
Базы данных. CassandraVadim Tsesko
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicVadim Tsesko
 
CAP теорема. Протокол Raft.
CAP теорема. Протокол Raft.CAP теорема. Протокол Raft.
CAP теорема. Протокол Raft.Vadim Tsesko
 
Базы данных. Distributed Commit
Базы данных. Distributed CommitБазы данных. Distributed Commit
Базы данных. Distributed CommitVadim Tsesko
 
Вячеслав Бахмутов
Вячеслав БахмутовВячеслав Бахмутов
Вячеслав БахмутовCodeFest
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозитElena Kotina
 
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Nikolay Samokhvalov
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...Ontico
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)Ontico
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...Ontico
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Ontico
 
История успеха Яндекс.Почты
История успеха Яндекс.ПочтыИстория успеха Яндекс.Почты
История успеха Яндекс.Почтыdev1ant
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Ontico
 
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)Ontico
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Ontico
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)Nikolay Samokhvalov
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на SphinxRoman Pavlushko
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Ontico
 

What's hot (20)

Базы данных. Cassandra
Базы данных. CassandraБазы данных. Cassandra
Базы данных. Cassandra
 
Реактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/musicРеактивный раздатчик ok.ru/music
Реактивный раздатчик ok.ru/music
 
CAP теорема. Протокол Raft.
CAP теорема. Протокол Raft.CAP теорема. Протокол Raft.
CAP теорема. Протокол Raft.
 
Базы данных. Distributed Commit
Базы данных. Distributed CommitБазы данных. Distributed Commit
Базы данных. Distributed Commit
 
Вячеслав Бахмутов
Вячеслав БахмутовВячеслав Бахмутов
Вячеслав Бахмутов
 
Android: Как написать приложение, которое не тормозит
Android: Как  написать приложение, которое не тормозитAndroid: Как  написать приложение, которое не тормозит
Android: Как написать приложение, которое не тормозит
 
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
Владимир Бородин: Как спать спокойно - 2015.10.14 PostgreSQLRussia.org meetu...
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
 
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт... Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
Архитектура растущего проекта на примере ВКонтакте / Алексей Акулович (ВКонт...
 
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
Внутреннее устройство PostgreSQL: временные таблицы и фрагментация памяти / Г...
 
История успеха Яндекс.Почты
История успеха Яндекс.ПочтыИстория успеха Яндекс.Почты
История успеха Яндекс.Почты
 
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
Flashcache в mamba.ru / Яковлев Александр Юрьевич (ЗАО Мамба)
 
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
Опыт миграции между дата-центрами / Михаил Тюрин, Сергей Бурладян (Avito)
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
Avito Stachka 2012
Avito Stachka 2012Avito Stachka 2012
Avito Stachka 2012
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
 
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
 
Нагруженный поиск на Sphinx
Нагруженный поиск на SphinxНагруженный поиск на Sphinx
Нагруженный поиск на Sphinx
 
Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)Хранение данных на виниле / Константин Осипов (tarantool.org)
Хранение данных на виниле / Константин Осипов (tarantool.org)
 

Technopolis.NoSQL 03 Haystack

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