13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура проекта на 30 млн. пользователей", Дмитрий Смирнов (ведущий разработчик Фотостраны).
Similar to 13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура проекта на 30 млн. пользователей", Дмитрий Смирнов (Фотострана) (20)
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
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
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
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
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
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
49. Подводя итоги
• Нет преждевременной оптимизации
• Нет трендам, да цифрам
• Не бойтесь экспериментировать
• Проверяйте все сами
• Включайте мозг
Интересно? Заходи на http://job.fotostrana.ru 49 из 50
50. Спасибо за внимание!
Вопросы
Интересно? Заходи на http://job.fotostrana.ru 50 из 50
Editor's Notes
Не хватает DNS с round-robin (долго жили с ns от reg.ru) 2 х nginx (как они были резервированы) Возможно что отдельных слайдов про разбиение вообще не нужно.