Алексей Захаров "Архитектура Яндекс.Фоток"
DESCRIPTION
Яндекс.Фотки – современный фотохостинг. В докладе идет речь об общих архитектурных принципах его построения, загрузке и обработке фотографий, механизме распределенного выполнения заданий, API для взаимодействия с внешним миром.TRANSCRIPT
![Page 1: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/1.jpg)
Я.Субботник, Москва, 28 июля 2012 года
Руководитель группы серверной разработки Алексей Захаров
Архитектура Яндекс.Фоток
![Page 2: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/2.jpg)
Яндекс.Фотки -‐ это
— Один из крупнейших фотохостингов рунета — Хранение оригиналов, неограниченное пространство — Более 270 млн фотографий — Каждый день более:
§ миллиона уникальных посетителей § одиннадцати миллионнов кликов § 300 тысяч новых фоток
— Backend: в среднем > 2000 RPS
2
![Page 3: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/3.jpg)
Технологии в крупную клетку — Frontend: Xscript (XSL-‐шаблонизатор), Nginx
— Backend: Java; Spring, Jeoy
— Базы Данных: Mysql, MongoDb
— Собственный сторадж для хранения изображений
— Собственный распределённый scheduler
3
![Page 4: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/4.jpg)
Загрузка фотки
4
![Page 5: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/5.jpg)
Загрузка
5
![Page 6: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/6.jpg)
Загрузка: основы
— HTTP POST, mul�part/form-‐data
— Клиент загрузчика на Flash и JS
— HTTP сервер Jeoy
— Несколько загрузчиков в разных датацентрах
6
![Page 7: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/7.jpg)
Выбор загрузчика
7
ZooKeeper!
![Page 8: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/8.jpg)
Выбор загрузчика
8
Up1 Up2 Up3 Up4 Up5
ZooKeeper
![Page 9: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/9.jpg)
ImageMagick
Загрузка: нарезка скриншотов
convert -limit thread 1 $FILE -print 'orig-format:%m\norig-size:%wx%h\n%[EXIF:*]' -rotate 90 '(' +clone +profile '!icm,!icc,*' -resize '500x346!' -unsharp 0.61x0.43+1.0+0.005 -quality 93 -write jpeg:/Users/ayza/tmp/L -print 'L:%wx%h\n' ')' '(' +clone +profile '!icm,!icc,*' -resize '300x208!' -unsharp 0.61x0.43+1.0+0.005 -quality 93 -write jpeg:/Users/ayza/tmp/M -print 'M:%wx%h\n' +delete ')' '(' +clone +profile '!icm,!icc,*' -resize '150x104!' -unsharp 1.1x0.9+1.0+0.005 -quality 93 -write jpeg:/Users/ayza/tmp/S -print 'S:%wx%h\n' +delete ')’ '(' +clone +profile '!icm,!icc,*' -resize '100x69!' -unsharp 1.1x0.9+1.0+0.005 -quality 93 -write jpeg:/Users/ayza/tmp/XS -print 'XS:%wx%h\n' +delete ')’ '(' +clone +profile '!icm,!icc,*' -resize '75x75^' -gravity center -extent 75x75 -unsharp 1.1x0.9+1.0+0.005 -quality 93 -write jpeg:/Users/ayza/tmp/XXS -print 'XXS:%wx%h\n' +delete ')’ '(' +clone +profile '!icm,!icc,*' -resize '50x50^' -gravity center -extent 50x50 -unsharp 1.1x0.9+1.0+0.005 -quality 93 -write jpeg:/Users/ayza/tmp/XXXS -print 'XXXS:%wx%h\n' +delete ')' null:
9
![Page 10: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/10.jpg)
Разбор метаинформации
— Метаинформация из mul�part: название, описание, теги, имя файла, гео-‐координаты
— Из EXIF: ориентация, гео-‐координаты, теги, название
— Агрегация всего и создание записи в БД
10
![Page 11: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/11.jpg)
Хранение метаинформации
— Старый добрый MySql
— Шардирование на уровне приложения: каждый пользователь приписан определённому шарду
— Партицирование. Борьба c большим размером индексов.
— Общие для всех данные – в отдельной базе
11
![Page 12: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/12.jpg)
Шардирование и партицирование
12
![Page 13: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/13.jpg)
Отказоустойчивость — Система нескольких датацентров
— У каждой базы – мастер и реплики в разных датацентрах
— При выходе из строя датацентра сервис переходит в режим частичного read-‐only
— Учитывается, что часть пользователей может находиться в read-‐only
— Минимизация видимых эффектов read-‐only
— Движение в сторону систем с mul�-‐master репликацией
13
![Page 14: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/14.jpg)
Другие доклады
Отказоустойчивость
— Павел Пушкарёв: "Отказоустойчивость сервисов”, hop://download.yandex.ru/company/experience/subbotnik/piter_pushkarev.pdf
— Екатерина Войденко: "Горизонтальное маcштабирование MySql”, hop://clubs.ya.ru/yasubbotnik/replies.xml?item_no=274
14
![Page 15: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/15.jpg)
Сторадж – что это?
15
![Page 16: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/16.jpg)
Сторадж
— Оптимизирован для хранения файлов
— Основан на файловой системе
— Простой HTTP-‐протокол доступа
— Данные хранятся в двух экземплярх в разных датацентрах
16
![Page 17: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/17.jpg)
Сторадж
— Прозрачный доступ к данным через специальные proxy-‐сервера
— Простая и надёжная схема
— Разработан внутри Яндекса
17
![Page 18: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/18.jpg)
Показ фотки
18
![Page 19: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/19.jpg)
Страница просмотра фотки
19
![Page 20: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/20.jpg)
Всё как у людей Формирование HTML-‐страницы
— Frontend: разбор запроса, выстраивание цепочки вызовов backend’ов
— Backend: взаимодействие с БД, обработка данных, формирование XML-‐ответа
— Frontend: сбор ответов с backend’ов, наложение XSL, формирование итоговой HTML-‐разметки
— Сторадж: отдача фоток по прямым URL
20
![Page 21: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/21.jpg)
Получение фотки со стораджа
— Запрос приходит на proxy, из URL однозначно определяет номер стораджа
— Прокси делает запрос на доступные копии стораджа
— Сторадж по URL определяет номер диска, директорию и имя файла
— Прокси проксирует через себя ответ сторджа и отдаёт пользователю
21
http://img-fotki.yandex.ru/get/6601/161556715.1c/0_7e678_a7812eef_XL
![Page 22: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/22.jpg)
Прокси и стораджа
22
Proxy01f Proxy02g
Storage01e
Storage01f
Storage03g
Storage03f
Storage05g
Storage05e
![Page 23: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/23.jpg)
Механизм асинхронного выполнения заданий
23
![Page 24: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/24.jpg)
Scheduler
24
![Page 25: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/25.jpg)
Задачи по расписанию Scheduler
— Выбор фото дня
— Подготовка данных для голосования
— Составление ленты новых интересных
— Экспорты в картинки, в карты
25
![Page 26: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/26.jpg)
Одноразовые задачи Scheduler
— Удаление фоток альбома
— Пересчёт счётчиков
— Распознавание лиц
— Перестроение облака тегов
— Отсылка почтовых сообщений
26
![Page 27: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/27.jpg)
Что внутри Scheduler
— ZooKeeper: выбор мастер-‐worker’а, проверка работоспособности, балансировка
— MongoDb: хранение параметров задач
— Actor поверх neoy: передача параметров задачи на конкретный worker и чтение результатов
27
![Page 28: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/28.jpg)
Scheduler
28
ZooKeeper
Worker3
Worker2
Worker1
MongoDb
![Page 29: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/29.jpg)
Внешнее API Фоток
29
![Page 30: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/30.jpg)
Внешнее API
— Другой вид frontend’а
— Отдельное приложение на Python & Django
— Используется выдача обычных backend’ов
— Выходные форматы: ATOM и JSON
— Стабильное, обратная совместимость
30
![Page 31: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/31.jpg)
Что можно делать Внешнее API
— Получать информацию о конкретной фотке
— Получать список фоток в альбоме, список альбомов
— Изменять информацию о конкретной фотке
— Загружать новые фотки
— Получать коллекции фоток дня, популярных, свежих & интересных
— Подробнее: hop://api.yandex.ru/fotki/
31
![Page 32: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/32.jpg)
Пример JSON выдачи
32
![Page 33: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/33.jpg)
Пример использования
33
![Page 34: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/34.jpg)
hap://fotker.fdzn.net/
Пример использования
34
![Page 35: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/35.jpg)
Немного цифр напоследок
— Frontend: 25 серверов Intel Xeon, 8-‐12 ядра
— Backend: 25 серверов Intel Xeon, 8-‐12 ядра
— API: 8 серверов по 8 ядер
— Загрузчики: 8 серверов по 8 ядер
— Стораджа: 72 сервера Xeon по 4-‐12 ядра; на каждом 15-‐30 дисков объёмом 500Гб – 2Тб
— MySql: 62 сервера 8-‐12 ядер, 48-‐96 Гб ОЗУ
35
![Page 36: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/36.jpg)
Всё!
36
![Page 37: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/37.jpg)
Вопросы?
37
![Page 38: Алексей Захаров "Архитектура Яндекс.Фоток"](https://reader035.vdocuments.mx/reader035/viewer/2022081720/557f148cd8b42ad03e8b470b/html5/thumbnails/38.jpg)
Руководитель группы серверной разработки Яндекс.Фоток
ayza@yandex-‐team.ru
Алексей Захаров