2013 10 14_lectire_07-haystack

1,459 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,459
On SlideShare
0
From Embeds
0
Number of Embeds
1,002
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

2013 10 14_lectire_07-haystack

  1. 1. Haystack Курс «Базы данных» Цесько Вадим Александрович http://incubos.org @incubos Computer Science Center 14 октября 2013 г. Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 1 / 53
  2. 2. Содержание 1 Введение 2 Background 3 Архитектура 4 Детали реализации 5 Заключение 6 Домашнее задание Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 2 / 53
  3. 3. Введение Материалы Материалы Doug Beaver, Sanjeev Kumar, Harry C. Li, Jason Sobel, Peter Vajgel, Facebook Inc. Finding a needle in Haystack: Facebook’s photo storage. 2010 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 3 / 53
  4. 4. Введение Мотивация Мотивация Зачем мы это рассматриваем: Промышленная внедрённая технология Логика проектирования Интересные проектные решения Просто интересно, как делают взрослые дядьки Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 4 / 53
  5. 5. Введение Цифры Цифры На 2010 год: 65 млрд. оригинальных фоток 4х размера = 260 млрд. фоток = 20 ПБ +1 млрд. фоток (60 ТБ) каждую неделю 1 Mrps в пике В проде 2 года Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 5 / 53
  6. 6. Введение Характер запросов Характер запросов Пишем — один раз Читаем — часто Никогда не перезаписываем Удаляем — редко Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 6 / 53
  7. 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 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 7 / 53
  8. 8. Background Типичная архитектура Путь запроса Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 8 / 53
  9. 9. Background Типичная архитектура CDN Клиент получает URL от Web Server Идёт с URL’ом в CDN Если у CDN есть данные, то отдаёт Если нет, то идёт в Photo Storage и кэширует URL содержит необходимую CDN информацию Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 9 / 53
  10. 10. Background NFS Главный урок CDN не подходит для социальных фотосервисов Эффективно раздаёт «горячие» фотки (профили и свежие) Длинный хвост (непопулярные и/или старые) Длинный хвост невозможно кэшировать Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 10 / 53
  11. 11. Background NFS Путь запроса Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 11 / 53
  12. 12. Background NFS Хранение фоток Каждая фотка в отдельном файле на коммерческом NAS Photo Store монтирует все разделы через NFS Photo Store из URL вынимает путь, читает файл по NFS и отдаёт CDN Проблемы Тысячи файлов в каждом каталоге Больше 10 дисковых операций на одну фотку Сотни файлов в каждом каталоге Больше 3 дисковых операций на одну фотку (метаданные каталога, inode, содержимое файла) Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 12 / 53
  13. 13. Background NFS Оптимизации Кэш из имени файла в файловый дескриптор Пропатчили ядро — системный вызов open_by_filehandle Не сильно помогло на длинном хосте Вывод Кэш не всегда спасает Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 13 / 53
  14. 14. Background NFS Альтернативы Из используемого в Facebook: Аналог GFS MySQL Hadoop ФС (inode — сотни байт на файл) Вывод Всё не очень подходит для длинного хвоста Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 14 / 53
  15. 15. Архитектура Новая версия Новая версия CDN для популярных фоток (пока что) Haystack для длинного хвоста Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 15 / 53
  16. 16. Архитектура Задача Задача Уменьшить нагрузку на диск Только необходимые операции Уменьшить расход памяти на метаданные Держать все метаданные в памяти Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 16 / 53
  17. 17. Архитектура Подход Подход Haystack Огромные файлы с кучей фоток в каждом Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 17 / 53
  18. 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 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 18 / 53
  19. 19. Архитектура Компоненты Чтение фоток Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 19 / 53
  20. 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> Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 20 / 53
  21. 21. Архитектура Компоненты Добавление фоток Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 21 / 53
  22. 22. Архитектура Directory Функции Directory Отображение из логических томов в физические При добавлении фоток При конструировании URL’ов фоток Балансирует нагрузку Запись по логическим томам Чтение по физическим томам Определяет, кто будет отдавать: CDN или Cache Помечает логические тома как read-only Эксплуатационные причины Нет свободного места Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 22 / 53
  23. 23. Архитектура Directory Write-enabling Новые Store доступны на запись Только на такие машины добавляются фотки Когда место на машине кончается — помечается как read-only Внимание! Это влечёт определённые последствия Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 23 / 53
  24. 24. Архитектура Directory Устройство Directory Хранит данные в реплицированной БД Простой сервис на PHP Использует memcached Если теряем Store, то удаляем соответствующее отображение и добавляем после замены машины Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 24 / 53
  25. 25. Архитектура Cache Функции Cache Получает HTTP-запросы от CDN и браузеров DHT: ключ — id фотки Если нет в кэше, то идёт на Store Кэширует фотку только при выполнении двух условий: Запрос пришёл от пользователя, а не от CDN CDN сам закэширует Фотка загружена с write-enabled Store Свежие фотки более популярны — прикрываем write-enabled Store ФС на Store лучше работает, когда либо чтение, либо запись, но не смесь Планируется push свежих фоток в Cache Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 25 / 53
  26. 26. Архитектура Store Функции Store Простой интерфейс — get, add, delete по <LV, Photo> На каждом Store множество PV Каждый PV содержит миллионы фоток PV — большой файл (100 ГБ) /hay/haystack_<LV_id> Получение имени файла, смещению и размера для фотки не требует дисковых операций Открытые файловые дескрипторы для каждого PV Отображение в памяти из id фотки в метаданные (файл, смещение и размер) Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 26 / 53
  27. 27. Детали реализации Store-файл Store-файл Superblock Последовательность needle Needle — фотка Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 27 / 53
  28. 28. Детали реализации Store-файл Формат Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 28 / 53
  29. 29. Детали реализации Store-файл Поля needle Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 29 / 53
  30. 30. Детали реализации Store-файл Индекс In-memory (key, alternate-key) -> (flags, size, offset) Store может перестроить индекс при сбое Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 30 / 53
  31. 31. Детали реализации Запросы Запросы Read Write (Append) Delete Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 31 / 53
  32. 32. Детали реализации Запросы Read Cache передаёт с запросом: LV_id, key, alternate_key, cookie cookie генерируется и сохраняется в Directory при загрузке фотки cookie защищает от атак с подбором URL’ов Store извлекает метаданные Если фотка не удалена, то читает needle с диска Проверяет cookie и checksum Возвращает фотку Cache Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 32 / 53
  33. 33. Детали реализации Запросы Write Web server передаёт с запросом: LV_id, key, alternate_key, cookie и данные Каждый Store синхронно дописывает фотку в PV и обновляет индекс Модификация фотки: Либо в тот же LV с теми же key и alternate_key: для Store больший offset — свежее версия Либо в другой LV: Directory обновляет метаданные и больше не читает старую фотку Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 33 / 53
  34. 34. Детали реализации Запросы Delete Store выставляет флаг в памяти и синхронно на диске Запросы на чтение всегда проверяют флаг Фотка физически не удаляется Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 34 / 53
  35. 35. Детали реализации Index Функции Index Оптимизация при перезагрузке Store Индекс для каждого тома Индекс содержит superblock и индексные записи Порядок индексных записей соответствует тому Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 35 / 53
  36. 36. Детали реализации Index Формат Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 36 / 53
  37. 37. Детали реализации Index Обновление Write: Синхронное дописывание needle в том Асинхронное — в индекс Delete: Синхронно выставляется флаг в томе Индекс не обновляется Работает быстрее Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 37 / 53
  38. 38. Детали реализации Index Проблемы Needle есть, а индексной записи нет (orphan) «Лечится» при перезапуске Последняя запись в индексе — последний non-orphan needle Индексные записи не отражают факт удаления При чтении всегда проверяется флаг deleted Обновляется индекс в памяти Cache уведомляется, что фотка удалена Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 38 / 53
  39. 39. Детали реализации Оптимизации Compaction Выбрасывание удалённых и дублирующихся needles Копирование в новый файл с пропуском мусора В это время удаления идут в оба файла Дошли до конца — блокируем исходный файл на изменение и атомарно переключаемся Интересное наблюдение Свежие фотки удаляются чаще 25% фоток/год Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 39 / 53
  40. 40. Детали реализации Оптимизации Оперативная память 20% экономии: Вместо флагов у удалённых фоток offset равен 0 cookie не хранятся в памяти, а проверяются каждый раз после чтения needle В итоге 10 байт на фотку (в среднем) vs 536 байт на xfs_inode_t Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 40 / 53
  41. 41. Детали реализации Оптимизации Batch Диски любят последовательную запись Загрузка альбомов — основной случай Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 41 / 53
  42. 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 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 42 / 53
  43. 43. Заключение Нагрузка Распределение трафика Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 43 / 53
  44. 44. Заключение Нагрузка Рассмотрели Архитектура Haystack Основные компоненты: Directory, Cache, Store Интересные решения Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 44 / 53
  45. 45. Заключение Нагрузка Уроки Особенности реальной нагрузки Во что упираетесь KISS2 2 http://en.wikipedia.org/wiki/KISS_principle Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 45 / 53
  46. 46. Домашнее задание Промежуточные итоги Промежуточные итоги Студент FR0 FR1 FR2 Бакрадзе Л. Грязнов С. ? Егоров Д. Ершов В. Королёв Д. ? Суворов Е. Толстопятов В. ? Фёдоров К. Хомутов В. ? Шашкова Е. Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 46 / 53
  47. 47. Домашнее задание Feature Requests Feature Requests FR FR1 FR2 FR3 FR4 FR5 FR6 FR7 14.10 21.10 28.10 04.11 11.11 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 47 / 53
  48. 48. Домашнее задание Feature Requests FR5: Compaction Развитие FR1 Размер на диске не больше чем 2х Автоматический запуск Ручной запуск Логи Тесты Сгорает — 2013-10-28 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 48 / 53
  49. 49. Домашнее задание Feature Requests FR6: Migration Развитие FR4 Автоматическая балансировка при добавлении узла Ручная балансировка при удалении узла Возможность смотреть и редактировать кольцо Логи Тесты Сгорает — 2013-11-04 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 49 / 53
  50. 50. Домашнее задание Feature Requests FR7: Replication Развитие FR4 Репликация по кольцу Клиент задаёт количество нод при записи/чтении Тесты Сгорает — 2013-11-11 Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 50 / 53
  51. 51. Домашнее задание Общее Общее Внятные сообщения при коммитах Указывайте FR в коммитах, README и/или issue README3 : форматы, API, структура и т. д. INSTALL: сборка клиента и сервера, конфигурация и примеры, запуск и т. д. Добавьте пользователя https://github.com/Gabol Задавайте вопросы: в комментариях к FR4 , в issues, в почте или лично Пишите логи, например: slf4j-api + logback 3 4 http://en.wikipedia.org/wiki/Markdown http://incubos.org Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 51 / 53
  52. 52. Домашнее задание Тулзы Тулзы IntelliJ IDEA Community Edition5 .idea, *.ipr, *.iml, *.iws, *.dat в .gitignore Для SBT есть плагин sbt-idea 5 http://www.jetbrains.com/idea/free_java_ide.html Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 52 / 53
  53. 53. Вопросы? Вопросы? http://incubos.org/contacts/ Общие вопросы — в Twitter: @incubos Вопросы по лекциям — в комментариях: http://incubos.org/blog/ Частные вопросы — в почту vadim.tsesko@gmail.com Цесько В. А. (CompSciCenter) Haystack 14 октября 2013 г. 53 / 53

×