Struchkov Mark
eb97980dce
All checks were successful
continuous-integration/drone/push Build is passing
105 lines
12 KiB
Markdown
105 lines
12 KiB
Markdown
---
|
||
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) --> |