ClickHouse
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Struchkov Mark 2024-11-26 22:27:15 +03:00
parent 571517ae14
commit eb97980dce
No known key found for this signature in database
GPG Key ID: A3F0AC3F0FA52F3C
2 changed files with 106 additions and 1 deletions

View File

@ -17,7 +17,7 @@ date: 2024-11-26
Колоночные базы данных широко используются в системах, где важно быстро анализировать большие объемы данных. Примеры: Колоночные базы данных широко используются в системах, где важно быстро анализировать большие объемы данных. Примеры:
- [[../../../../source/доклады/00 ClickHouse|ClickHouse]] — быстрая аналитика и построение отчетов. - [[../../meta/zero/00 ClickHouse|ClickHouse]] — быстрая аналитика и построение отчетов.
- **Amazon Redshift** — облачные хранилища данных. - **Amazon Redshift** — облачные хранилища данных.
- Apache [[Cassandra]] и **HBase** — большие распределенные хранилища. - Apache [[Cassandra]] и **HBase** — большие распределенные хранилища.

105
meta/zero/00 ClickHouse.md Normal file
View File

@ -0,0 +1,105 @@
---
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) -->