HighLoad++ 2017
Зал «Мумбай», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/3045.html
Как мы заставили Druid работать в Одноклассниках.
«Druid is a high-performance, column-oriented, distributed data store» http://druid.io.
Мы расскажем о том, как, внедрив Druid, мы справились с ситуацией, когда MSSQL-based система статистики на 50 терабайт стала:
- медленной: средняя скорость ответа была в разы меньше требуемой (и увеличилась в 20 раз);
- нестабильной: в час пик статистика отставала до получаса (теперь ничего не отстает);
- дорогой: изменилась политика лицензирования Microsoft, расходы на лицензии могли составить миллионы долларов.
...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2964.html
Одноклассники состоят из более чем восьми тысяч железных серверов, расположенных в нескольких дата-центрах. Каждая из этих машин была специализированной под конкретную задачу - как для обеспечения изоляции отказов, так и для обеспечения автоматизированного управления инфраструктурой.
...
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3032.html
Протокол DNS на семь лет старше, чем Всемирная паутина. Стандарты RFC 882 и 883, определяющие основную функциональность системы доменных имён, появились в конце 1983 года, а первая реализация последовала уже годом позже. Естественно, что у технологии столь старой и при этом по сей день активнейшим образом используемой просто не могли не накопиться особенности, неочевидные обыкновенным пользователям.
...
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Ontico
HighLoad++ 2017
Зал «Калининград», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/3010.html
В этом докладе я расскажу, как BigData-платформа помогает трансформировать Почту России, как мы управляем построением и развитием платформы. Расскажу про найденные удачные решения, например, как разбиение на продукты с понятными SLA и интерфейсами между ними помогло нам сохранять управляемость с ростом масштабов проекта.
...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/2914.html
Казалось бы, что нужно для организации тестового окружения? Тестовая железка и копия боевого окружения - и тестовый сервер готов. Но как быть, когда проект сложный? А когда большой? А если нужно тестировать одновременно много версий? А если все это вместе?
Организация тестирования большого развивающегося проекта, где одновременно в разработке и тестировании около полусотни фич - достаточно непростая задача. Ситуация обычно осложняется тем, что иногда есть желание потрогать еще не полностью готовый функционал. В таких ситуациях часто возникает вопрос: "А куда это можно накатить и где покликать?"
...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 18:00
Тезисы:
http://www.highload.ru/2017/abstracts/2854.html
Из этого доклада вы узнаете о возможностях репликации и автофейловера PostgreSQL, в том числе о возможностях, ставших доступных в PostgreSQL 10.
Среди прочих, будет затронуты следующие темы:
* Виды репликации и решаемые с ее помощью проблемы.
* Настройка потоковой репликации.
* Настройка логической репликации.
* Настройка автофейловера / HA средствами Stolon и Consul.
После прослушивания доклада вы сможете самостоятельно настраивать репликацию и автофейловер PostgreSQL.
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 17:00
Тезисы:
http://www.highload.ru/2017/abstracts/3096.html
PostgreSQL is the world’s most advanced open source database. Indeed! With around 270 configuration parameters in postgresql.conf, plus all the knobs in pg_hba.conf, it is definitely ADVANCED!
How many parameters do you tune? 1? 8? 32? Anyone ever tuned more than 64?
No tuning means below par performance. But how to start? Which parameters to tune? What are the appropriate values? Is there a tool --not just an editor like vim or emacs-- to help users manage the 700-line postgresql.conf file?
Join this talk to understand the performance advantages of appropriately tuning your postgresql.conf file, showcase a new free tool to make PostgreSQL configuration possible for HUMANS, and learn the best practices for tuning several relevant postgresql.conf parameters.
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/3115.html
During this session we will cover the last development in ProxySQL to support regular expressions (RE2 and PCRE) and how we can use this strong technique in correlation with ProxySQL's query rules to anonymize live data quickly and transparently. We will explain the mechanism and how to generate these rules quickly. We show live demo with all challenges we got from the Community and we finish the session by an interactive brainstorm testing queries from the audience.
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/2957.html
Расскажем о нашем опыте разработки модуля межсетевого экрана для MySQL с использованием генератора парсеров ANTLR и языка Kotlin.
Подробно рассмотрим следующие вопросы:
— когда и почему целесообразно использовать ANTLR;
— особенности разработки ANTLR-грамматики для MySQL;
— сравнение производительности рантаймов для ANTLR в рамках задачи синтаксического анализа MySQL (C#, Java, Kotlin, Go, Python, PyPy, C++);
— вспомогательные DSL;
— микросервисная архитектура модуля экранирования SQL;
— полученные результаты.
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/3114.html
ProxySQL aims to be the most powerful proxy in the MySQL ecosystem. It is protocol-aware and able to provide high availability (HA) and high performance with no changes in the application, using several built-in features and integration with clustering software. During this session we will quickly introduce its main features, so to better understand how it works. We will then describe multiple use case scenarios in which ProxySQL empowers large MySQL installations to provide HA with zero downtime, read/write split, query rewrite, sharding, query caching, and multiplexing using SSL across data centers.
MySQL Replication — Advanced Features / Петр Зайцев (Percona)Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2954.html
MySQL Replication is powerful and has added a lot of advanced features through the years. In this presentation we will look into replication technology in MySQL 5.7 and variants focusing on advanced features, what do they mean, when to use them and when not, Including.
When should you use STATEMENT, ROW or MIXED binary log format?
What is GTID in MySQL and MariaDB and why do you want to use them?
What is semi-sync replication and how is it different from lossless semi-sync?
...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Ontico
HighLoad++ 2017
Зал «Кейптаун», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3120.html
Количество разработчиков мобильных приложений Сбербанк Онлайн с начала 2016 года выросло на порядок. Для того чтобы продолжать выпускать качественный продукт, мы кардинально перестраиваем процесс разработки.
Количество внутренних заказчиков тех или иных доработок в какой-то момент выросло настолько, что разработчики стали узким местом. Мы внедрили культуру разработки, которую можно условно назвать "внутренним open-source", сохранив за собой контроль над архитектурой и качеством проекта, но позволив разрабатывать новые фичи всем желающим.
...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/2858.html
Аудитория Одноклассников превышает 73 миллиона человек в России, СНГ и странах дальнего зарубежья. При этом ОК.ru - первая социальная сеть по просмотрам видео в рунете и крупнейшая сервисная платформа.
Качественный и количественный рост DDoS-атак за последние годы превращает их в одну из первоочередных проблем для крупнейших интернет-ресурсов. В зависимости от вектора атаки “узким” местом становится та или иная часть инфраструктуры. В частности, при SYN-flood первый удар приходится на систему балансировки трафика. От ее производительности зависит успех в противостоянии атаке.
...
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 15:00
Тезисы:
http://www.highload.ru/2017/abstracts/3008.html
Никогда не было и вот снова случилось! Компания Google в результате перенаправления трафика сделала недостпуными в Японии несколько тысяч различных сервисов, большинство из которых никак не связано с самой компанией Google. Однако, подобные инциденты происходят с завидной регулярностью, вот только не всегда попадают в большие СМИ. У таких инцидентов могут быть разные причины, начиная от ошибок сетевых инженеров и заканчивая государственным регулированием.
...
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)Ontico
HighLoad++ 2017
Зал «Мумбай», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2925.html
Облака и виртуализация – современные тренды развития IT-технологий. Операторы связи строят свои TelcoClouds на стандартах NFV (Network Functions Virtualization) и SDN (Software-Defined Networking). В докладе начнем с основ виртуализации, далее разберемся, для чего используются NFV и SDN, потом полетим к облакам и вернемся на землю для решения практических задач!
...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 14:00
Тезисы:
http://www.highload.ru/2017/abstracts/2913.html
Изначально будут раскрыты базовые причины, которые заставили появиться такой части механизма СУБД, как кэш результатов, и почему в ряде СУБД он есть или отсутствует.
Будут рассмотрены различные варианты кэширования результатов как sql-запросов, так и результатов хранимой в БД бизнес-логики. Произведено сравнение способов кэширования (программируемые вручную кэши, стандартный функционал) и даны рекомендации, когда и в каких случаях данные способы оптимальны, а порой опасны.
...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 13:00
Тезисы:
http://www.highload.ru/2017/abstracts/2947.html
Apache Ignite — Open Source платформа для высокопроизводительной распределенной работы с большими данными с применением SQL или Java/.NET/C++ API. Ignite используют в самых разных отраслях. Сбербанк, ING, RingCentral, Microsoft, e-Therapeutics — все эти компании применяют решения на основе Ignite. Размеры кластеров разнятся от всего одного узла до нескольких сотен, узлы могут быть расположены в одном ЦОД-е или в нескольких геораспределенных.
...
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 12:00
Тезисы:
http://www.highload.ru/2017/abstracts/3005.html
Когда мы говорим о нагруженных системах и базах данных с большим числом параллельных коннектов, особый интерес представляет практика эксплуатации и сопровождения таких проектов. В том числе инструменты и механизмы СУБД, которые могут быть использованы DBA и DevOps-инженерами для решения задач мониторинга жизнедеятельности базы данных и ранней диагностики возможных проблем.
...
Как мы учились чинить самолеты в воздухе / Евгений Коломеец (Virtuozzo)Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/2975.html
Все мы слышали про изменение кода ядра Linux на лету (kernel live patching). Но кто-нибудь проводит подобные фокусы в user space? Оказалось, что да. Мы тоже попробовали.
И получилось.
Длинная дорога технологии Userspace Live Patching в жизнь:
Что такое Live Patching
1) Изменение части логики процесса.
2) Сохранение состояния процесса.
3) Делать 1+2 БЕЗОПАСНО.
...
Java и Linux — особенности эксплуатации / Алексей Рагозин (Дойче Банк)Ontico
HighLoad++ 2017
Зал «Рио-де-Жанейро», 8 ноября, 11:00
Тезисы:
http://www.highload.ru/2017/abstracts/2884.html
Java на Linux встречается повсеместно в информационных системах от больших данных до новомодных serverless архитектур. Как Linux, так и Java имеют свои эксплуатационные нюансы. Понимание этих нюансов важно, чтобы заставить стек Java + Linux работать стабильно и эффективно.
Но на практике "джависты" очень любят мыслить кроссплатформенно и не хотят разбираться с особенностями операционной системы, a "линускоиды" считают JVM чуждым миру Linux процессом, пожирающим всю доступную на сервере память.
А потом появляется Docker, и нюансов становится ещё больше...
Цель доклада - рассказать "джавистам" про Linux и Docker, а "линуксоидам" про JVM.
Как построить кластер для расчета сотен тысяч high-CPU/high-MEM-задач и не ра...Ontico
HighLoad++ 2017
Зал «Найроби + Касабланка», 8 ноября, 16:00
Тезисы:
http://www.highload.ru/2017/abstracts/2996.html
Наш проект – это облачный CI-сервис, на котором пользователи запускают тесты разрабатываемых проектов.
В этом году система автозакупки нашего проекта приобрела 37218 машин (Amazon Instances). Это позволило обработать 189488 "задач" (прогонов тестов) наших клиентов.
Тесты – это всегда ресурсоемкие задачи с максимальным потреблением процессорных мощностей и памяти. Мы не можем прогнозировать, сколько параллельных вычислений и в какой момент времени будет. Перед нами стояла задача построения архитектуры системы, которая умеет очень быстро увеличивать, а также быстро уменьшать мощности кластера.
19. Отказ MySQL
• Данные копятся в Realtime-нодах
• Пока не кончатся ресурсы
= предсказуемый запас времени
20. Отказ MySQL
Storage, Coordinator
• Данные копятся в Realtime-нодах
• Пока не кончатся ресурсы
= предсказуемый запас времени
• Cassandra-based DB
• Свежие данные всегда доступны
22. Отказ ZooKeeper
• Удалить данные ZK
• Иметь запас памяти в ZK
• Корректно завершать Historical
• Стартовать Historical с паузой
• Убрать ненужные чтения
• Убрать ненужные данные
Что делать?
60. Истинно тяжелый запрос
• 2TB
• 74 секунды
• Приоритеты
• Надо выставлять в запросе
• Работают на уровне очереди
61. • Отказ MySQL предсказуем
• Для ZooKeeper: запас памяти, корректно
завершать Historical, а стартовать с паузой
• Realtime не гарантирует exactly-once
• Подбор размера сегмента и частоты сброса на
диск
• Использовать Selector
• Разбивать большое измерение на мелкие
• Приоритеты на уровне очереди
71. Данные: название источника данных, 2016
74
Слайд с текстом
Подзаголовок
• Далтон Трамбо, один из самых успешных голливудских сценаристов, автор
«Римских каникул» и «Спартака», не подозревал, что черный список
«Hollywood 10» реально существует, пока сам не попал туда и не был навсегда
выкинут из жизни фабрики грез;
• Премьера «Трамбо» состоялась в программе «специальный показ» на
кинофестивале в Торонто в сентябре 2015 года. Выход картины в широкий
прокат состоялся 6 ноября 2015 года.
73. Данные: название источника данных, 2016
76
Слайд с двумя цифрами
63
Подпись
в две строчки
%
27
Подпись
в две строчки
млн
74. Данные: название источника данных, 2016
77
Изображение с комментарием
Стиль изображений
Зайдите в Quick Styles.
Выберите стиль с тенью
75. Данные: название источника данных, 2016
78
Вертикальный скриншот Android с комментарием
Скриншот на экране
мобильного телефона
на платформе Android
Вставьте свой скриншот в черное
поле мобильного устройства
76. Данные: название источника данных, 2016
79
Вертикальный скриншот iOS с комментарием
Скриншот на экране
мобильного телефона
на платформе iOs
Вставьте свой скриншот в черное
поле мобильного устройства
79. Данные: название источника данных, 2016
82
Скриншот на экране ноутбука
Скриншот
на экране ноутбука
Вставьте свой скриншот
в черное поле ноутбука
80. Данные: название источника данных, 2016
83
Таблица
Размещения CRM (руб.) Значение
Промо-баннер (ТГБ под аватаркой) 10000 10000 показов
Промо-посты c охватом на свою группу 10000 23000 показов
Оповещения для вступления в группу 10000 8000 показов
Услуги
Промо-баннер (ТГБ под аватаркой) 10000 16000 показов
Промо-посты c охватом на свою группу 10000 28000 показов
Оповещения для вступления в группу 10000 14000 показов
Промо-баннер (ТГБ под аватаркой) 10000 23000 показов
Промо-посты c охватом на свою группу 10000 1 пост
Оповещения для вступления в группу 10000 23000 показов
Промо-баннер (ТГБ под аватаркой) 10000 Бонус
81. 84
Контакты и полезная информация
Поддержка
партнеров
partners@ok.ru
Отдел
продаж
sales@corp.mail.ru
Блог ОК с информацией
о запусках, событиях и др.
insideok.ru
Лучшие кейсы на базе ОК
за последние годы
awards.insideok.ru
Продуктовые
обновления
ok.ru/gruppa
Официальная
группа ОК
ok.ru/ok
Editor's Notes
Всем привет! Меня зовут Невиницин Юрий, я из Одноклассников, и занимаюсь системой внутренней статистики.
Кому нравится мысль о поддержке системы реалтайм аналитики на 50Тб, построеной на MS SQL Server, и в которую логируются миллиарды событий в сутки?
Я расскажу о нашем кейсе миграции такой системы на колоночную базу под названием DRUID, а вы узнаете несколько рецептов его использования.
Зачем нам система статистики?
Она нужна потому что мы хотим знать всё, о своем сайте.
Поэтому мы не только мониторим поведение железа и трафика, нагрузку ЦПУ и на диски, а логируем каждое действие пользователя, все взаимодействия между компонентами сайта, и множество внутрених процессов этих компонентов.
Система статистики тесно интегрирована в процесс разработки сайта.
Менеджеры оценивают эффективность сайта, устанавливают или корректируют цели, отслеживают как они достигнуты.
Администраторы и разработчики следят за работой всех систем, расследуют аномалии.
Автоматический мониторинг на ранней стадии выявляют неполадки в работе сайта; а также строят прогнозы по превышению различных лимитов.
Кроме этого постоянно идут апдейты, эксперименты, запуск фич, и эффект от всех этих действий отслеживается через систему статистики.
Статистика у нас отображается в основном в виде графиков.
Графики у нас бы
Обычно мы выводим графики сразу за 5 дней, чтобы сразу визуально понятно, сейчас идет всё как обычно, или хуже, или лучше.
Этот же график можно разложить по параметру.
Второй виз графиков - долгосрочный. Здесь мы смотрим месячные и годовые тренды.
Графики у нас не статичны.
Мы можем изменить параметры и сразу увидеть результат.
Можно выбрать любую дату за последние 2 года, можно задать любые фильтры и группировку.
После того, как график настроен, его можно сохранить в дашборд, чтобы в одном месте смотреть графики по какой-то теме.
И это удобно, поэтому редко кто смотрит отдельные графики, чаще открывают сразу дашборд, даже если надо посмотреть всего пару графиков из сотни, что конечно только увеличивает нагрузку на систему статистики.
Хочу отдельно отметить, что пользователи не приходят в отдел статистики «создайте мне график с такими-то фильтрами и группировками».
Они все графики и дашборды создают сами с произвольными фильтрами и группировками.
Нет никаких предагрегатов, всё обсчитывается на лету.
Вроде не сложная система.
Но это пока данных относительно мало.
MS SQL Server справлялся, но по мере роста объема данных, система замедлялась.
Замедлялась загрузка данных в неё и увеличивалось время построения графика.
Мы доросли до такого объема, что загрузка некоторых таблиц в час пик отставала на полчаса.
А среднее время отдачи одного графика было 6 секунд. То есть кто-то получал график за 2-3 секунды, а кто-то за 20-30 секунд, а кто-то и за минуты.
Когда расследуешь аномалию, надо рассмотреть десяток графиков, которые следуют один из другого, их нельзя открыть одновременно, и приходилось 10 раз ждать по 30 секунд. Это бесит. Дико бесит.
Менеджеры показывают свои ключевые графики каждую неделю, в том числе и годовые, им приходилось открывать дашборды за 20 минут до митинга.
Можно было выжимать еще производительность, добавить серверов и как-то в ручную разносить данные, но майкрософт в то же время изменил политику лицензирования.
И продолжи мы использовать SQL, нам пришлось бы отдать миллионы долларов за лицензии.
Поэтому мы решили сразу сделать как надо.
А именно,
чтобы график открывался за 2 сек,
дашборд за 10,
статистика не отставала, была всегда доступна и переживала потерю датацентра,
масштабируема,
с открытым кодом, чтобы затачивать под себя, и желательно на java.
И друид именно это нам и обещал.
Это колоночная и распределенная база.
Также там есть предагрегация и индескация во время вставки, и те типы запросов которые нам нужны.
Получалось, что мы легко сможем заменить SQL server на друид.
Разумеется, мы рассматривали и другие варианты
PostgreSQL - не масштабируемо и не высокодоступно
influx, vertica - дорого и закрыто (как следствие, высокая доступность под вопросом)
prometheus - не масштабируемо и не высокодоступно
opentsdb - нет индексов и производительнось под вопросом
clickhouse - тогда еще не было
Мы внедрили друид, смигрировали в него исторические данные из MSSQL, и всё у нас залетало.
Просмотры графиков увеличились в 5 раз, буквально в день переключения на друид.
Стали запускать более тяжелую статистику, которую боялись запускать на старой системе.
Сэкономили миллионы долларов
И наш друид сопровождает 1 человек.
В час пик наш кластер из 12 машин получает полмиллиона событий в секунду.
И у нас есть довольно большой запас прочности.
Это не тесты, это получено на наших реальных данных.
всё это здорово и красиво. но что же было на самом деле?
Для начала немного про сам друид.
У друида есть несколько внешних зависимостей.
Ему нужен сторадж, там друид хранит только хранит данные.
Также ему нужна база для метаданных. Там друид хранит сведения о том, где что лежит в сторадже.
zk. нужен для дискавери и для объявления, какая нода какие данные обслуживает.
и кеш, это или мемкеш или встроеный.
realtime ноды загружают свежие данные и обрабатывают запросы по ним.
historical - эти ноды держат всю массу данных и обрабатывают запросы по ним. данные здесь не меняются.
broker - отвечает за распределение вычислений между historical и realtime нодами, и за кеширование.
Coordinator - распределяет сами данные по historical нодам, на основании метаданных в mysql.
Друид – это распределенная колоночная база данных.
Вот наши данные, более-менее упорядоченные по времени.
Реалтайм нода берет эти данные, индескирует и нарезает на сегменты по времени, например, по суткам или по часам.
В друиде сегмент является минимальной единицей данных. Все операции всегда происходят по-сегментно.
Каждый новый сегмент пишется в сторадж и уже никогда не меняется, при этом реалтайм нода по прежнему хранит свою копию этого сегмента.
После этого записываются метаданные, что этот сегмент находится в сторадже по такому-то адресу.
Координатор периодически перечитывает метадату, и когда находит новый сегмент, через зукипер приказывает некоторым историческим нодам взять этот сегмент, чтобы обрабатывать запросы по нему.
исторические ноды обслуживают всю массу данных, кроме самых свежих. Когда мы говорим что у нас кластер на 300ТБ, это это как раз про них.
Исторические ноды скачивают сегмент, и через зукипер сообщают об этом всем.
Когда реалтайм нода получает это сообщение, она удаляет свою копию сегмента, чтобы освободить ресурсы для новых данных.
Брокер тоже получает эти сообщения из зукипера, и узнаёт на каких нодах какой сегмент лежит. И когда приходит запрос, он разделяет его по сегментам и отправляет по нужным нодам. Потом он дождется всех ответов, доагрегирует и отправит клиенту.
Друид – это распределенная колоночная база данных.
Вот наши данные, более-менее упорядоченные по времени.
Реалтайм нода берет эти данные, индескирует и нарезает на сегменты по времени, например, по суткам или по часам.
В друиде сегмент является минимальной единицей данных. Все операции всегда происходят по-сегментно.
Каждый новый сегмент пишется в сторадж и уже никогда не меняется, при этом реалтайм нода по прежнему хранит свою копию этого сегмента.
После этого записываются метаданные, что этот сегмент находится в сторадже по такому-то адресу.
Координатор периодически перечитывает метадату, и когда находит новый сегмент, через зукипер приказывает некоторым историческим нодам взять этот сегмент, чтобы обрабатывать запросы по нему.
исторические ноды обслуживают всю массу данных, кроме самых свежих. Когда мы говорим что у нас кластер на 300ТБ, это это как раз про них.
Исторические ноды скачивают сегмент, и через зукипер сообщают об этом всем.
Когда реалтайм нода получает это сообщение, она удаляет свою копию сегмента, чтобы освободить ресурсы для новых данных.
Брокер тоже получает эти сообщения из зукипера, и узнаёт на каких нодах какой сегмент лежит. И когда приходит запрос, он разделяет его по сегментам и отправляет по нужным нодам. Потом он дождется всех ответов, доагрегирует и отправит клиенту.
Когда мы говорим о высокой доступности и видим в списке зависимостей mysql, сразу возникает вопрос
Что будет если он упадет?
Всё будет работать как раньше, просто данные в realtime начнут копиться.
realtime не сможет записать сведения о новых сегментах в mysql, а координатор не сможет прочитать эти сведения и распределить новый сегмент по historical.
копиться данные могут безболезненно пока не кончатся ресурсы (место на диске, цпу или память), но это происходит предсказуемо.
вы знаете какой у вас поток данных, и можете расчитать, какой есть запас времени, чтобы починить mysql, и никто ничего не заметил.
И, кстати, ровно то же самое будет в случае отказа стораджа и координатора.
Но мы всё же решили подстраховаться, и сделали две вещи.
Первое, мы заменили mysql на cassandra-based-sql, просто потому что у нас это уже есть, грех не использовать.
И второе, ограничили realtime в ресурсах, и когда данных накопиться слишком много, самые старые данные не удаляются, но запросы по ним не обслуживаются.
Это сделано исходя из того, что если накопилось так много данных, что realtime не может работать, то скорее всего это глобальная авария, и поэтому свежие данные для нас важнее всего.
С zk, всё не только лучше, но и хуже.
Лучше т.к. он сам по себе высокодоступный, с репликацией, и казалось бы что может случиться.
Когда мы работаем с zk, мы хотим быстро узнавать об изменениях, например, о зависшей ноде, она должна быстро исчезнуть, чтобы мы не отправляли запросы в никуда. Для этого мы должны выставить небольшой таймаут.
Что произойдет когда сессия отвалится по таймауту? "Её" данные будут удалены, и всё остальные клиенты об этом узнают.
Сама нода, если она жива, тоже об этом узнает, и создаст ��овую сессию, и запишет и прочитает все, что нужно.
Друид в зукипере держит информацию, какие сегменты на каких нодах. Когда сегментов станет много, да еще и в трех репликах, тогда этот процесс становится болезненным. У нас снапшот zk достигал 6 гигов.
И вот одна нода zk притормозила так, что таймауты истекли, часть клиентов повылетала, перешла на другие ноды и начала перевычитывать и перезаписывать данные.
Трафик зукиперных нод упирается в потолок, и входящий, и исходящий.
Начинают отваливаться другие ноды, и еще добавляют трафика.
Эта лавина растет пока все не отвалятся, а зукиперы не потеряют синхронизацию.
Как это отразится у пользователя?
Когда брокер отключается от зукипера и истекает таймаут сессии, он по факту теряет всё свое знание о том какие данные доступны для запроса и на каких нодах они лежали. И он ничего не показывает, то есть друид не работает на чтение.
Это полностью вылечить нельзя.
А пока, когда такое случается, самое простое, что можно сделать, это грохнуть все данные zk и поднять его пустым.
Через некоторое время всё заработает само.
Кроме того нужно держать запас по памяти двухкратный, потому что если сессия не истечет, а ноды перезапустятся без корректного завершения, они заново запишут свои данные, таким образом, пока не истек таймаут старой сессии, данные в zk будут задублированы.
Поэтому обязательно давайте historcal нодам корректно завершиться.
И еще. Historical нужно стартовать не одновременно, а с паузой хотя бы в минуту, т.к. при старте они сначала читают с дисков, какие данные у них есть, а потом записывают это всё в зукипер.
Если они начнут это делать одновременно, то мы опять рискуем поднять лавину трафика.
Чтобы минимизировать вероятность такого сценария, мы сделали так, чтобы полные данные из zk вычитывали только брокеры, координаторы и реалтайм, т.к. historical и всему остальному они не нужны.
И мы стали записывать в zk урезанные метаданные, только то что реально нужно (имя таблицы, время, версия, номер шарда, и размер). И это сократило размер данных в zk почти в три раза, а трафик раз в 6-8.
В оригинальном друиде эту проблему сейчас решают уносом этих данных из zk
Как происходит загрузка в друид?
Посмотрите на схему загрузки данных.
Процесс загрузки данных периодически сбрасывает загруженное на диск, а чтобы по этим данным обслуживать запросы, они подтягиваются mmap-ом.
После рестарта эти части так же подтягиваются, и остается дозагрузить небольшой кусочек данных, который не был сброшен на диск.
Накапливается много таких частей, и они объединяются в один конечный сегмент, который уже никогда не поменяется.
И с этим было два момента.
Первый, -- это искажение данных Realtime нодами.
Во время миграции мы конечно же сделали сверку между старой отлаженной системой и друидом.
И мы с разочарованием обнаружили, что реалтайм ноды могут терять или дублировать данные.
Это происходит при сбоях железа, креша JVM и даже во время корректного завершения.
Потому что проиндексированные данные сбрасываются на диск отдельно, а позиция в источнике (с какого места начинать после рестарта) пишется отдельно. И дальше в зависимости, от того, что потеряется, произойдет потеря или дублирование.
Избежать эту пролему можно не используя реалтайм ноды.
Тогда нужно использовать indexing service, который загружает в друид данные по-сегментно. Если загрузка оборвется по любой причине, то её просто нужно начать заново. И эти воркеры также умеют обрабатывать запросы, поэтому реалтаймовая аналитика тут тоже есть.
Это сейчас так. А тогда воркеры не принимали запросов, и нам пришлось методично чинить механизм сброса данных на диск.
Справедливости ради, скажу что сейчас на сайте друида отмечено что realtime не гарантирует exactly-once, и починка этого планируется в будущем.
Что можно с этим сделать?
Можно влиять на количество этих частей с помощью настройки размера сегмента, интервала сброса на диск, и максимальное кол-во строк в хипе.
Кроме этого, мы, не зная эти особенности, при миграции все наши фильтры сделали типа regex, так делать не надо, а надо сразу учитавыть какой фильтр указал пользователь, и использовать фильтр типа селектор по максимуму.
Он не сканирует словарь, а находит значение бинарным поиском.
Что можно с этим сделать?
Можно влиять на количество этих частей с помощью настройки размера сегмента, интервала сброса на диск, и максимальное кол-во строк в хипе.
Кроме этого, мы, не зная эти особенности, при миграции все наши фильтры сделали типа regex, так делать не надо, а надо сразу учитавыть какой фильтр указал пользователь, и использовать фильтр типа селектор по максимуму.
Он не сканирует словарь, а находит значение бинарным поиском.
Что можно с этим сделать?
Можно влиять на количество этих частей с помощью настройки размера сегмента, интервала сброса на диск, и максимальное кол-во строк в хипе.
Кроме этого, мы, не зная эти особенности, при миграции все наши фильтры сделали типа regex, так делать не надо, а надо сразу учитавыть какой фильтр указал пользователь, и использовать фильтр типа селектор по максимуму.
Он не сканирует словарь, а находит значение бинарным поиском.
Что можно с этим сделать?
Можно влиять на количество этих частей с помощью настройки размера сегмента, интервала сброса на диск, и максимальное кол-во строк в хипе.
Кроме этого, мы, не зная эти особенности, при миграции все наши фильтры сделали типа regex, так делать не надо, а надо сразу учитавыть какой фильтр указал пользователь, и использовать фильтр типа селектор по максимуму.
Он не сканирует словарь, а находит значение бинарным поиском.
Что можно с этим сделать?
Можно влиять на количество этих частей с помощью настройки размера сегмента, интервала сброса на диск, и максимальное кол-во строк в хипе.
Кроме этого, мы, не зная эти особенности, при миграции все наши фильтры сделали типа regex, так делать не надо, а надо сразу учитавыть какой фильтр указал пользователь, и использовать фильтр типа селектор по максимуму.
Он не сканирует словарь, а находит значение бинарным поиском.
Но это не всё. Самое важно сейчас будет.
История про ленту.
Допустим у нас есть 1000 хостов вида "A.B.C", где есть 10 разных A, 10 разных B, 10 разных C.
Допустим запрос с регуляркой отфильтрует 500 из них.
Получается 1000 проверок регулярки и 500 битмапов нужно объединить.
Теперь посмотрим, что будет если измерение хост, разбить на три отдельных измерения A, B и C, по 10 значений в каждом.
Тогда наш запрос также будет содержать 3 регулярки A=[xyz] && B=[lmn] && C=[ijk]
И отфильтрует те же 500 хостов.
Но это не всё. Самое важно сейчас будет.
История про ленту.
Допустим у нас есть 1000 хостов вида "A.B.C", где есть 10 разных A, 10 разных B, 10 разных C.
Допустим запрос с регуляркой отфильтрует 500 из них.
Получается 1000 проверок регулярки и 500 битмапов нужно объединить.
Теперь посмотрим, что будет если измерение хост, разбить на три отдельных измерения A, B и C, по 10 значений в каждом.
Тогда наш запрос также будет содержать 3 регулярки A=[xyz] && B=[lmn] && C=[ijk]
И отфильтрует те же 500 хостов.
Но это не всё. Самое важно сейчас будет.
История про ленту.
Допустим у нас есть 1000 хостов вида "A.B.C", где есть 10 разных A, 10 разных B, 10 разных C.
Допустим запрос с регуляркой отфильтрует 500 из них.
Получается 1000 проверок регулярки и 500 битмапов нужно объединить.
Теперь посмотрим, что будет если измерение хост, разбить на три отдельных измерения A, B и C, по 10 значений в каждом.
Тогда наш запрос также будет содержать 3 регулярки A=[xyz] && B=[lmn] && C=[ijk]
И отфильтрует те же 500 хостов.
Но это не всё. Самое важно сейчас будет.
История про ленту.
Допустим у нас есть 1000 хостов вида "A.B.C", где есть 10 разных A, 10 разных B, 10 разных C.
Допустим запрос с регуляркой отфильтрует 500 из них.
Получается 1000 проверок регулярки и 500 битмапов нужно объединить.
Теперь посмотрим, что будет если измерение хост, разбить на три отдельных измерения A, B и C, по 10 значений в каждом.
Тогда наш запрос также будет содержать 3 регулярки A=[xyz] && B=[lmn] && C=[ijk]
И отфильтрует те же 500 хостов.
А вот кто-то захотел график за год по вот этим жирным данным.
Он знает, что они жирные и готов подождать.
За год там 2TB.
У нас 18 машин по 10 дисков, тогда с диска нам надо прочитать 11GB, допустим диски читают 150MB/s, 11 гигов они прочитают за 74 секунды.
А как вы думаете, что будут делать остальные пользователи эти 74 секунды?
Они будут материть друид, меня и весь отдел статистики.
И ругаться в чатиках, что ничего не работает.
Как жить дальше, зная что такое может произойти?
Да, друид поддерживает приоритеты запросов, но сам их не приоритизирует, поэтому приоритетами надо управлять как-то снаружи, что не очень-то удобно.
Мы прибили низкий приоритет к самым тяжелым таблицам, раздражения стало меньше, но оно всё равно осталось,
потому что приоритеты запросов работают только на уровне очереди, и если часть тяжелого запроса уже попала в обработк��, всем всё равно придется ждать, хотя уже не так долго.
Поскольку у друида есть все сведения и о запросе, и о данных, по которым он пойдет, мы сделали довольно простую приоритизацию,
Мы выставляем запросу приоритет в зависимости от размера данных, по которым этот запрос пройдет.
Чем больше надо пройти данных, тем меньше приоритет, независимо от "тяжести" таблицы.
И у нас есть 5 очередей и 5 исполнителей с количеством тредов по количеству цпу, каждая из них упорядочивает запросы по приоритету, но имеет при этом свой приоритет на уровне ОС (aka nice), таким образом более быстрые запросы всегда идут вперед, все довольны.
Теперь тяжелые запросы вытесняются, и никто их больше не ждет.
Второй момент это деградация производительности по запросам. Это актуально для загрузки через Indexing service тоже.
Что я имею в виду. Если у historical время растет линейно с количеством строк в сегменте,
то у realtime, оно еще сильно зависит от количества сбросов на диск.
При чем это заметно, как правило, на тяжелых таблицах и всяких неудобных запросах.