13 октября, dev {web} - конференция о highload веб-разработке....
DESCRIPTION
13 октября, DEV {web} - конференция о Highload веб-разработке. "Архитектура проекта на 30 млн. пользователей", Дмитрий Смирнов (ведущий разработчик Фотостраны).TRANSCRIPT
Интересно? Заходи на 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 codeCStatStopUrl($isError);
CStatStartDB($mode, $dbName, $_method, $table);// execute mysql_queryCStatStopDB($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
Вопросы
Спасибо за внимание!