Тезисы

  • ClickHouse — колоночная аналитическая база данных, разработанная Яндексом для высоконагруженных систем.
  • Отличается высокой производительностью, компрессией данных и развитым набором аналитических функций.
  • Оптимизирована для пакетной обработки данных, с поддержкой распределенной архитектуры.
  • Основной движок — MergeTree, работающий с разреженными индексами и поддерживающий репликацию.
  • Основные недостатки: отсутствие транзакций, низкая скорость точечного чтения, ограниченная поддержка SQL.
  • Рекомендуется минимизировать частоту вставок данных, предпочтительно использовать крупные пачки.

ClickHouse — это колоночная база данных, разработанная Яндексом для работы с большими объемами данных. Она используется в таких сервисах, как Яндекс.Метрика и Яндекс.Музыка, а также в логировании. База данных отличается высокой производительностью, развитым набором аналитических функций и возможностью масштабирования. Однако для её эффективного использования важно понимать архитектурные особенности и ограничения.

ClickHouse хранит данные в формате колонок, что делает её особенно подходящей для аналитических задач. Такой подход позволяет значительно сократить объем хранимых данных за счет эффективной компрессии и обеспечивает высокую скорость обработки запросов, читающих большое количество строк, но небольшой набор столбцов.

Основные характеристики

  • Колоночная база данных, оптимизированная для аналитических задач.
  • Написана на C++ в Яндексе, используется в таких сервисах как Яндекс.Метрика, Яндекс.Музыка и для логирования.
  • Распределенность “из коробки”: поддержка кластерной архитектуры.
  • Особенности архитектуры: акцент на производительность (Partition, Tolerance, Availability).

Встроенные функции:

  • Векторная обработка данных.
  • Компрессия данных с возможностью настройки кодеков.
  • Частичная поддержка геоданных и машинного обучения.
  • Аналитические функции высокого уровня.

Недостатки

  • Отсутствие транзакций: нет поддержки ACID.
  • Ограничения на изменения данных: данные нельзя обновлять, только перезаписывать.
  • Нет полноценного оптимизатора запросов.
  • Низкая производительность точечного чтения: система рассчитана на чтение больших объемов данных.
  • Ограниченная консистентность: реплики не всегда согласованы в режиме реального времени.
  • Частичная поддержка SQL: не все возможности SQL реализованы.

Основной движок: MergeTree

База данных строится вокруг движка MergeTree, который оптимизирован для пакетной обработки данных. Для каждой таблицы создаётся директория на диске, где данные организованы следующим образом:

  • Партиции: каждая партиция таблицы сохраняется в отдельной папке.
  • Колонки: каждая колонка хранится в своём файле (*.bin).
  • Индексы: разреженные индексы записываются в файл primary.idx. Индекс содержит каждое N-ое значение (по умолчанию index_granularity = 8192). Это значение это минимальное количество данных, которое за раз вычитывает ClickHouse, поэтому и не рекомендуется искать данные по одиночке.
  • Файлы засечек: данные для быстрого доступа к определённым диапазонам значений сохраняются в файлах *.mrk2.

На базе MergeTree разработаны несколько модификаций, каждая из которых добавляет специфическое поведение при обработке данных:

  • ReplacingMergeTree:
    • Позволяет во время слияния удалять дублирующиеся строки в рамках одной партиции.
    • Полезен для работы с данными, где возможны повторения, но требует осторожности при партиционировании по времени, так как схлопывание происходит только в рамках одной партиции.
  • SummingMergeTree:
    • Может суммировать значения колонок во время слияния.
    • Подходит для задач агрегации, например, при работе с метриками.
  • AggregatingMergeTree:
    • Специализирован для агрегаций, позволяя хранить предварительно агрегированные данные.
    • Используется в сценариях, где требуется обработка заранее рассчитанных метрик.
  • CollapsingMergeTree:
    • Использует специальное поле sign (значения 1 или -1), чтобы схлопывать данные с одинаковым ключом.
    • Подходит для реализации обновлений через логическую отмену. Например, строка с sign = -1 удаляет соответствующую строку с sign = 1.
    • Схлопывание происходит в процессе слияния данных, оставляя только актуальные строки (последние добавленные с признаком 1).

Работа с данными

Вставка данных:

  • Каждая операция вставки создаёт новую папку с данными (парт).
  • В фоновом режиме ClickHouse объединяет парты в рамках одной партиции, чтобы минимизировать количество мелких файлов. При этом старые версии данных помечаются неактивными и удаляются (по умолчанию через 8 минут).
  • Если при создании таблицы не заданы партиции, все данные будут сохраняться в одну папку, что может снизить производительность при большом количестве вставок.

Сортировка и индексация:

  • Данные сортируются по полю, указанному в ORDER BY. Это определяет физическую организацию данных на диске.
  • Порядок сортировки не может быть изменён после создания таблицы.

Компрессия данных:

  • Каждая колонка может использовать собственный кодек для сжатия, который можно менять без пересоздания таблицы. Новые вставки начнут использовать новый кодек.
  • При слиянии партов данные распаковываются и сжимаются заново. Это практически не влияет на скорость операций.

Репликация

Особенности репликации:

  • Доступна только для движков семейства MergeTree.
  • Репликация выполняется на уровне таблиц, можно выбрать нужные таблицы и реплицировать только их.
  • Репликация происходит на уровне сжатых данных для операций INSERT и ALTER.
  • Для координации используется ZooKeeper:
    • При недоступности ZooKeeper реплики переходят в режим read-only.
    • ZooKeeper управляет мержами реплик и предотвращает расхождения данных.
    • Обеспечивается асинхронная репликация с возможностью настройки количества реплик, ожидающих подтверждения.
  • Репликация master-master: управление мержами реплик через ZooKeeper.
  • Атомарная запись блоков с дедупликацией: для последних 100 вставок хранится хеш-сумма, реализуя идемпотентные операции.

Рекомендации

Чтобы использовать ClickHouse максимально эффективно, придерживайтесь следующих рекомендаций:

Оптимизация вставок

  • Избегайте одиночных вставок. Они создают множество мелких партов, что приводит к снижению производительности.
  • Используйте пакетные вставки с помощью инструментов:
    • KittenHouse — внешний инструмент на Go (разработан в VK).
    • ClickHouse-bulk — утилита для обработки массовых вставок.
    • Buffer Table — встроенный механизм для накопления данных.

Мета информация

Область:: 00 Разработка
Родитель::
Источник::
Создана:: 2024-11-26
Автор::

Дополнительные материалы

Дочерние заметки