50
Интересно? Заходи на http://job.fotostrana.ru 1 из 50 Архитектура проекта на 30М пользователей

Architechture of a social network for 30M users

Embed Size (px)

Citation preview

Page 1: Architechture of a social network for 30M users

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

Архитектура проекта на 30М пользователей

Page 2: Architechture of a social network for 30M users

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

Фотострана?Не, не слышал.

Page 3: Architechture of a social network for 30M users

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

— 35 000 000 зарегистрированных пользователей

— 1 500 000 уникальных посетителей в день.

— Больше 150 человек в команде

— Входим в ТОП-20 сайтов рунета

Page 4: Architechture of a social network for 30M users

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

О чем расскажу?

• Общая архитектура и платформа• Используемые технологии• Обработка запросов• Отдача статики• Хранение данных• Мониторинг

Page 5: Architechture of a social network for 30M users

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

Общие цифры

• Один дата-центр• Более 200 физических серверов• В пике суммарный трафик больше 3 Гбит/c• 70 Мб PHP кода• 3 Гб статики

Page 6: Architechture of a social network for 30M users

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

Разработка

• PHP, в основе лежал Zend Framework• C(++) демоны и модули для PHP• SVN (есть проблемы, хотим Git)• Google Docs• Redmine• Fisheye• Asana

Page 7: Architechture of a social network for 30M users

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

Платформа

• FreeBSD (местами Debian Linux)• nginx• Apache + mod_php + APC• Memcached• Percona server• Собственные демоны

Page 8: Architechture of a social network for 30M users

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

Железо

• Средний сервер: 2 Xeon 16Gb RAM• Сеть на Juniper• 300 Гб кластер memcached• 650 Гб базы данных MySQL• 750 Гб данных в памяти демонов • 50 Тб для хранения фотографий• SSD где необходимо• Сервера узкоспециализированные

Page 9: Architechture of a social network for 30M users

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

Релизы

• Деплой раз в час (~30 секунд на 130 серверов)

• Есть QA отдел, но фактически тестирования практически нет

• Новый функционал выкатываем на часть пользователей

• PHP ошибки приходят в skype их автору

Page 10: Architechture of a social network for 30M users

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

Мониторинг

• Nagios + Cacti• Самописные модули мониторинга• Самописная система профилирования кода

и запросов• Много смс уведомлений• Бизнес статистика/аналитика для

менеджеров сервисов

Page 11: Architechture of a social network for 30M users

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

Резервное копирование

• БД 3 раза в день• Демоны каждые 2 часа• Пользовательские фотографии раз в сутки

Page 12: Architechture of a social network for 30M users

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

Обработка запросов

Page 13: Architechture of a social network for 30M users

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

Page 14: Architechture of a social network for 30M users

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

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

Питомцы, профили, поиск…

Page 15: Architechture of a social network for 30M users

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

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

Питомцы Профили Поиск

Page 16: Architechture of a social network for 30M users

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

• 130 PHP серверов• 2.500 req/s• Среднее время

ответа 0.06 сек

Page 17: Architechture of a social network for 30M users

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

Управление серверами

Page 18: Architechture of a social network for 30M users

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

Отдача статики

• Наша статика (css, js, swf, jpg…) из svn

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

Page 19: Architechture of a social network for 30M users

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

Содержимое статики:• 800 css• 750 js• 3200 swf• 48000 image

• 5000 req/s• >1 Гбит/сек трафика в пике

} 3 Гигабайта

Page 20: Architechture of a social network for 30M users

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

Сервер определяется

на стороне PHP кода

по IP клиента

Page 21: Architechture of a social network for 30M users

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

Page 22: Architechture of a social network for 30M users

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

Page 23: Architechture of a social network for 30M users

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

Интересное

• Контроль версий статический файлов• Пробовали привязывать пользователей по

географическому признаку• Lazyloader для динамической подгрузки js и

css• 5 виртуальных субдоменов на каждый

сервер

Page 24: Architechture of a social network for 30M users

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

Фотосхема

• 14 Тб - объем пользовательских фотографий• +60 Гб (или 250.000) фотографий в сутки

• 4000 req/s• >850 Мбит/сек трафика в пике

Page 25: Architechture of a social network for 30M users

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

Фотосхема

25 из 50

Page 26: Architechture of a social network for 30M users

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

Интересное

• Проблема холодного старта• Файлы реально удаляются с диска

Page 27: Architechture of a social network for 30M users

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

Хранение данных

• MySQL• Memcached• Lemon – самописное key-value хранилище• Демоны на C++

Page 28: Architechture of a social network for 30M users

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

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

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

MySQL

Page 29: Architechture of a social network for 30M users

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

Интересное

• Можем на живую менять схему БД• Используем pconnect• Не используем транзакции• Не используем JOIN и вторичные ключи• Нет шардинга• Особое внимание индексам и адекватности

запросов

Page 30: Architechture of a social network for 30M users

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

Управление репликами

Page 31: Architechture of a social network for 30M users

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

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

Memcached

Page 32: Architechture of a social network for 30M users

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

Интересное

• Это не хранилище данных!• 90% данных – кэш выборок из базы как есть• Использовали ketama, отказались• Рестарт сервера раз в несколько месяцев• Локи на memcached::add

Page 33: Architechture of a social network for 30M users

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

MySQL плохо делает 3 вещи:

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

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

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

Подходим к NoSQL

Page 34: Architechture of a social network for 30M users

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

Решение – NoSQL.

Lemon

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

Page 35: Architechture of a social network for 30M users

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

Время обработки запроса

Page 36: Architechture of a social network for 30M users

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

Демоны

Что сделали:• Модуль PHP для взаимодействия с демонами• Разработали протокол взаимодействия• Своя бинарная сериализация данных

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

встречи, голосвание, нотификации…

Page 37: Architechture of a social network for 30M users

Интересно? Заходи на 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), …)

Page 38: Architechture of a social network for 30M users

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

HTTP демоны-серверы

/chat/?userId=123/user/123

Page 39: Architechture of a social network for 30M users

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

• Быстрее PHP, в 10 раз!• > 50% запросов на балансер попадают к

демонам• Всего 7 серверов

HTTP демоны

Page 40: Architechture of a social network for 30M users

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

Мониторинг

• Профилирование PHP кода, запросов в БД, memcache и других источников данных

• Единая система бизнес статистики для менеджеров сервисов

Page 41: Architechture of a social network for 30M users

Интересно? Заходи на 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);

Page 42: Architechture of a social network for 30M users

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

Статистика по URL

Page 43: Architechture of a social network for 30M users

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

Кол-во запросов по URL

Page 44: Architechture of a social network for 30M users

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

Профайлер для разработчика

Page 45: Architechture of a social network for 30M users

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

Статистика• Реализована на очередях в разделяемой памяти (на каждом PHP

сервере)• Сбор данных из очереди со всех серверов (по крону) и их обработка• Минимальное влияние на производительность скрипта• История значений хранится в базе в нескольких таблицах, где они

сгруппированы по периоду (час, день, месяц).• Есть возможность считать уников (например кол-во уникальных

пользователей загрузивших сегодня фотографии)

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

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

Page 46: Architechture of a social network for 30M users

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

SharedQueue серверРеализация очереди сообщений в оперативной памяти.

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

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

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

Page 47: Architechture of a social network for 30M users

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

Интерфейс статистики

Page 48: Architechture of a social network for 30M users

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

Интерфейс статистики

Page 49: Architechture of a social network for 30M users

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

Подводя итоги

• Нет преждевременной оптимизации• Нет трендам, да цифрам• Не бойтесь экспериментировать• Проверяйте все сами• Включайте мозг

Page 50: Architechture of a social network for 30M users

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

Вопросы

Спасибо за внимание!