Алексей Захаров "Архитектура Яндекс.Фоток"

38
Я.Субботник, Москва, 28 июля 2012 года Руководитель группы серверной разработки Алексей Захаров Архитектура Яндекс.Фоток

Upload: yandex

Post on 16-Jun-2015

1.246 views

Category:

Technology


0 download

DESCRIPTION

Яндекс.Фотки – современный фотохостинг. В докладе идет речь об общих архитектурных принципах его построения, загрузке и обработке фотографий, механизме распределенного выполнения заданий, API для взаимодействия с внешним миром.

TRANSCRIPT

Page 1: Алексей Захаров "Архитектура Яндекс.Фоток"

Я.Субботник,  Москва,  28  июля  2012  года  

Руководитель  группы  серверной  разработки  Алексей  Захаров  

Архитектура  Яндекс.Фоток  

Page 2: Алексей Захаров "Архитектура Яндекс.Фоток"

   

Яндекс.Фотки  -­‐  это  

—  Один  из  крупнейших  фотохостингов  рунета  —  Хранение  оригиналов,    неограниченное  пространство  —  Более  270  млн  фотографий  —  Каждый  день  более:  

§  миллиона  уникальных  посетителей  §  одиннадцати  миллионнов  кликов  §  300  тысяч  новых  фоток  

—  Backend:  в  среднем  >  2000  RPS  

2  

Page 3: Алексей Захаров "Архитектура Яндекс.Фоток"

   

Технологии  в  крупную  клетку    —  Frontend:  Xscript  (XSL-­‐шаблонизатор),  Nginx  

—  Backend:  Java;  Spring,  Jeoy  

—  Базы  Данных:  Mysql,  MongoDb  

—  Собственный  сторадж  для  хранения  изображений    

—  Собственный  распределённый  scheduler  

3  

Page 4: Алексей Захаров "Архитектура Яндекс.Фоток"

Загрузка  фотки  

4  

Page 5: Алексей Захаров "Архитектура Яндекс.Фоток"

Загрузка  

5  

Page 6: Алексей Захаров "Архитектура Яндекс.Фоток"

   

Загрузка:  основы  

—  HTTP  POST,  mul�part/form-­‐data  

—  Клиент  загрузчика  на  Flash  и  JS  

—  HTTP  сервер  Jeoy  

—  Несколько  загрузчиков  в  разных  датацентрах  

 

6  

Page 7: Алексей Захаров "Архитектура Яндекс.Фоток"

Выбор  загрузчика  

7  

ZooKeeper!  

Page 8: Алексей Захаров "Архитектура Яндекс.Фоток"

Выбор  загрузчика  

8  

Up1   Up2   Up3   Up4   Up5  

ZooKeeper  

Page 9: Алексей Захаров "Архитектура Яндекс.Фоток"

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: Алексей Захаров "Архитектура Яндекс.Фоток"

   

Разбор  метаинформации  

—  Метаинформация  из  mul�part:  название,  описание,  теги,  имя  файла,  гео-­‐координаты  

—  Из  EXIF:  ориентация,  гео-­‐координаты,  теги,  название  

—  Агрегация  всего  и  создание  записи  в  БД  

10  

Page 11: Алексей Захаров "Архитектура Яндекс.Фоток"

       

Хранение  метаинформации  

—  Старый  добрый  MySql  

—  Шардирование  на  уровне  приложения:  каждый  пользователь  приписан  определённому  шарду  

—  Партицирование.  Борьба  c  большим  размером  индексов.  

—  Общие  для  всех  данные  –  в  отдельной  базе  

11  

Page 12: Алексей Захаров "Архитектура Яндекс.Фоток"

       

Шардирование  и  партицирование  

12  

Page 13: Алексей Захаров "Архитектура Яндекс.Фоток"

   

Отказоустойчивость  —  Система  нескольких  датацентров  

—  У  каждой  базы  –  мастер  и  реплики  в  разных  датацентрах  

—  При  выходе  из  строя  датацентра  сервис  переходит  в  режим  частичного  read-­‐only  

—  Учитывается,  что  часть  пользователей  может  находиться  в  read-­‐only  

—  Минимизация  видимых  эффектов  read-­‐only  

—  Движение  в  сторону  систем  с  mul�-­‐master  репликацией  

13  

Page 14: Алексей Захаров "Архитектура Яндекс.Фоток"

Другие  доклады    

Отказоустойчивость  

—  Павел  Пушкарёв:  "Отказоустойчивость  сервисов”,  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: Алексей Захаров "Архитектура Яндекс.Фоток"

   Сторадж  –  что  это?          

     

15  

Page 16: Алексей Захаров "Архитектура Яндекс.Фоток"

       

Сторадж  

—  Оптимизирован  для  хранения  файлов  

—  Основан  на  файловой  системе  

—  Простой  HTTP-­‐протокол  доступа  

—  Данные  хранятся  в  двух  экземплярх  в  разных  датацентрах  

16  

Page 17: Алексей Захаров "Архитектура Яндекс.Фоток"

       

Сторадж  

—  Прозрачный  доступ  к  данным  через  специальные  proxy-­‐сервера  

—  Простая  и  надёжная  схема  

—  Разработан  внутри  Яндекса  

17  

Page 18: Алексей Захаров "Архитектура Яндекс.Фоток"

Показ  фотки  

18  

Page 19: Алексей Захаров "Архитектура Яндекс.Фоток"

 Страница  просмотра  фотки  

19  

Page 20: Алексей Захаров "Архитектура Яндекс.Фоток"

Всё  как  у  людей  Формирование  HTML-­‐страницы  

—  Frontend:  разбор  запроса,  выстраивание  цепочки  вызовов  backend’ов  

—  Backend:  взаимодействие  с  БД,  обработка  данных,  формирование  XML-­‐ответа    

—  Frontend:  сбор  ответов  с  backend’ов,  наложение  XSL,  формирование  итоговой  HTML-­‐разметки  

—  Сторадж:  отдача  фоток  по  прямым  URL  

20  

Page 21: Алексей Захаров "Архитектура Яндекс.Фоток"

     

Получение  фотки  со  стораджа      

—  Запрос  приходит  на  proxy,  из  URL  однозначно  определяет  номер  стораджа  

—  Прокси  делает  запрос  на  доступные  копии  стораджа  

—  Сторадж  по  URL  определяет  номер  диска,  директорию  и  имя  файла  

—  Прокси  проксирует  через  себя  ответ  сторджа  и  отдаёт  пользователю  

21  

http://img-fotki.yandex.ru/get/6601/161556715.1c/0_7e678_a7812eef_XL

Page 22: Алексей Захаров "Архитектура Яндекс.Фоток"

Прокси  и  стораджа  

22  

Proxy01f   Proxy02g  

Storage01e  

Storage01f  

Storage03g  

Storage03f  

Storage05g  

Storage05e  

Page 23: Алексей Захаров "Архитектура Яндекс.Фоток"

Механизм  асинхронного  выполнения  заданий  

23  

Page 24: Алексей Захаров "Архитектура Яндекс.Фоток"

Scheduler  

24  

Page 25: Алексей Захаров "Архитектура Яндекс.Фоток"

Задачи  по  расписанию  Scheduler  

—  Выбор  фото  дня  

—  Подготовка  данных  для  голосования  

—  Составление  ленты  новых  интересных  

—  Экспорты  в  картинки,  в  карты  

25  

Page 26: Алексей Захаров "Архитектура Яндекс.Фоток"

Одноразовые  задачи  Scheduler  

—  Удаление  фоток  альбома  

—  Пересчёт  счётчиков  

—  Распознавание  лиц  

—  Перестроение  облака  тегов  

—  Отсылка  почтовых  сообщений  

26  

Page 27: Алексей Захаров "Архитектура Яндекс.Фоток"

Что  внутри  Scheduler  

—  ZooKeeper:  выбор  мастер-­‐worker’а,  проверка  работоспособности,  балансировка    

—  MongoDb:  хранение  параметров  задач  

—  Actor  поверх  neoy:  передача  параметров  задачи  на  конкретный  worker  и  чтение  результатов  

27  

Page 28: Алексей Захаров "Архитектура Яндекс.Фоток"

   Scheduler  

28  

ZooKeeper  

Worker3  

Worker2  

Worker1  

MongoDb  

Page 29: Алексей Захаров "Архитектура Яндекс.Фоток"

Внешнее  API  Фоток  

29  

Page 30: Алексей Захаров "Архитектура Яндекс.Фоток"

   Внешнее  API  

—  Другой  вид  frontend’а  

—  Отдельное  приложение  на  Python  &  Django  

—  Используется  выдача  обычных  backend’ов    

—  Выходные  форматы:  ATOM  и  JSON  

—  Стабильное,  обратная  совместимость  

 

30  

Page 31: Алексей Захаров "Архитектура Яндекс.Фоток"

 Что  можно  делать  Внешнее  API  

—  Получать  информацию  о  конкретной  фотке  

—  Получать  список  фоток  в  альбоме,  список  альбомов  

—  Изменять  информацию  о  конкретной  фотке  

—  Загружать  новые  фотки  

—  Получать  коллекции  фоток  дня,  популярных,  свежих  &  интересных  

—  Подробнее:  hop://api.yandex.ru/fotki/  

31  

Page 32: Алексей Захаров "Архитектура Яндекс.Фоток"

   Пример  JSON  выдачи  

32  

Page 33: Алексей Захаров "Архитектура Яндекс.Фоток"

   Пример  использования  

33  

Page 34: Алексей Захаров "Архитектура Яндекс.Фоток"

 hap://fotker.fdzn.net/    

Пример  использования  

34  

Page 35: Алексей Захаров "Архитектура Яндекс.Фоток"

   Немного  цифр  напоследок  

—  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: Алексей Захаров "Архитектура Яндекс.Фоток"

Всё!      

36  

Page 37: Алексей Захаров "Архитектура Яндекс.Фоток"

Вопросы?    

37  

Page 38: Алексей Захаров "Архитектура Яндекс.Фоток"

Руководитель  группы  серверной  разработки  Яндекс.Фоток  

ayza@yandex-­‐team.ru  

 

Алексей  Захаров