Система внутренней статистики odnoklassniki.ru Александр Шарак Руководитель отдела статистики Одноклассников Зачем? Менеджеры Статистика Разработчики • • • • Оценивают эффективность Устанавливают цели Отслеживают достижение целей Наблюдают за активностью пользователей • Следят за качеством работы компонентов сайта • Расследуют аномалии Администраторы • Мониторят компоненты сайта • Наблюдают за активностью пользователей • Расследуют аномалии 5-минутный график 5-минутный график Дневной график Графики интерактивны Дешборд http://www.flickr.com/photos/lofink/4501610335/ Собственная WEB-аппликация для работы с дешбордами http://www.flickr.com/photos/lofink/4501610335/ Немного цифр • Сайт логирует больше одного триллиона (1 000 000 000 000) действий в день. • Свежие данные подгружаются с задержкой в 2-3 минуты. Почти в режиме реального времени. • В часы пик сотрудники запрашивают до 40 графиков в секунду. • Отдельный график в среднем высчитывается менее чем за одну секунду. Как мы этого достигли? Агрегация данных Как обычно делают 1. Тысячи серверов логируют действия в локальное или удаленное хранилище(чаще всего это файл). 2. Мега-кластер (например, Hadoop) из сотни серверов забирает эти терабайты (или петабайты) с данными и агрегирует. Как делаем мы 1. Тысячи серверов не логируют каждое действие, а в памяти сразу агрегируют эти действия по: а) типам операций б) значениям классификаторов в) 5 минутам 2. Раз в 5 минут каждый сервер передаёт собранную информацию в одну из четырех промежуточных баз данных (MS SQL) Агрегация данных • Таким образом, мы вместо 10 миллиардов (10 000 000 000) записей за пять минут в час пик получаем всего 10 миллионов (10 000 000). • Задача загрузки данных в DWH стала относительно простой. Загрузка данных Более 3000 серверов Все 4 базы имеют одинаковую структуру. Каждая содержит 300 таблиц Logs - 1 Каждые 5 минут Logs - 2 Logs - 3 Logs - 4 Выгрузка в одном потоке требует 0.5 сек на таблицу Как можно чаще DWH 1 DWH 2 Одна половина …а вторая — таблиц — сюда. сюда… Нормализация Counter Registered HostName Group0 Group2 Calls DurationAvg 5 2012-04-20 12:45:00 bsrvd20-10 createPhotoAlbum customAlbum 2 0 Registered ID_Host ID_AlfaInsureName ID_AlfaInsureParam Calls DurationAvg 2012-04-20 12:45:00 34 11 6 2 0 Структура таблиц • В каждой базе содержится по 150 таблиц с похожей структурой, легко поддающейся автоматизации. Registered ID_Host ID_AlfaInsureName ID_AlfaInsureParam Calls DurationAvg 2012-04-20 12:45:00 2006 1 2 2 0 • В каждой таблице: 1) колонка Registered 2) ссылки на классификаторы 3) измерения Индексы • Индексы на дату и на каждый классификатор (foreign key), как «по учебнику» - не работают. • Сейчас у нас у каждой таблицы один кластерный индекс со структурой (Registered, id_classifier1, id_classifier2…) Агрегаты по дням • Для каждой из 300 таблиц мы построили агрегаты по дням. • Количество записей в этих таблицах в 20 - 150 раз меньше, чем в основных таблицах. Базы с данными за один месяц • Оперативные графики в 99% случаев используют данные не старше одного месяца. • Сделали базу, где храним данные за последний месяц. График Многократный прирост производительности 1% Полный архив 31 день MS SQL partitioning and compression • удаление старых данных за 1 минуту вместо 2 часов • данные на диске «сжались» в 3.5 раза • подсчет графиков ускорился в несколько раз • загрузка данных происходит на 20% медленнее И все тормозит… • На оперативных графиках обычно выводятся данные за 5 дней. • Один день данных одной таблицы по размеру больше среднего занимает 0.5 GB. То есть для 5 дней надо считать с диска 2.5 GB данных. • Дисковая подсистема обеспечивает скорость до 100 Mb/s. Получается 25 сек в эксклюзивном режиме для таблиц больше среднего. • Самый популярный дешборд состоит из 80 графиков. • А если запустить дневной график за месяц или год… Решение! • Представьте, что в момент X кто-то запрашивает некий график. • Через два часа другой пользователь запрашивает тот же график. • Как получить новый график из предыдущего? DWH cache для 5 мин. графика • Вместо чтения 2.5GB надо считывать в 60 раз меньше данных. То есть всего 41Mb. При скорости 100Mb/s это меньше 0.5 сек. • Чем популярней график – тем он быстрее строится. • 99% процентов графиков стали строиться очень быстро. • 1% графиков строится относительно медленно. DWH cache для дневного графика DWH cache • Система стала стабильной… • … но не идеальной На чём написано • • • • • • MS SQL 2008 R2 Enterprise Edition От использования MS SQL Integrity Services мы отказались Весь код загрузки и обработки данных написан на T-SQL Весь код подсчёта графиков также написан на T-SQL Весь код DWH-cache также написан на T-SQL Для построения (rendering) графиков(и отчётов в целом) используем MS SQL Reporting Services Неагрегированные данные • Данные, в которых есть идентификатор пользователя и точная дата со временем • Например: – логины (29.5 млрд записей за 2011 год), платежи, граф дружб, дарение подарков, загруженные фотки и другая информация • Из этих данных мы высчитываем: – количество уникальных пользователей, которые сделали какие-то действия и/или обладают каким-то свойством – например, сколько девушек из Самары 18-23 лет подружилось с юношами из Москвы старше 50 лет • MS SQL 2008 R2 Enterprise Edition • Всю обработку данных пишем на T-SQL • Front-end – MS SQL 2008 R2 Reporting Services OLAP • • • • • • • • • Используем MS SQL 2008 R2 Analysis Services Опыт - один год Построили десять разных кубов Средний объем куба – 1 млрд записей в таблице фактов Объем самого большого куба – 4.5 млрд записей В каждом кубе присутствует мера – distinct count Мера distinct count вынуждает ограничивать объём куба С мерами count и sum проблем нет Мешает ограничение размера одного измерения Ресурсы • Статистикой занимается 4 разработчика – Начал разработку один человек – Разработка первой версии заняла 3 месяца – Каждый год добавляем по одному разработчику • Сервера – 30 (типичный сервер – 2 6-core CPU, 80GB RAM, 6-10TB Disk array): – – – – – – 4 сервера для Reporting Services 2 сервера для front-end 7 серверов для данных 5-минутных и дневных графиков 4 сервера для промежуточных баз данных 6 серверов для статистики об объектах (userid) 7 серверов для OLAP Спасибо за внимание! Александр Шарак Руководитель отдела статистики Одноклассники aleksandr.sharak@odnoklassniki.ru Пожалуйста, поставьте оценку моему докладу. Ваше мнение очень важно. Спасибо!