SlideShare a Scribd company logo
Архитектура проекта на 30М
            пользователей




Интересно? Заходи на http://job.fotostrana.ru   1 из 50
Фотострана?
                        Не, не слышал.




Интересно? Заходи на http://job.fotostrana.ru   2 из 50
— 35 000 000 зарегистрированных пользователей
  — 1 500 000 уникальных посетителей в день.
  — Больше 150 человек в команде
  — Входим в ТОП-20 сайтов рунета




Интересно? Заходи на http://job.fotostrana.ru   3 из 50
О чем расскажу?
  •   Общая архитектура и платформа
  •   Используемые технологии
  •   Обработка запросов
  •   Отдача статики
  •   Хранение данных
  •   Мониторинг



Интересно? Заходи на http://job.fotostrana.ru   4 из 50
Общие цифры
  •   Один дата-центр
  •   Более 200 физических серверов
  •   В пике суммарный трафик больше 3 Гбит/c
  •   70 Мб PHP кода
  •   3 Гб статики




Интересно? Заходи на http://job.fotostrana.ru   5 из 50
Разработка
  •   PHP, в основе лежал Zend Framework
  •   C(++) демоны и модули для PHP
  •   SVN (есть проблемы, хотим Git)
  •   Google Docs
  •   Redmine
  •   Fisheye
  •   Asana

Интересно? Заходи на http://job.fotostrana.ru   6 из 50
Платформа
  •   FreeBSD (местами Debian Linux)
  •   nginx
  •   Apache + mod_php + APC
  •   Memcached
  •   Percona server
  •   Собственные демоны




Интересно? Заходи на http://job.fotostrana.ru   7 из 50
Железо
  •   Средний сервер: 2 Xeon 16Gb RAM
  •   Сеть на Juniper
  •   300 Гб кластер memcached
  •   650 Гб базы данных MySQL
  •   750 Гб данных в памяти демонов
  •   50 Тб для хранения фотографий
  •   SSD где необходимо
  •   Сервера узкоспециализированные

Интересно? Заходи на http://job.fotostrana.ru   8 из 50
Релизы
  • Деплой раз в час (~30 секунд на 130
    серверов)
  • Есть QA отдел, но фактически тестирования
    практически нет
  • Новый функционал выкатываем на часть
    пользователей
  • PHP ошибки приходят в skype их автору 


Интересно? Заходи на http://job.fotostrana.ru   9 из 50
Мониторинг
  • Nagios + Cacti
  • Самописные модули мониторинга
  • Самописная система профилирования кода
    и запросов
  • Много смс уведомлений
  • Бизнес статистика/аналитика для
    менеджеров сервисов


Интересно? Заходи на http://job.fotostrana.ru   10 из 50
Резервное копирование
  • БД 3 раза в день
  • Демоны каждые 2 часа
  • Пользовательские фотографии раз в сутки




Интересно? Заходи на http://job.fotostrana.ru   11 из 50
Обработка запросов




Интересно? Заходи на http://job.fotostrana.ru   12 из 50
Интересно? Заходи на http://job.fotostrana.ru   13 из 50
Питомцы, профили, поиск…

                  Нет разбиения на группы

Интересно? Заходи на http://job.fotostrana.ru      14 из 50
Питомцы             Профили               Поиск


                  Есть разбиение на группы

Интересно? Заходи на http://job.fotostrana.ru           15 из 50
• 130 PHP серверов
                                                • 2.500 req/s
                                                • Среднее время
                                                  ответа 0.06 сек




Интересно? Заходи на http://job.fotostrana.ru    16 из 50
Управление серверами




Интересно? Заходи на http://job.fotostrana.ru   17 из 50
Отдача статики
  • Наша статика (css, js, swf, jpg…) из svn

  • Пользовательский контент (аватарки,
    фотки, превьюшки) – “Фотосхема”




Интересно? Заходи на http://job.fotostrana.ru   18 из 50
Содержимое статики:




                                            }
  • 800 css
  • 750 js
                                                      3 Гигабайта
  • 3200 swf
  • 48000 image

  • 5000 req/s
  • >1 Гбит/сек трафика в пике
Интересно? Заходи на http://job.fotostrana.ru   19 из 50
Сервер определяется
        на стороне PHP кода
        по IP клиента




Интересно? Заходи на http://job.fotostrana.ru   20 из 50
Интересно? Заходи на http://job.fotostrana.ru   21 из 50
Интересно? Заходи на http://job.fotostrana.ru   22 из 50
Интересное
  • Контроль версий статический файлов
  • Пробовали привязывать пользователей по
    географическому признаку
  • Lazyloader для динамической подгрузки js и
    css
  • 5 виртуальных субдоменов на каждый
    сервер


Интересно? Заходи на http://job.fotostrana.ru   23 из 50
Фотосхема
  • 14 Тб - объем пользовательских фотографий
  • +60 Гб (или 250.000) фотографий в сутки
  • 4000 req/s
  • >850 Мбит/сек трафика в пике




Интересно? Заходи на http://job.fotostrana.ru   24 из 50
Фотосхема




Интересно? Заходи на http://job.fotostrana.ru   25 из 50
Интересное
  • Проблема холодного старта
  • Файлы реально удаляются с диска




Интересно? Заходи на http://job.fotostrana.ru   26 из 50
Хранение данных
  •   MySQL
  •   Memcached
  •   Lemon – самописное key-value хранилище
  •   Демоны на C++




Интересно? Заходи на http://job.fotostrana.ru   27 из 50
MySQL

                                                          • 14 серверов
                                                          • 100.000 / мин SELECT
                                                          • 40.000 / мин UPDATE




  картинка про alter таблички на 30кк записей (15Гбайт)


Интересно? Заходи на http://job.fotostrana.ru             28 из 50
Интересное
  •   Можем на живую менять схему БД
  •   Используем pconnect
  •   Не используем транзакции
  •   Не используем JOIN и вторичные ключи
  •   Нет шардинга
  •   Особое внимание индексам и адекватности
      запросов


Интересно? Заходи на http://job.fotostrana.ru   29 из 50
Управление репликами




Интересно? Заходи на http://job.fotostrana.ru   30 из 50
Memcached

                                                • 5 серверов
                                                • 300 Гбайт RAM
                                                • 32.000 req/s




Интересно? Заходи на http://job.fotostrana.ru   31 из 50
Интересное
  •   Это не хранилище данных!
  •   90% данных – кэш выборок из базы как есть
  •   Использовали ketama, отказались
  •   Рестарт сервера раз в несколько месяцев
  •   Локи на memcached::add




Интересно? Заходи на http://job.fotostrana.ru   32 из 50
Подходим к NoSQL
  MySQL плохо делает 3 вещи:

  • Удаление большого количества данных

  • Очень частые изменения данных

  • Частые выборки




Интересно? Заходи на http://job.fotostrana.ru   33 из 50
Решение – NoSQL.


                                                  Lemon
  Lemon:
  • Простое key-value хранилище
  • Все данные в памяти
  • Периодический дамп данных на диск
  • key = (string namespace, int64 key)
  • Шардинг как запуск нескольких независимых
  инстансов, namespace привязан к серверу.

Интересно? Заходи на http://job.fotostrana.ru   34 из 50
Время обработки запроса




Интересно? Заходи на http://job.fotostrana.ru   35 из 50
Демоны
  Что сделали:
  • Модуль PHP для взаимодействия с демонами
  • Разработали протокол взаимодействия
  • Своя бинарная сериализация данных



  Всего разных демонов больше 30:
  • Гости, контакты, мессенджер, питомцы, поиск,
    встречи, голосвание, нотификации…

Интересно? Заходи на http://job.fotostrana.ru   36 из 50
Пример: демон гостей
  <?
  $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
HTTP демоны-серверы




                     /user/123                      /chat/?userId=123




Интересно? Заходи на http://job.fotostrana.ru   38 из 50
HTTP демоны
  • Быстрее PHP, в 10 раз!
  • > 50% запросов на балансер попадают к
    демонам
  • Всего 7 серверов




Интересно? Заходи на http://job.fotostrana.ru   39 из 50
Мониторинг
  • Профилирование PHP кода, запросов в БД,
    memcache и других источников данных
  • Единая система бизнес статистики для
    менеджеров сервисов




Интересно? Заходи на http://job.fotostrana.ru   40 из 50
Профилирование - 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
Статистика по URL




Интересно? Заходи на http://job.fotostrana.ru   42 из 50
Кол-во запросов по URL




Интересно? Заходи на http://job.fotostrana.ru   43 из 50
Профайлер для разработчика




Интересно? Заходи на http://job.fotostrana.ru   44 из 50
Статистика
  •   Реализована на очередях в разделяемой памяти (на каждом PHP
      сервере)
  •   Сбор данных из очереди со всех серверов (по крону) и их обработка
  •   Минимальное влияние на производительность скрипта
  •   История значений хранится в базе в нескольких таблицах, где они
      сгруппированы по периоду (час, день, месяц).
  •   Есть возможность считать уников (например кол-во уникальных
      пользователей загрузивших сегодня фотографии)


  С точки зрения разработчика:
  <?
  Statistics::increment($statsType, $userId, $field, $value);

  // Statistics::increment(MAIN_STATS, 2407325, ‘photos_upload_count’, 18);



Интересно? Заходи на http://job.fotostrana.ru              45 из 50
SharedQueue сервер
  Реализация очереди сообщений в оперативной памяти.

  • Демон на скриптовом сервере
  • Модуль для PHP
  • На данный момент 200 очередей

  Методы
  <?
  $result = SharedQueue::push($queueIndex, $data);

  $allData = SharedQueue::popAll($queueIndex, $serverList);



Интересно? Заходи на http://job.fotostrana.ru    46 из 50
Интерфейс статистики




Интересно? Заходи на http://job.fotostrana.ru   47 из 50
Интерфейс статистики




Интересно? Заходи на http://job.fotostrana.ru   48 из 50
Подводя итоги
  •   Нет преждевременной оптимизации
  •   Нет трендам, да цифрам
  •   Не бойтесь экспериментировать
  •   Проверяйте все сами
  •   Включайте мозг 




Интересно? Заходи на http://job.fotostrana.ru   49 из 50
Спасибо за внимание!




                             Вопросы


Интересно? Заходи на http://job.fotostrana.ru   50 из 50

More Related Content

PPT
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
PPT
Architechture of a social network for 30M users
PPT
Фотострана, Дмитрий Смирнов
PPTX
Chef @DevWeb
ODP
Top10 доводов против языка Ruby
PPTX
Опыт эксплуатации большого проекта на Ruby
PPTX
Как устроен поиск
PDF
Иван Карев — Клиентская оптимизация
13 октября, DEV {web} - конференция о Highload веб-разработке. "Грабли при ма...
Architechture of a social network for 30M users
Фотострана, Дмитрий Смирнов
Chef @DevWeb
Top10 доводов против языка Ruby
Опыт эксплуатации большого проекта на Ruby
Как устроен поиск
Иван Карев — Клиентская оптимизация

What's hot (19)

PDF
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
PPTX
Про качественный поиск
PDF
Не все базы данных одинаково полезны
PDF
Выступление Сергея Аверина, Badoo, на High Performance Conference
PDF
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
PDF
Haritonov
PPTX
Синяя Борода. История одного проекта.
PDF
JavaScript on frontend and backend (in Russian
PDF
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
PDF
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
PPT
Rubt on Rails: 1000 запросов в секунду
PDF
Юрий Буянов «Архитектура Goozy»
PDF
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
PDF
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
PDF
Top-10 популярных вопросов администраторам баз данных или почему я против св...
PDF
Электронная коммерция: от Hadoop к Spark Scala
PDF
Илья Космодемьянский, PostgreSQL-Consulting.com
PDF
Ihor Bliumental – Is There Life Outside OWASP Top-10
PPTX
Mysql replication DevConf 2012
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Про качественный поиск
Не все базы данных одинаково полезны
Выступление Сергея Аверина, Badoo, на High Performance Conference
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Haritonov
Синяя Борода. История одного проекта.
JavaScript on frontend and backend (in Russian
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
JSLab. Дмитрий Смолин, Дмитрий Филипенко. "React и Webpack с помощью кирки, л...
Rubt on Rails: 1000 запросов в секунду
Юрий Буянов «Архитектура Goozy»
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Осваиваем Tarantool 1.6 / Евгений Шадрин (Sberbank Digital Ventures)
Top-10 популярных вопросов администраторам баз данных или почему я против св...
Электронная коммерция: от Hadoop к Spark Scala
Илья Космодемьянский, PostgreSQL-Consulting.com
Ihor Bliumental – Is There Life Outside OWASP Top-10
Mysql replication DevConf 2012
Ad

Viewers also liked (15)

PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
PPTX
13 октября, DEV {web} - конференция о Highload веб-разработке. "Управление ок...
PDF
2013 09 17 архитектура веб-приложений
PPTX
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
PPTX
Highload: специализированные высокопроизводительные индексы
ODP
Highload Begun Pankov
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
PDF
Разработка API для большого, нагруженного сервиса
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
PPTX
как строить архитектуру для отказоустойчивой службы такси
PDF
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
PPT
Пишем свой сервис-агрегатор: архитектура, подводные камни
PDF
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
PDF
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
PDF
Testing at Spotify
13 октября, DEV {web} - конференция о Highload веб-разработке. "Java под нагр...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Управление ок...
2013 09 17 архитектура веб-приложений
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Когда сто...
Highload: специализированные высокопроизводительные индексы
Highload Begun Pankov
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Эксплуат...
Разработка API для большого, нагруженного сервиса
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Строим N...
как строить архитектуру для отказоустойчивой службы такси
Twisted Framework - фреймворк для написания сетевых приложений на Python (Анд...
Пишем свой сервис-агрегатор: архитектура, подводные камни
Использование Hadoop в Badoo, Валерий Старынин (Badoo)
С чего начать внедрение Hadoop в компании / Алексей Еремихин (Badoo)
Testing at Spotify
Ad

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

PDF
Алексей Захаров "Архитектура Яндекс.Фоток"
PPT
Гайк Закарян Выбор платформ на основе анализа крупных интернет проектов
PPT
Инфраструктура социального проекта
PDF
Базы данных. Haystack
PDF
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
PDF
За гранью NoSQL: NewSQL на Cassandra
PPT
распределенная архитектура Lamp приложений петр зайцев
PDF
Haystack
PDF
Как Badoo модерирует 1 миллиард фотографий в год (Андрей Гоменюк)
PPT
“КП” в интернете (Александр Ромашин, Вячеслав Малютин)
PPTX
NoBigData - потоковая система аналитики clientside производительности, Сергей...
PPT
Тестирование и оптимизация 1С-Битрикс (Александр Демидов, Олег Бунин)
PDF
Technopolis.NoSQL 03 Haystack
PPS
Magento performance
PPTX
High Availability в жизни обычного разработчика
PDF
High load2007 scaling-web-applications-rus
PPTX
Hosting for forbes.ru_
PPT
Воюем за ресурсы (ZFConf2011)
PPT
А.Горбов, А.Фефелов. Секреты АБАК-ПРЕСС
PPTX
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центр
Алексей Захаров "Архитектура Яндекс.Фоток"
Гайк Закарян Выбор платформ на основе анализа крупных интернет проектов
Инфраструктура социального проекта
Базы данных. Haystack
Tarantool: как обрабатывать 
1,5 млрд запросов в сутки?
За гранью NoSQL: NewSQL на Cassandra
распределенная архитектура Lamp приложений петр зайцев
Haystack
Как Badoo модерирует 1 миллиард фотографий в год (Андрей Гоменюк)
“КП” в интернете (Александр Ромашин, Вячеслав Малютин)
NoBigData - потоковая система аналитики clientside производительности, Сергей...
Тестирование и оптимизация 1С-Битрикс (Александр Демидов, Олег Бунин)
Technopolis.NoSQL 03 Haystack
Magento performance
High Availability в жизни обычного разработчика
High load2007 scaling-web-applications-rus
Hosting for forbes.ru_
Воюем за ресурсы (ZFConf2011)
А.Горбов, А.Фефелов. Секреты АБАК-ПРЕСС
Мониторинг веб-проектов: штаб оперативного реагирования и аналитический центр

More from IT-Portfolio (7)

PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Highload...
PDF
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Оптимиза...
PPT
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
PPTX
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
PDF
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Шардинг в...
PDF
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Инженерны...
PDF
13 октября, DEV {web} - конференция о Highload веб-разработке. "Особенности р...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Highload...
16 декабря, DEV {highload} - конференция о Highload веб-разработке, "Оптимиза...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Несколько...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Шардинг в...
20 апреля, DEV {highload} - конференция о Highload веб-разработке, "Инженерны...
13 октября, DEV {web} - конференция о Highload веб-разработке. "Особенности р...

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

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

Editor's Notes

  • #13: Не хватает DNS с round-robin (долго жили с ns от reg.ru) 2 х nginx (как они были резервированы) Возможно что отдельных слайдов про разбиение вообще не нужно.