Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Архитектура проекта на 30М            пользователейИнтересно? Заходи на http://job.fotostrana.ru   1 из 50
Фотострана?                        Не, не слышал.Интересно? Заходи на http://job.fotostrana.ru   2 из 50
— 35 000 000 зарегистрированных пользователей  — 1 500 000 уникальных посетителей в день.  — Больше 150 человек в команде ...
О чем расскажу?  •   Общая архитектура и платформа  •   Используемые технологии  •   Обработка запросов  •   Отдача статик...
Общие цифры  •   Один дата-центр  •   Более 200 физических серверов  •   В пике суммарный трафик больше 3 Гбит/c  •   70 М...
Разработка  •   PHP, в основе лежал Zend Framework  •   C(++) демоны и модули для PHP  •   SVN (есть проблемы, хотим Git) ...
Платформа  •   FreeBSD (местами Debian Linux)  •   nginx  •   Apache + mod_php + APC  •   Memcached  •   Percona server  •...
Железо  •   Средний сервер: 2 Xeon 16Gb RAM  •   Сеть на Juniper  •   300 Гб кластер memcached  •   650 Гб базы данных MyS...
Релизы  • Деплой раз в час (~30 секунд на 130    серверов)  • Есть QA отдел, но фактически тестирования    практически нет...
Мониторинг  • Nagios + Cacti  • Самописные модули мониторинга  • Самописная система профилирования кода    и запросов  • М...
Резервное копирование  • БД 3 раза в день  • Демоны каждые 2 часа  • Пользовательские фотографии раз в суткиИнтересно? Зах...
Обработка запросовИнтересно? Заходи на http://job.fotostrana.ru   12 из 50
Интересно? Заходи на http://job.fotostrana.ru   13 из 50
Питомцы, профили, поиск…                  Нет разбиения на группыИнтересно? Заходи на http://job.fotostrana.ru      14 из 50
Питомцы             Профили               Поиск                  Есть разбиение на группыИнтересно? Заходи на http://job.f...
• 130 PHP серверов                                                • 2.500 req/s                                           ...
Управление серверамиИнтересно? Заходи на http://job.fotostrana.ru   17 из 50
Отдача статики  • Наша статика (css, js, swf, jpg…) из svn  • Пользовательский контент (аватарки,    фотки, превьюшки) – “...
Содержимое статики:                                            }  • 800 css  • 750 js                                     ...
Сервер определяется        на стороне PHP кода        по IP клиентаИнтересно? Заходи на http://job.fotostrana.ru   20 из 50
Интересно? Заходи на http://job.fotostrana.ru   21 из 50
Интересно? Заходи на http://job.fotostrana.ru   22 из 50
Интересное  • Контроль версий статический файлов  • Пробовали привязывать пользователей по    географическому признаку  • ...
Фотосхема  • 14 Тб - объем пользовательских фотографий  • +60 Гб (или 250.000) фотографий в сутки  • 4000 req/s  • >850 Мб...
ФотосхемаИнтересно? Заходи на http://job.fotostrana.ru   25 из 50
Интересное  • Проблема холодного старта  • Файлы реально удаляются с дискаИнтересно? Заходи на http://job.fotostrana.ru   ...
Хранение данных  •   MySQL  •   Memcached  •   Lemon – самописное key-value хранилище  •   Демоны на C++Интересно? Заходи ...
MySQL                                                          • 14 серверов                                              ...
Интересное  •   Можем на живую менять схему БД  •   Используем pconnect  •   Не используем транзакции  •   Не используем J...
Управление репликамиИнтересно? Заходи на http://job.fotostrana.ru   30 из 50
Memcached                                                • 5 серверов                                                • 300...
Интересное  •   Это не хранилище данных!  •   90% данных – кэш выборок из базы как есть  •   Использовали ketama, отказали...
Подходим к NoSQL  MySQL плохо делает 3 вещи:  • Удаление большого количества данных  • Очень частые изменения данных  • Ча...
Решение – NoSQL.                                                  Lemon  Lemon:  • Простое key-value хранилище  • Все дан...
Время обработки запросаИнтересно? Заходи на http://job.fotostrana.ru   35 из 50
Демоны  Что сделали:  • Модуль PHP для взаимодействия с демонами  • Разработали протокол взаимодействия  • Своя бинарная с...
Пример: демон гостей  <?  $guests->call(‘add_guest’, array(       $toUserId,       $guestId,       $source,  ));  $list = ...
HTTP демоны-серверы                     /user/123                      /chat/?userId=123Интересно? Заходи на http://job.fo...
HTTP демоны  • Быстрее PHP, в 10 раз!  • > 50% запросов на балансер попадают к    демонам  • Всего 7 серверовИнтересно? За...
Мониторинг  • Профилирование PHP кода, запросов в БД,    memcache и других источников данных  • Единая система бизнес стат...
Профилирование - CStat  •   Модуль для PHP  •   Все данные в разделяемой памяти  •   Сбор данных со всех серверов (по крон...
Статистика по URLИнтересно? Заходи на http://job.fotostrana.ru   42 из 50
Кол-во запросов по URLИнтересно? Заходи на http://job.fotostrana.ru   43 из 50
Профайлер для разработчикаИнтересно? Заходи на http://job.fotostrana.ru   44 из 50
Статистика  •   Реализована на очередях в разделяемой памяти (на каждом PHP      сервере)  •   Сбор данных из очереди со в...
SharedQueue сервер  Реализация очереди сообщений в оперативной памяти.  • Демон на скриптовом сервере  • Модуль для PHP  •...
Интерфейс статистикиИнтересно? Заходи на http://job.fotostrana.ru   47 из 50
Интерфейс статистикиИнтересно? Заходи на http://job.fotostrana.ru   48 из 50
Подводя итоги  •   Нет преждевременной оптимизации  •   Нет трендам, да цифрам  •   Не бойтесь экспериментировать  •   Про...
Спасибо за внимание!                             ВопросыИнтересно? Заходи на http://job.fotostrana.ru   50 из 50
Upcoming SlideShare
Loading in …5
×

13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура проекта на 30 млн. пользователей", Дмитрий Смирнов (Фотострана)

5,074 views

Published on

13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура проекта на 30 млн. пользователей", Дмитрий Смирнов (ведущий разработчик Фотостраны).

  • Be the first to comment

13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура проекта на 30 млн. пользователей", Дмитрий Смирнов (Фотострана)

  1. 1. Архитектура проекта на 30М пользователейИнтересно? Заходи на http://job.fotostrana.ru 1 из 50
  2. 2. Фотострана? Не, не слышал.Интересно? Заходи на http://job.fotostrana.ru 2 из 50
  3. 3. — 35 000 000 зарегистрированных пользователей — 1 500 000 уникальных посетителей в день. — Больше 150 человек в команде — Входим в ТОП-20 сайтов рунетаИнтересно? Заходи на http://job.fotostrana.ru 3 из 50
  4. 4. О чем расскажу? • Общая архитектура и платформа • Используемые технологии • Обработка запросов • Отдача статики • Хранение данных • МониторингИнтересно? Заходи на http://job.fotostrana.ru 4 из 50
  5. 5. Общие цифры • Один дата-центр • Более 200 физических серверов • В пике суммарный трафик больше 3 Гбит/c • 70 Мб PHP кода • 3 Гб статикиИнтересно? Заходи на http://job.fotostrana.ru 5 из 50
  6. 6. Разработка • PHP, в основе лежал Zend Framework • C(++) демоны и модули для PHP • SVN (есть проблемы, хотим Git) • Google Docs • Redmine • Fisheye • AsanaИнтересно? Заходи на http://job.fotostrana.ru 6 из 50
  7. 7. Платформа • FreeBSD (местами Debian Linux) • nginx • Apache + mod_php + APC • Memcached • Percona server • Собственные демоныИнтересно? Заходи на http://job.fotostrana.ru 7 из 50
  8. 8. Железо • Средний сервер: 2 Xeon 16Gb RAM • Сеть на Juniper • 300 Гб кластер memcached • 650 Гб базы данных MySQL • 750 Гб данных в памяти демонов • 50 Тб для хранения фотографий • SSD где необходимо • Сервера узкоспециализированныеИнтересно? Заходи на http://job.fotostrana.ru 8 из 50
  9. 9. Релизы • Деплой раз в час (~30 секунд на 130 серверов) • Есть QA отдел, но фактически тестирования практически нет • Новый функционал выкатываем на часть пользователей • PHP ошибки приходят в skype их автору Интересно? Заходи на http://job.fotostrana.ru 9 из 50
  10. 10. Мониторинг • Nagios + Cacti • Самописные модули мониторинга • Самописная система профилирования кода и запросов • Много смс уведомлений • Бизнес статистика/аналитика для менеджеров сервисовИнтересно? Заходи на http://job.fotostrana.ru 10 из 50
  11. 11. Резервное копирование • БД 3 раза в день • Демоны каждые 2 часа • Пользовательские фотографии раз в суткиИнтересно? Заходи на http://job.fotostrana.ru 11 из 50
  12. 12. Обработка запросовИнтересно? Заходи на http://job.fotostrana.ru 12 из 50
  13. 13. Интересно? Заходи на http://job.fotostrana.ru 13 из 50
  14. 14. Питомцы, профили, поиск… Нет разбиения на группыИнтересно? Заходи на http://job.fotostrana.ru 14 из 50
  15. 15. Питомцы Профили Поиск Есть разбиение на группыИнтересно? Заходи на http://job.fotostrana.ru 15 из 50
  16. 16. • 130 PHP серверов • 2.500 req/s • Среднее время ответа 0.06 секИнтересно? Заходи на http://job.fotostrana.ru 16 из 50
  17. 17. Управление серверамиИнтересно? Заходи на http://job.fotostrana.ru 17 из 50
  18. 18. Отдача статики • Наша статика (css, js, swf, jpg…) из svn • Пользовательский контент (аватарки, фотки, превьюшки) – “Фотосхема”Интересно? Заходи на http://job.fotostrana.ru 18 из 50
  19. 19. Содержимое статики: } • 800 css • 750 js 3 Гигабайта • 3200 swf • 48000 image • 5000 req/s • >1 Гбит/сек трафика в пикеИнтересно? Заходи на http://job.fotostrana.ru 19 из 50
  20. 20. Сервер определяется на стороне PHP кода по IP клиентаИнтересно? Заходи на http://job.fotostrana.ru 20 из 50
  21. 21. Интересно? Заходи на http://job.fotostrana.ru 21 из 50
  22. 22. Интересно? Заходи на http://job.fotostrana.ru 22 из 50
  23. 23. Интересное • Контроль версий статический файлов • Пробовали привязывать пользователей по географическому признаку • Lazyloader для динамической подгрузки js и css • 5 виртуальных субдоменов на каждый серверИнтересно? Заходи на http://job.fotostrana.ru 23 из 50
  24. 24. Фотосхема • 14 Тб - объем пользовательских фотографий • +60 Гб (или 250.000) фотографий в сутки • 4000 req/s • >850 Мбит/сек трафика в пикеИнтересно? Заходи на http://job.fotostrana.ru 24 из 50
  25. 25. ФотосхемаИнтересно? Заходи на http://job.fotostrana.ru 25 из 50
  26. 26. Интересное • Проблема холодного старта • Файлы реально удаляются с дискаИнтересно? Заходи на http://job.fotostrana.ru 26 из 50
  27. 27. Хранение данных • MySQL • Memcached • Lemon – самописное key-value хранилище • Демоны на C++Интересно? Заходи на http://job.fotostrana.ru 27 из 50
  28. 28. MySQL • 14 серверов • 100.000 / мин SELECT • 40.000 / мин UPDATE картинка про alter таблички на 30кк записей (15Гбайт)Интересно? Заходи на http://job.fotostrana.ru 28 из 50
  29. 29. Интересное • Можем на живую менять схему БД • Используем pconnect • Не используем транзакции • Не используем JOIN и вторичные ключи • Нет шардинга • Особое внимание индексам и адекватности запросовИнтересно? Заходи на http://job.fotostrana.ru 29 из 50
  30. 30. Управление репликамиИнтересно? Заходи на http://job.fotostrana.ru 30 из 50
  31. 31. Memcached • 5 серверов • 300 Гбайт RAM • 32.000 req/sИнтересно? Заходи на http://job.fotostrana.ru 31 из 50
  32. 32. Интересное • Это не хранилище данных! • 90% данных – кэш выборок из базы как есть • Использовали ketama, отказались • Рестарт сервера раз в несколько месяцев • Локи на memcached::addИнтересно? Заходи на http://job.fotostrana.ru 32 из 50
  33. 33. Подходим к NoSQL MySQL плохо делает 3 вещи: • Удаление большого количества данных • Очень частые изменения данных • Частые выборкиИнтересно? Заходи на http://job.fotostrana.ru 33 из 50
  34. 34. Решение – NoSQL.  Lemon Lemon: • Простое key-value хранилище • Все данные в памяти • Периодический дамп данных на диск • key = (string namespace, int64 key) • Шардинг как запуск нескольких независимых инстансов, namespace привязан к серверу.Интересно? Заходи на http://job.fotostrana.ru 34 из 50
  35. 35. Время обработки запросаИнтересно? Заходи на http://job.fotostrana.ru 35 из 50
  36. 36. Демоны Что сделали: • Модуль PHP для взаимодействия с демонами • Разработали протокол взаимодействия • Своя бинарная сериализация данных Всего разных демонов больше 30: • Гости, контакты, мессенджер, питомцы, поиск, встречи, голосвание, нотификации…Интересно? Заходи на http://job.fotostrana.ru 36 из 50
  37. 37. Пример: демон гостей <? $guests->call(‘add_guest’, array( $toUserId, $guestId, $source, )); $list = $guests->call(‘get_guest_list’, array( $forUserId, $limit, $offset, )); // $list = array(array(guestId, time, source), …)Интересно? Заходи на http://job.fotostrana.ru 37 из 50
  38. 38. HTTP демоны-серверы /user/123 /chat/?userId=123Интересно? Заходи на http://job.fotostrana.ru 38 из 50
  39. 39. HTTP демоны • Быстрее PHP, в 10 раз! • > 50% запросов на балансер попадают к демонам • Всего 7 серверовИнтересно? Заходи на http://job.fotostrana.ru 39 из 50
  40. 40. Мониторинг • Профилирование PHP кода, запросов в БД, memcache и других источников данных • Единая система бизнес статистики для менеджеров сервисовИнтересно? Заходи на http://job.fotostrana.ru 40 из 50
  41. 41. Профилирование - CStat • Модуль для PHP • Все данные в разделяемой памяти • Сбор данных со всех серверов (по крону) и сохранение в БД • Похожа на pinba и XHprof Пример: <? CStatStartUrl($requestUrl); // some code CStatStopUrl($isError); CStatStartDB($mode, $dbName, $_method, $table); // execute mysql_query CStatStopDB($isError, $rowCount);Интересно? Заходи на http://job.fotostrana.ru 41 из 50
  42. 42. Статистика по URLИнтересно? Заходи на http://job.fotostrana.ru 42 из 50
  43. 43. Кол-во запросов по URLИнтересно? Заходи на http://job.fotostrana.ru 43 из 50
  44. 44. Профайлер для разработчикаИнтересно? Заходи на http://job.fotostrana.ru 44 из 50
  45. 45. Статистика • Реализована на очередях в разделяемой памяти (на каждом PHP сервере) • Сбор данных из очереди со всех серверов (по крону) и их обработка • Минимальное влияние на производительность скрипта • История значений хранится в базе в нескольких таблицах, где они сгруппированы по периоду (час, день, месяц). • Есть возможность считать уников (например кол-во уникальных пользователей загрузивших сегодня фотографии) С точки зрения разработчика: <? Statistics::increment($statsType, $userId, $field, $value); // Statistics::increment(MAIN_STATS, 2407325, ‘photos_upload_count’, 18);Интересно? Заходи на http://job.fotostrana.ru 45 из 50
  46. 46. SharedQueue сервер Реализация очереди сообщений в оперативной памяти. • Демон на скриптовом сервере • Модуль для PHP • На данный момент 200 очередей Методы <? $result = SharedQueue::push($queueIndex, $data); $allData = SharedQueue::popAll($queueIndex, $serverList);Интересно? Заходи на http://job.fotostrana.ru 46 из 50
  47. 47. Интерфейс статистикиИнтересно? Заходи на http://job.fotostrana.ru 47 из 50
  48. 48. Интерфейс статистикиИнтересно? Заходи на http://job.fotostrana.ru 48 из 50
  49. 49. Подводя итоги • Нет преждевременной оптимизации • Нет трендам, да цифрам • Не бойтесь экспериментировать • Проверяйте все сами • Включайте мозг Интересно? Заходи на http://job.fotostrana.ru 49 из 50
  50. 50. Спасибо за внимание! ВопросыИнтересно? Заходи на http://job.fotostrana.ru 50 из 50

×