From eb97980dcef8e1f3f074639047c9e697e6f62bd8 Mon Sep 17 00:00:00 2001 From: Struchkov Mark Date: Tue, 26 Nov 2024 22:27:15 +0300 Subject: [PATCH] ClickHouse --- dev/database/Колоночная база данных.md | 2 +- meta/zero/00 ClickHouse.md | 105 +++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 meta/zero/00 ClickHouse.md diff --git a/dev/database/Колоночная база данных.md b/dev/database/Колоночная база данных.md index 66b59521..3f2351fe 100644 --- a/dev/database/Колоночная база данных.md +++ b/dev/database/Колоночная база данных.md @@ -17,7 +17,7 @@ date: 2024-11-26 Колоночные базы данных широко используются в системах, где важно быстро анализировать большие объемы данных. Примеры: -- [[../../../../source/доклады/00 ClickHouse|ClickHouse]] — быстрая аналитика и построение отчетов. +- [[../../meta/zero/00 ClickHouse|ClickHouse]] — быстрая аналитика и построение отчетов. - **Amazon Redshift** — облачные хранилища данных. - Apache [[Cassandra]] и **HBase** — большие распределенные хранилища. diff --git a/meta/zero/00 ClickHouse.md b/meta/zero/00 ClickHouse.md new file mode 100644 index 00000000..d68bab35 --- /dev/null +++ b/meta/zero/00 ClickHouse.md @@ -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]] +**Автор**:: +### Дополнительные материалы +- + +### Дочерние заметки + \ No newline at end of file