Часть 12. Wide events: чем они лучше логов и метрик

Почему в ClickHouse отказались от OTel-конвейера ради прямого переноса данных между базами: 37 млн логов/с на 70 ядрах против 2 млн на 800. Разбираем идею широких событий и динамические схемы через Merge.
Опубликовано:

Адаптивный пересказ статьи Scaling Observability beyond 100PB by embracing wide events and replacing OTel из блога ClickHouse. Текст мой, цифры — из оригинала.

Две идеи, которые стоит забрать из этой истории: как хранить телеметрию (широкие события) и сколько стоит лишняя сериализация (очень дорого).

Что такое широкое событие

Обычно телеметрию режут на три несовместимых куска: логи (текст), метрики (числа с ограниченной размерностью), трейсы (структура вызовов). Каждый по-своему теряет информацию.

Широкое событие (wide event) — это одна строка, в которой лежат все относящиеся к событию измерения и метрики сразу: имя пода, IP, имя таблицы, длительность вставки, лаг — вместе, без предварительной агрегации.

Разница проявляется в вопросах, которые можно задать. Классический подход отвечает «сколько вставок было медленными» (если вы догадались завести такую метрику заранее). Широкие события отвечают на вопрос «какая именно вставка вызвала этот всплеск» — и вопрос задаётся во время запроса, а не во время инструментирования.

Три типичные альтернативы и их потери:

Ключевое требование к базе для такого подхода — высокая кардинальность не должна быть проблемой. Именно поэтому широкие события естественно ложатся на ClickHouse и плохо — на системы с индексацией по размерностям.

Почему выкинули OTel-конвейер

Здесь важно правильно понять область применения: речь про сбор внутренней телеметрии самого ClickHouse Cloud, а не про отказ от OpenTelemetry вообще.

Две причины.

Первая — стоимость сериализации. Путь данных выглядел так:

PLAINTEXT
JSON → stdout → диск → парсинг OTel → маршалинг →
формат OTel → преобразование клиентом → вставка
Нажмите, чтобы развернуть и увидеть больше

На 20 миллионах строк в секунду поддержание такого конвейера без потерь потребовало бы, по оценке, около 8000 ядер CPU. Почти вся эта работа — перекладывание одних и тех же данных из формата в формат.

Вторая — доступ к данным. OTel забирал только stdout-логи, а самое ценное у ClickHouse лежит в системных таблицах: выполнение запросов, дисковый I/O, состояние фоновых задач. Через логи это просто не видно (см. часть 8).

Решение: ClickHouse → ClickHouse напрямую

Инструмент под названием SysEx делает побайтовый перенос между базами: SELECT из системных таблиц, поток в нативном формате, вставка — без десериализации и обратной сборки. Вклад в Go-клиент позволил обойти встроенный маршалинг.

Результат говорит сам за себя:

Пропускная способностьCPU
OTel-конвейер2 млн логов/с800+ ядер
Прямой перенос37 млн логов/с70 ядер

Двадцатикратный рост объёма обошёлся менее чем 10% прежнего CPU на самом критичном источнике данных.

Вывод, применимый далеко за пределами этой инсталляции: если источник и приёмник говорят на одном формате — не переводите данные через промежуточный. Сериализация на больших объёмах стоит дороже, чем кажется.

Как жить с меняющимися схемами

Широкие события упираются в практическую проблему: схема системных таблиц меняется от версии к версии, а данные собираются со множества инсталляций разом.

Решение изящное и переносимое:

  1. При встрече с таблицей её схема хешируется.
  2. Совпал хеш — пишем в существующую таблицу.
  3. Не совпал — создаётся новая версия: text_log_6, text_log_7 и так далее.
  4. Поверх всех версий строится логическое представление на движке Merge, который объединяет их при запросе и сам разбирается с совместимостью колонок.

То есть версионирование схемы решается на уровне хранения, а пользователь запроса видит одну таблицу.

Про Map и JSON

Практическая заметка по типам для полуструктурированных атрибутов:

Это ровно тот компромисс, о котором стоит помнить, проектируя схему под события с произвольными атрибутами: гибкость типа JSON не бесплатна на чтении.

Что забрать себе


Дальше: Часть 13. LogHouse: квадриллион строк в трёх облаках.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша