Тезисы
- 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
Автор::