Проектирование ПО для высоконагруженных систем
Лекция №9
Александр Быков
Лекция 9
Архитектура проектов Mail.Ru. Часть 2
• Фото
• Блоги
• Видео
• Мой Мир
Лекция 9
foto.mail.ru (январь 2005 года)
mirage*.i
st*.i
photost*.i
photo-db*.i
Лекция 9
foto.mail.ru: Схема
mirage*.i
photodb*.i
CSS lf*photo*.i
photost*.i
photo*.iRR DNS
apache + mod_perl
st*.i
photo
imagine
Load Balancer
mpopd
mysql
photod
mysql
mysql
mysql
mpop
foto.mail.ru
img.foto.mail.ru
Лекция 9
foto.mail.ru: Компоненты
• Специальный storage картинок - photod
• По образу и подобию mpopd
• Отличия: threads, BDB с транзакциями
• Специальный веб-сервер для отдачи картинок с photod –
imagine
• Фронтенды для страниц – стандартный apache +
mod_perl
• Список пользователей и каталоги фото по темам в mysql
• Движок базы данных MyISAM
• Авторизация через почтовые st*.i с сессией в BDB-файле
Лекция 9
foto.mail.ru: Логика
• Таблица photo_user где хранятся IP:Port для photod
• Список альбомов храним в ключе BDB через запятую
• Список картинок храним в ключе для альбома через
запятую
• Складываем в photost*.i картинки с именами:
p-1.jpg (preview), i-1.jpg (resized), s-1.jpg (original)
• Комментарии к фото тоже в ключах BDB
Лекция 9
foto.mail.ru: Проблемы
• Главная страница ходит на хит в mysql за списком фото
• Главная, каталог и страницы фото отдаются perl-
скриптами
• BDB с транзакциями начинает периодически клинить
• Файлы BDB начинают биться на комментировании
топовых фото
Лекция 9
foto.mail.ru: Хотфиксы
• Предгенерим главную и каталог скриптами по cron
• Приходится делать шаблон генерящий другой шаблон
• Учим imagine показывать шаблоны и бизнес-логике
• Переводим показ популярных страниц на imagine
Лекция 9
foto.mail.ru: Результаты
• Проект стабильно работает и становится крупнейшим в
нише
• Поддержки не требует, хорошо масштабируется
• Иногда бьются BDB-базы но в целом жить можно
• Потенциальное узкое место - таблица пользователей
• Перемещение пользователей между photost* создает
нагрузку
Лекция 9
blogs.mail.ru (декабрь 2005 года)
mirage*.i
st*.i
photo-db*.i
Лекция 9
Фронтенды
mirage*.i
jbase*.i
CSS lf*bf*.i
apache + mod_perl
st*.i
Load Balancer
mpopd
mysql
mysql
mysql
mysql
mpop
blogs.mail.ru
photost*.iphotost*.iavt*.iRR DNS
photo
imagine
avt.foto.mail.ru
photod
Лекция 9
blogs.mail.ru: Компоненты и логика
• Главная база: список пользователей, лента всех записей
• Шарды пользователей: записи и комментарии
• Главная страница предгенерится как на фото
• Аватары: храним на фото как картинки вида a-1.jpg
• Дерево комментариев: структура dbtree
• InnoDB так как нужны транзакции для вставки
комментариев
Лекция 9
blogs.mail.ru: Компоненты и логика
• Главная база: список пользователей, лента всех записей
• Шарды пользователей: инфо, друзья, записи,
комментарии
• Главная страница предгенерится как на фото
• Аватары: храним на фото как картинки вида a-1.jpg
• Дерево комментариев: структура dbtree
• База InnoDB: транзакции для вставки комментариев
Лекция 9
blogs.mail.ru: Недостатки
• Большая нагрузка на таблицу с индексом всех записей
• Нагрузка на шарды довольно заметная из-за
комментариев
• Дорогой мув пользователей между шардами
• Неудачно выбрали Random в качестве ключа
Лекция 9
video.mail.ru
Лекция 9
video.mail.ru
• Клон фото с минимальными изменениями
• Нужно добавить флеш-плеер
• Нужно сделать пересжатие видео при заливке
• Нужно немного поправить шаблоны
• Приготовиться хранить много контента
• Приготовиться отдавать очень много трафика
Лекция 9
my.mail.ru
CSS
mirage*.i
st*.i
photo-db*.i
Лекция 9
my.mail.ru: Версия 1
myst*.i
mybase*.i
lb*.i lf*my*.i
nginxapache + mod_perlmymail (imagine)
photost*.i
Load Balancer
mysql
mysql
photomy.mail.ru
st*.ist*.impop
st*.imirage*.imysql
Лекция 9
my.mail.ru: Проблемы
• Активность в соц.сети сильно выше чем в блогах
• Кол-во событий в ленте на порядки больше
• Выборки по базам более сложные и тяжелые
• Многие вещи вроде поиска по 2-ому кругу невозможны
• MySQL плохо работает на сложных индексах
Лекция 9
my.mail.ru: Поиск решений
• Пробуем Oracle вместо MySQL
• Кешируем все что можно и что нельзя в memcached
• Пробуем писать специализированный сервер графа
• Oracle начинает непрогнозируемо ложиться под
нагрузкой
• Мигрируем все обратно на MySQL упрощая обратно
запросы
• Пробуем писать специализированные БД
• Боремся с недоступностью машин написанием pinger
• Делаем оффлайн обработку тяжелых запросов (queued)
CSS
mirage*.i
st*.i
photo-db*.i
Лекция 9
my.mail.ru: Версия N
mymras*.i
mybase*.ilb*.i lf*my*.i
nginxapache + mod_perlmymail (imagine)
mytarantool*.i
Load Balancer
mysql
iproto
iproto
my.mail.ru
st*.imygraph*.iiproto
mypinger*.i
mysender*.i
st*.imyraker*.i
st*.imysearch*.i
st*.imyqueued*.i
iproto
iproto
iproto
st*.imyhist*.i
st*.imusicst*.i
myshare*.i
myapi*.i
Лекция 9
mymail (imagine)
• Главная страница
• Страница друзей
• AJAX-запросы «Что нового ?»
• Статистика по пикселям
• mycomet – push-уведомления
Лекция 9
opengraph
• Хранит связи между пользователями и сущностями
• Поддерживает однонаправленные и двунаправленные
связи
• Возможность раскраски разными типами связей
• Шардинг осуществляется группами по 3 сервера
• Каждый сервер имеет 2 реплики на 2-х других серверах
группы
• На каждом сервере стоит silverproxy
• silverproxy собирает данные по запросу со всех шардов
• silverproxy умеет проверять доступность серверов в
pinger
• silverproxy умеет ходить в реплику когда недоступен
мастер
Лекция 9
opengraph
• Дружба (двунапр.) предложения дружбы
• Игнор и блок-листы
• Установленные приложения и загруженная музыка
Лекция 9
silverdialogues + silverdsp
• silverdialogies хранит LRU список диалогов по UID
• silverdsp хранит текст переписки между UID1 и UID2
• В silverdsp ключем является UID1+UID2 где UID1 < UID2
• Последние сообщения хранятся в памяти, остальное на
диске
Лекция 9
raker + silverhistory
• raker выступает в роли сервера сборщика
• Берет список друзей пользователя из opengraph
• Собирает по серверам silverhistory последние события
друзей
• Фильтрует по правам доступа и прочей логике
• Сортирует и выбирает последние записи для показа в
ленте
• Последние 100 событий в памяти, остальные на диске
• В silverhistory только id события
• Данные хранятся в silvercomment, silverlike и т.д.
Лекция 9
silversearch
• Принимает изменения анкеты через queued
• Принимает UDP с хитами пользователей по сайту
• Хранит для пользователя компактный массив 60
парамертров
• Например в массиве ID имени и ID фамилии
• Хранит для пользователя 128-битный bloom для
фильтрации
• Ходит в mysql и tarantool для выдачи финального
результата
• Сортирует пользователей по активности
Лекция 9
tarantool
• Часто-используемые поля анкеты
• Несколько space под разные поля
• Тело писем уведомлений (индекс в queued)
• Уведомления (вставка со сдвигом на lua)
• Гости (вставка со сдвигом на lua)
• Лайки (md5(url), кол-во и список полайкавших)
Лекция 9
queued
• Нумерованные очереди без приоритетов
• Настройка очереди: сдвиг времени активации
• Кортеж: queue_id, id, data, activation_time
• Операции: добавление, обновление, удаление, выборка
• При выборке activation_time сдвигается на timeout
Лекция 9
queued
• «Что нового ?»
• Письма-уведомления на e-mail
• Очередь проверки антиспама
• Социальная модерация
• Управляется qmanager который управляет кол-вом
worker под каждую задачу и распределяет их по
серверам
Спасибо за вниманиеАлександр Быков