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

Viewers also liked

How to scale PHP applications
How to scale PHP applicationsHow to scale PHP applications
How to scale PHP applicationsEnrico Zimuel
 
PHP High Availability High Performance
PHP High Availability High PerformancePHP High Availability High Performance
PHP High Availability High PerformanceAmazee Labs
 
Scaling PHP to 40 Million Uniques
Scaling PHP to 40 Million UniquesScaling PHP to 40 Million Uniques
Scaling PHP to 40 Million UniquesJonathan Klein
 
Scaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHPScaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHP120bi
 
MOSC2012 - Building High-Performance Web-Application with PHP & MongoDB
MOSC2012 - Building High-Performance Web-Application with PHP & MongoDBMOSC2012 - Building High-Performance Web-Application with PHP & MongoDB
MOSC2012 - Building High-Performance Web-Application with PHP & MongoDBr1dotmy
 
PHPDay 2013 - High Performance PHP
PHPDay 2013 - High Performance PHPPHPDay 2013 - High Performance PHP
PHPDay 2013 - High Performance PHPJonathan Klein
 
Scaling php applications with redis
Scaling php applications with redisScaling php applications with redis
Scaling php applications with redisjimbojsb
 
Northeast PHP - High Performance PHP
Northeast PHP - High Performance PHPNortheast PHP - High Performance PHP
Northeast PHP - High Performance PHPJonathan Klein
 
High Performance Php My Sql Scaling Techniques
High Performance Php My Sql Scaling TechniquesHigh Performance Php My Sql Scaling Techniques
High Performance Php My Sql Scaling TechniquesZendCon
 
How PHP Works ?
How PHP Works ?How PHP Works ?
How PHP Works ?Ravi Raj
 

Viewers also liked (11)

How to scale PHP applications
How to scale PHP applicationsHow to scale PHP applications
How to scale PHP applications
 
PHP High Availability High Performance
PHP High Availability High PerformancePHP High Availability High Performance
PHP High Availability High Performance
 
Scaling PHP to 40 Million Uniques
Scaling PHP to 40 Million UniquesScaling PHP to 40 Million Uniques
Scaling PHP to 40 Million Uniques
 
Scaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHPScaling a High Traffic Web Application: Our Journey from Java to PHP
Scaling a High Traffic Web Application: Our Journey from Java to PHP
 
Apache Hadoop: DFS and Map Reduce
Apache Hadoop: DFS and Map ReduceApache Hadoop: DFS and Map Reduce
Apache Hadoop: DFS and Map Reduce
 
MOSC2012 - Building High-Performance Web-Application with PHP & MongoDB
MOSC2012 - Building High-Performance Web-Application with PHP & MongoDBMOSC2012 - Building High-Performance Web-Application with PHP & MongoDB
MOSC2012 - Building High-Performance Web-Application with PHP & MongoDB
 
PHPDay 2013 - High Performance PHP
PHPDay 2013 - High Performance PHPPHPDay 2013 - High Performance PHP
PHPDay 2013 - High Performance PHP
 
Scaling php applications with redis
Scaling php applications with redisScaling php applications with redis
Scaling php applications with redis
 
Northeast PHP - High Performance PHP
Northeast PHP - High Performance PHPNortheast PHP - High Performance PHP
Northeast PHP - High Performance PHP
 
High Performance Php My Sql Scaling Techniques
High Performance Php My Sql Scaling TechniquesHigh Performance Php My Sql Scaling Techniques
High Performance Php My Sql Scaling Techniques
 
How PHP Works ?
How PHP Works ?How PHP Works ?
How PHP Works ?
 

Similar to Architechture of a social network for 30M users

Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruodnoklassniki.ru
 
Как работают поисковые системы
Как работают поисковые системыКак работают поисковые системы
Как работают поисковые системыNetpeak
 
20131112федорроманенко
20131112федорроманенко20131112федорроманенко
20131112федорроманенкоYandex
 
Применение статистических методов и инструментов для анализа производительнос...
Применение статистических методов и инструментов для анализа производительнос...Применение статистических методов и инструментов для анализа производительнос...
Применение статистических методов и инструментов для анализа производительнос...Ontico
 
20131105 романенко
20131105 романенко20131105 романенко
20131105 романенкоYandex
 
Presentation highload-2011-openstat-myakshin - копия
Presentation highload-2011-openstat-myakshin - копияPresentation highload-2011-openstat-myakshin - копия
Presentation highload-2011-openstat-myakshin - копияМатвей Алексеев
 
Управляемый Code injection (Михаил Якшин)
Управляемый Code injection  (Михаил Якшин)Управляемый Code injection  (Михаил Якшин)
Управляемый Code injection (Михаил Якшин)Ontico
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Yandex
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Fwdays
 
Александр Куликов — Segmento — ICBDA2016
Александр Куликов — Segmento — ICBDA2016Александр Куликов — Segmento — ICBDA2016
Александр Куликов — Segmento — ICBDA2016rusbase
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Ontico
 
DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)
DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)
DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)it-people
 
Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...
Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...
Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...Exiterra Digital Agency 360º
 
Rubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуRubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуАлександр Ежов
 
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)Dmitry Degtyarev
 
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...Mail.ru Group
 
SEO продвижение
SEO продвижениеSEO продвижение
SEO продвижениеimpools29
 
Опыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVCОпыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVCДаниил Силантьев
 
Презентация Александра Садовского, 2009
Презентация Александра Садовского, 2009Презентация Александра Садовского, 2009
Презентация Александра Садовского, 2009drivecity
 

Similar to Architechture of a social network for 30M users (20)

Cистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ruCистема внутренней статистики Odnoklassniki.ru
Cистема внутренней статистики Odnoklassniki.ru
 
Как работают поисковые системы
Как работают поисковые системыКак работают поисковые системы
Как работают поисковые системы
 
20131112федорроманенко
20131112федорроманенко20131112федорроманенко
20131112федорроманенко
 
Применение статистических методов и инструментов для анализа производительнос...
Применение статистических методов и инструментов для анализа производительнос...Применение статистических методов и инструментов для анализа производительнос...
Применение статистических методов и инструментов для анализа производительнос...
 
20131105 романенко
20131105 романенко20131105 романенко
20131105 романенко
 
Базовый курс SEO
Базовый курс SEOБазовый курс SEO
Базовый курс SEO
 
Presentation highload-2011-openstat-myakshin - копия
Presentation highload-2011-openstat-myakshin - копияPresentation highload-2011-openstat-myakshin - копия
Presentation highload-2011-openstat-myakshin - копия
 
Управляемый Code injection (Михаил Якшин)
Управляемый Code injection  (Михаил Якшин)Управляемый Code injection  (Михаил Якшин)
Управляемый Code injection (Михаил Якшин)
 
Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"Алексей Захаров "Архитектура Яндекс.Фоток"
Алексей Захаров "Архитектура Яндекс.Фоток"
 
Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"Andrew Aksyonoff "Архитектура вокруг поиска"
Andrew Aksyonoff "Архитектура вокруг поиска"
 
Александр Куликов — Segmento — ICBDA2016
Александр Куликов — Segmento — ICBDA2016Александр Куликов — Segmento — ICBDA2016
Александр Куликов — Segmento — ICBDA2016
 
Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"Дмитрий Дегтярев, "Хабикаса"
Дмитрий Дегтярев, "Хабикаса"
 
DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)
DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)
DUMP-2012 - Только хардкор! - "Аннотировать за 40 мс" Александр Лившиц (Яндекс)
 
Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...
Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...
Александр Садовский "Хороший веб-поиск для веб-мастеров" на конференции Optim...
 
Rubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секундуRubt on Rails: 1000 запросов в секунду
Rubt on Rails: 1000 запросов в секунду
 
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
Migrating from PHP/MySQL to Redis/Lua, my talk on High load++ (Russian)
 
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...
SQL-боттлнеки: поиск и устранение узких мест при масштабировании, Михаил Нови...
 
SEO продвижение
SEO продвижениеSEO продвижение
SEO продвижение
 
Опыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVCОпыт работы с фреймворком ASP.NET MVC
Опыт работы с фреймворком ASP.NET MVC
 
Презентация Александра Садовского, 2009
Презентация Александра Садовского, 2009Презентация Александра Садовского, 2009
Презентация Александра Садовского, 2009
 

Architechture of a social network for 30M users

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

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