digital-garden/meta/zero/00 ClickHouse.md
Struchkov Mark eb97980dce
All checks were successful
continuous-integration/drone/push Build is passing
ClickHouse
2024-11-26 22:27:15 +03:00

105 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- ClickHouse
tags:
- maturity/🌱
date: 2024-11-26
title: ClickHouse
---
## Тезисы
- ClickHouse — колоночная аналитическая база данных, разработанная Яндексом для высоконагруженных систем.
- Отличается высокой производительностью, компрессией данных и развитым набором аналитических функций.
- Оптимизирована для пакетной обработки данных, с поддержкой распределенной архитектуры.
- Основной движок — MergeTree, работающий с разреженными индексами и поддерживающий репликацию.
- Основные недостатки: отсутствие транзакций, низкая скорость точечного чтения, ограниченная поддержка SQL.
- Рекомендуется минимизировать частоту вставок данных, предпочтительно использовать крупные пачки.
***
ClickHouse — это [[../../dev/database/Колоночная база данных|колоночная база данных]], разработанная Яндексом для работы с большими объемами данных. Она используется в таких сервисах, как Яндекс.Метрика и Яндекс.Музыка, а также в логировании. База данных отличается высокой производительностью, развитым набором аналитических функций и возможностью масштабирования. Однако для её эффективного использования важно понимать архитектурные особенности и ограничения.
ClickHouse хранит данные в формате колонок, что делает её особенно подходящей для аналитических задач. Такой подход позволяет значительно сократить объем хранимых данных за счет эффективной компрессии и обеспечивает высокую скорость обработки запросов, читающих большое количество строк, но небольшой набор столбцов.
**Основные характеристики**
- [[../../dev/database/Колоночная база данных|Колоночная база данных]], оптимизированная для аналитических задач.
- **Написана на C++** в Яндексе, используется в таких сервисах как Яндекс.Метрика, Яндекс.Музыка и для логирования.
- **Распределенность “из коробки”**: поддержка кластерной архитектуры.
- **Особенности архитектуры**: акцент на производительность (Partition, Tolerance, [[../../../../_inbox/Availability|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. Это определяет физическую организацию данных на диске.
- Порядок сортировки не может быть изменён после создания таблицы.
[[../../dev/fundamental/Сжатие данных|Компрессия данных]]:
- Каждая колонка может использовать собственный кодек для сжатия, который можно менять без пересоздания таблицы. Новые вставки начнут использовать новый кодек.
- При слиянии партов данные распаковываются и сжимаются заново. Это практически не влияет на скорость операций.
## Репликация
Особенности репликации:
- **Доступна только для движков семейства MergeTree.**
- Репликация выполняется на уровне таблиц, можно выбрать нужные таблицы и реплицировать только их.
- Репликация происходит на уровне сжатых данных для операций INSERT и ALTER.
- Для координации используется **ZooKeeper**:
- При недоступности ZooKeeper реплики переходят в режим read-only.
- ZooKeeper управляет мержами реплик и предотвращает расхождения данных.
- Обеспечивается [[../../dev/architecture/highload/Асинхронная репликация|асинхронная репликация]] с возможностью настройки количества реплик, ожидающих подтверждения.
- [[../../dev/architecture/highload/Репликация master-master|Репликация master-master]]: управление мержами реплик через ZooKeeper.
- Атомарная запись блоков с дедупликацией: для последних 100 вставок хранится хеш-сумма, реализуя [[../../dev/architecture/Идемпотентность|идемпотентные]] операции.
## Рекомендации
Чтобы использовать ClickHouse максимально эффективно, придерживайтесь следующих рекомендаций:
**Оптимизация вставок**
- Избегайте одиночных вставок. Они создают множество мелких партов, что приводит к снижению производительности.
- Используйте пакетные вставки с помощью инструментов:
- **KittenHouse** — внешний инструмент на Go (разработан в VK).
- **ClickHouse-bulk** — утилита для обработки массовых вставок.
- **Buffer Table** — встроенный механизм для накопления данных.
***
## Мета информация
**Область**:: [[00 Разработка|00 Разработка]]
**Родитель**::
**Источник**::
**Создана**:: [[2024-11-26]]
**Автор**::
### Дополнительные материалы
-
### Дочерние заметки
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->