31
Проектирование ПО для высоконагруженных систем Лекция №9 Александр Быков

Highload осень 2012 лекция 9

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Highload осень 2012 лекция 9

Проектирование ПО для высоконагруженных систем

Лекция №9

Александр Быков

Page 2: Highload осень 2012 лекция 9

Лекция 9

Архитектура проектов Mail.Ru. Часть 2

• Фото

• Блоги

• Видео

• Мой Мир

Page 3: Highload осень 2012 лекция 9

Лекция 9

foto.mail.ru (январь 2005 года)

Page 4: Highload осень 2012 лекция 9

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

Page 5: Highload осень 2012 лекция 9

Лекция 9

foto.mail.ru: Компоненты

• Специальный storage картинок - photod

• По образу и подобию mpopd

• Отличия: threads, BDB с транзакциями

• Специальный веб-сервер для отдачи картинок с photod –

imagine

• Фронтенды для страниц – стандартный apache +

mod_perl

• Список пользователей и каталоги фото по темам в mysql

• Движок базы данных MyISAM

• Авторизация через почтовые st*.i с сессией в BDB-файле

Page 6: Highload осень 2012 лекция 9

Лекция 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

Page 7: Highload осень 2012 лекция 9

Лекция 9

foto.mail.ru: Проблемы

• Главная страница ходит на хит в mysql за списком фото

• Главная, каталог и страницы фото отдаются perl-

скриптами

• BDB с транзакциями начинает периодически клинить

• Файлы BDB начинают биться на комментировании

топовых фото

Page 8: Highload осень 2012 лекция 9

Лекция 9

foto.mail.ru: Хотфиксы

• Предгенерим главную и каталог скриптами по cron

• Приходится делать шаблон генерящий другой шаблон

• Учим imagine показывать шаблоны и бизнес-логике

• Переводим показ популярных страниц на imagine

Page 9: Highload осень 2012 лекция 9

Лекция 9

foto.mail.ru: Результаты

• Проект стабильно работает и становится крупнейшим в

нише

• Поддержки не требует, хорошо масштабируется

• Иногда бьются BDB-базы но в целом жить можно

• Потенциальное узкое место - таблица пользователей

• Перемещение пользователей между photost* создает

нагрузку

Page 10: Highload осень 2012 лекция 9

Лекция 9

blogs.mail.ru (декабрь 2005 года)

Page 11: Highload осень 2012 лекция 9

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

Page 12: Highload осень 2012 лекция 9

Лекция 9

blogs.mail.ru: Компоненты и логика

• Главная база: список пользователей, лента всех записей

• Шарды пользователей: записи и комментарии

• Главная страница предгенерится как на фото

• Аватары: храним на фото как картинки вида a-1.jpg

• Дерево комментариев: структура dbtree

• InnoDB так как нужны транзакции для вставки

комментариев

Page 13: Highload осень 2012 лекция 9

Лекция 9

blogs.mail.ru: Компоненты и логика

• Главная база: список пользователей, лента всех записей

• Шарды пользователей: инфо, друзья, записи,

комментарии

• Главная страница предгенерится как на фото

• Аватары: храним на фото как картинки вида a-1.jpg

• Дерево комментариев: структура dbtree

• База InnoDB: транзакции для вставки комментариев

Page 14: Highload осень 2012 лекция 9

Лекция 9

blogs.mail.ru: Недостатки

• Большая нагрузка на таблицу с индексом всех записей

• Нагрузка на шарды довольно заметная из-за

комментариев

• Дорогой мув пользователей между шардами

• Неудачно выбрали Random в качестве ключа

Page 15: Highload осень 2012 лекция 9

Лекция 9

video.mail.ru

Page 16: Highload осень 2012 лекция 9

Лекция 9

video.mail.ru

• Клон фото с минимальными изменениями

• Нужно добавить флеш-плеер

• Нужно сделать пересжатие видео при заливке

• Нужно немного поправить шаблоны

• Приготовиться хранить много контента

• Приготовиться отдавать очень много трафика

Page 17: Highload осень 2012 лекция 9

Лекция 9

my.mail.ru

Page 18: Highload осень 2012 лекция 9

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

Page 19: Highload осень 2012 лекция 9

Лекция 9

my.mail.ru: Проблемы

• Активность в соц.сети сильно выше чем в блогах

• Кол-во событий в ленте на порядки больше

• Выборки по базам более сложные и тяжелые

• Многие вещи вроде поиска по 2-ому кругу невозможны

• MySQL плохо работает на сложных индексах

Page 20: Highload осень 2012 лекция 9

Лекция 9

my.mail.ru: Поиск решений

• Пробуем Oracle вместо MySQL

• Кешируем все что можно и что нельзя в memcached

• Пробуем писать специализированный сервер графа

• Oracle начинает непрогнозируемо ложиться под

нагрузкой

• Мигрируем все обратно на MySQL упрощая обратно

запросы

• Пробуем писать специализированные БД

• Боремся с недоступностью машин написанием pinger

• Делаем оффлайн обработку тяжелых запросов (queued)

Page 21: Highload осень 2012 лекция 9

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

Page 22: Highload осень 2012 лекция 9

Лекция 9

mymail (imagine)

• Главная страница

• Страница друзей

• AJAX-запросы «Что нового ?»

• Статистика по пикселям

• mycomet – push-уведомления

Page 23: Highload осень 2012 лекция 9

Лекция 9

opengraph

• Хранит связи между пользователями и сущностями

• Поддерживает однонаправленные и двунаправленные

связи

• Возможность раскраски разными типами связей

• Шардинг осуществляется группами по 3 сервера

• Каждый сервер имеет 2 реплики на 2-х других серверах

группы

• На каждом сервере стоит silverproxy

• silverproxy собирает данные по запросу со всех шардов

• silverproxy умеет проверять доступность серверов в

pinger

• silverproxy умеет ходить в реплику когда недоступен

мастер

Page 24: Highload осень 2012 лекция 9

Лекция 9

opengraph

• Дружба (двунапр.) предложения дружбы

• Игнор и блок-листы

• Установленные приложения и загруженная музыка

Page 25: Highload осень 2012 лекция 9

Лекция 9

silverdialogues + silverdsp

• silverdialogies хранит LRU список диалогов по UID

• silverdsp хранит текст переписки между UID1 и UID2

• В silverdsp ключем является UID1+UID2 где UID1 < UID2

• Последние сообщения хранятся в памяти, остальное на

диске

Page 26: Highload осень 2012 лекция 9

Лекция 9

raker + silverhistory

• raker выступает в роли сервера сборщика

• Берет список друзей пользователя из opengraph

• Собирает по серверам silverhistory последние события

друзей

• Фильтрует по правам доступа и прочей логике

• Сортирует и выбирает последние записи для показа в

ленте

• Последние 100 событий в памяти, остальные на диске

• В silverhistory только id события

• Данные хранятся в silvercomment, silverlike и т.д.

Page 27: Highload осень 2012 лекция 9

Лекция 9

silversearch

• Принимает изменения анкеты через queued

• Принимает UDP с хитами пользователей по сайту

• Хранит для пользователя компактный массив 60

парамертров

• Например в массиве ID имени и ID фамилии

• Хранит для пользователя 128-битный bloom для

фильтрации

• Ходит в mysql и tarantool для выдачи финального

результата

• Сортирует пользователей по активности

Page 28: Highload осень 2012 лекция 9

Лекция 9

tarantool

• Часто-используемые поля анкеты

• Несколько space под разные поля

• Тело писем уведомлений (индекс в queued)

• Уведомления (вставка со сдвигом на lua)

• Гости (вставка со сдвигом на lua)

• Лайки (md5(url), кол-во и список полайкавших)

Page 29: Highload осень 2012 лекция 9

Лекция 9

queued

• Нумерованные очереди без приоритетов

• Настройка очереди: сдвиг времени активации

• Кортеж: queue_id, id, data, activation_time

• Операции: добавление, обновление, удаление, выборка

• При выборке activation_time сдвигается на timeout

Page 30: Highload осень 2012 лекция 9

Лекция 9

queued

• «Что нового ?»

• Письма-уведомления на e-mail

• Очередь проверки антиспама

• Социальная модерация

• Управляется qmanager который управляет кол-вом

worker под каждую задачу и распределяет их по

серверам

Page 31: Highload осень 2012 лекция 9

Спасибо за вниманиеАлександр Быков

[email protected]