This commit is contained in:
parent
571517ae14
commit
eb97980dce
@ -17,7 +17,7 @@ date: 2024-11-26
|
||||
|
||||
|
||||
Колоночные базы данных широко используются в системах, где важно быстро анализировать большие объемы данных. Примеры:
|
||||
- [[../../../../source/доклады/00 ClickHouse|ClickHouse]] — быстрая аналитика и построение отчетов.
|
||||
- [[../../meta/zero/00 ClickHouse|ClickHouse]] — быстрая аналитика и построение отчетов.
|
||||
- **Amazon Redshift** — облачные хранилища данных.
|
||||
- Apache [[Cassandra]] и **HBase** — большие распределенные хранилища.
|
||||
|
||||
|
105
meta/zero/00 ClickHouse.md
Normal file
105
meta/zero/00 ClickHouse.md
Normal 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) -->
|
Loading…
Reference in New Issue
Block a user