К основному контенту

Типы таблиц в ClickHouse: реплицируемые и нереплицируемые

ClickHouse — мощная колоночная СУБД, предназначенная для аналитических нагрузок. В основе работы с данными лежат различные типы таблиц, каждая из которых имеет свои особенности, преимущества и ограничения. Рассмотрим основные типы таблиц в ClickHouse, разделяя их на реплицируемые и нереплицируемые.

Реплицируемые таблицы

Реплицируемые таблицы предназначены для обеспечения отказоустойчивости и распределённой обработки данных в кластере. Они позволяют синхронизировать данные между разными узлами.

ReplicatedMergeTree

Этот тип таблиц является основой для построения отказоустойчивых решений в ClickHouse. Он основан на MergeTree, но добавляет механизм репликации. Данные автоматически синхронизируются между узлами с использованием ZooKeeper.

Особенности:

  • Поддержка автоматической репликации и распределённой обработки запросов.

  • Возможность восстановления данных после сбоев.

  • Используется для построения масштабируемых кластеров.

ReplicatedCollapsingMergeTree

Расширение ReplicatedMergeTree, добавляющее поддержку механизма коллапсирования (удаления парных строк). Это полезно для обработки логов, в которых одни записи могут отменять другие.

Особенности:

  • Автоматическое удаление парных записей с противоположными знаками.

  • Полная поддержка репликации.

  • Оптимально подходит для хранения событий, например, действий пользователей, где требуется удалять дублирующиеся данные.

Нереплицируемые таблицы

Эти таблицы хранят данные локально и не поддерживают автоматическую синхронизацию между узлами. Они подходят для работы с небольшими объёмами данных или в средах без требований к отказоустойчивости.

MergeTree

Базовый тип таблицы для аналитических данных. Она обеспечивает эффективное хранение, сортировку и сжатие данных, а также поддержку индексов.

Особенности:

  • Высокая производительность при обработке больших объёмов данных.

  • Автоматическая агрегация и удаление старых данных.

  • Поддержка первичного ключа и секционирования.

Log

Простейший тип таблиц, предназначенный для быстрого добавления и считывания данных без сложной обработки.

Особенности:

  • Подходит для ведения логов и временных данных.

  • Отсутствие индексации и сортировки.

  • Высокая скорость вставки данных.

TinyLog

Упрощённый вариант Log, используемый для небольших объёмов данных.

Особенности:

  • Все данные хранятся в одном файле.

  • Минимальные накладные расходы.

  • Не поддерживает параллельную запись.

Memory

Таблица, хранящая данные в оперативной памяти. Отличается высокой скоростью работы, но данные не сохраняются при перезапуске сервера.

Особенности:

  • Высокая скорость чтения и записи.

  • Подходит для временных данных и кэша.

  • Данные теряются при рестарте ClickHouse.

Null

Специальный тип таблицы, который не сохраняет данные, но принимает запросы.

Особенности:

  • Используется для тестирования и отладки.

  • Все записи мгновенно «исчезают» после вставки.

Set

Хранит уникальные значения, часто используется для выполнения быстрых проверок вхождения.

Особенности:

  • Оптимизирован для операций с множествами.

  • Подходит для реализации механизмов фильтрации данных.

Join

Предназначена для хранения данных, используемых в JOIN-запросах.

Особенности:

  • Улучшает производительность при выполнении соединений.

  • Хранит данные в специальном формате для быстрого доступа.

ClickHouse предоставляет широкий выбор типов таблиц для различных задач. ReplicatedMergeTree и ReplicatedCollapsingMergeTree — основные реплицируемые таблицы, тогда как все остальные являются локальными и не поддерживают автоматическое копирование данных. Выбор подходящего типа таблицы зависит от требований к отказоустойчивости, скорости работы и особенностей обработки данных.

Более подробное описание всех типов таблиц можно найти в официальной документации.

Механизм Collapsing в ClickHouse: принцип работы, особенности и преимущества

CollapsingMergeTree и его реплицируемая версия ReplicatedCollapsingMergeTree — это особые движки в ClickHouse, которые позволяют автоматически удалять взаимно исключающие строки на основе специального признака. Это особенно полезно при обработке логов, где фиксируются как добавления, так и удаления записей.


Принцип работы CollapsingMergeTree

CollapsingMergeTree работает на основе специального столбца Sign. Этот столбец определяет, должна ли строка добавляться в таблицу или удаляться при слиянии сегментов.

  • Sign = 1 — строка добавляется.

  • Sign = -1 — строка удаляется, если найдена соответствующая строка с Sign = 1.

При мерджах ClickHouse находит парные записи (+1 и -1) с одинаковыми значениями первичного ключа и удаляет их.


Пример работы механизма Collapsing

1. Создание таблицы

CREATE TABLE user_actions ( id UInt64, event String, timestamp DateTime, Sign Int8 ) ENGINE = CollapsingMergeTree(Sign) ORDER BY id;

2. Вставка данных

INSERT INTO user_actions VALUES (1, 'login', '2025-04-03 10:00:00', 1); INSERT INTO user_actions VALUES (2, 'click', '2025-04-03 10:01:00', 1); INSERT INTO user_actions VALUES (1, 'login', '2025-04-03 10:00:00', -1);

Здесь мы сначала добавляем два события (Sign = 1), а затем отменяем одно из них (Sign = -1).

3. Состояние до мерджа

SELECT * FROM user_actions;

id

event

timestamp

Sign

1

login

2025-04-03 10:00:00

1

2

click

2025-04-03 10:01:00

1

1

login

2025-04-03 10:00:00

-1

4. После слияния данных (OPTIMIZE TABLE)

OPTIMIZE TABLE user_actions FINAL;

id

event

timestamp

Sign

2

click

2025-04-03 10:01:00

1

Строки (1, login, 2025-04-03 10:00:00) с Sign = 1 и Sign = -1 схлопнулись и удалились.


Особенности и нюансы

  1. Collapsing работает не мгновенно

    • Удаление парных строк происходит при слиянии данных (OPTIMIZE TABLE).

    • До мерджа удаленные строки всё ещё видны.

  2. Требуется правильный порядок вставки данных

    • Если запись Sign = -1 вставить раньше Sign = 1, коллапсирование может не сработать.

    • Для избежания проблем лучше использовать FINAL при выборках:

      SELECT * FROM user_actions FINAL;
  3. Не удаляет одиночные записи

    • Если у записи нет парной строки с Sign = -1, она остаётся в таблице.

  4. Работает только с CollapsingMergeTree

    • В других движках (например, MergeTree) такие операции придётся обрабатывать вручную.


Преимущества CollapsingMergeTree

Эффективное сжатие данных – помогает удалять дубликаты без дополнительных запросов.
Оптимизирован для обработки логов – удобно для трекинга действий пользователей, где возможны отмены.
Автоматическое удаление при мердже – нет необходимости вручную чистить устаревшие записи.
Поддержка репликации – работает в ReplicatedCollapsingMergeTree для отказоустойчивых систем.


Когда использовать CollapsingMergeTree?

📌 Событийные данные, где записи могут отменяться (например, логирование входов и выходов).
📌 Финансовые транзакции, если требуется откат операций.
📌 Отслеживание изменений состояний объектов (создание/удаление сущностей).

CollapsingMergeTree — мощный инструмент для автоматического удаления ненужных данных. Однако его следует применять осторожно, чтобы избежать потери важных записей. 🚀


Что нужно чтобы настроить репликацию?

Для настройки репликации в ClickHouse необходимо выполнить несколько шагов. Вот основные требования и последовательность действий:

1. Настроить кластер и ZooKeeper

Репликация в ClickHouse использует ZooKeeper для координации узлов. Вам нужно:

  • Установить и запустить ZooKeeper на одном или нескольких серверах.

  • Добавить его адреса в конфигурационный файл ClickHouse (config.xml).

Пример секции конфигурации config.xml:

<zookeeper> <node> <host>zookeeper1</host> <port>2181</port> </node> <node> <host>zookeeper2</host> <port>2181</port> </node> <node> <host>zookeeper3</host> <port>2181</port> </node> </zookeeper>

2. Определить кластер в ClickHouse

В файле /etc/clickhouse-server/config.xml добавьте описание кластера:

<remote_servers> <my_cluster> <shard> <replica> <host>clickhouse1</host> <port>9000</port> </replica> <replica> <host>clickhouse2</host> <port>9000</port> </replica> </shard> </my_cluster> </remote_servers>

3. Создать реплицируемую таблицу

При создании таблицы используется ReplicatedMergeTree (или его разновидности). Укажите путь в ZooKeeper и имя реплики:

CREATE TABLE my_table ON CLUSTER my_cluster ( id UInt64, name String, created_at DateTime ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/my_cluster/my_table', '{replica}') ORDER BY id;
  • '/clickhouse/tables/my_cluster/my_table' — путь в ZooKeeper.

  • '{replica}' — автоматически подставляется именем текущего узла.

4. Проверить синхронизацию данных

После вставки данных на одном узле (clickhouse1) они автоматически появятся на другом (clickhouse2).
Проверить состояние репликации можно так:

SELECT * FROM system.replicas;

5. Настроить отказоустойчивость

  • Если узел выходит из строя, другой продолжает работать.

  • После восстановления узел автоматически подтягивает недостающие данные из реплики.

  • Запросы можно балансировать через Distributed таблицы.

Настроив эти шаги, вы получите отказоустойчивую реплицируемую базу в ClickHouse. 🚀


Комментарии

Популярные сообщения из этого блога

Настройка и подключение IPSec в Windows

Настройка IPSec на Windows включает в себя создание правил безопасности и фильтров для защиты сетевого трафика. Ниже — пошаговое руководство. Включение службы IPSec Перед настройкой убедитесь, что служба IPSec Policy Agent запущена: Нажмите Win + R , введите services.msc и нажмите Enter . Найдите IPsec Policy Agent . Если она не работает, нажмите ПКМ → Свойства . Установите Тип запуска: Автоматически , затем нажмите Запустить . Настройка политики IPSec через «Локальную политику безопасности» Нажмите Win + R , введите secpol.msc , нажмите Enter . Перейдите в Политики IP-безопасности в локальном компьютере . В правом окне нажмите Создать политику IP-безопасности → Далее . Укажите имя политики (например, "IPSec VPN"), снимите флажок Активировать правило по умолчанию , нажмите Далее . Нажмите Добавить , чтобы создать правило. Транспортный или туннельный режим : Если IPSec для защищенной локальной сети – выберите Транспортный режим . Если IPSec для VPN – выберите Туннельн...

Как найти и изменить репозитарии для CentOS 8

В CentOS 8 официальные репозитории (BaseOS, AppStream и Extras) управляются с помощью dnf и файлов конфигурации в /etc/yum.repos.d/ . Вот как их найти и изменить: 1. Просмотр текущих репозиториев dnf repolist Если нужно увидеть подробную информацию: dnf repolist all 2. Изменение репозиториев Файлы конфигурации репозиториев находятся в /etc/yum.repos.d/ . Например, основной репозиторий может быть в файле CentOS-AppStream.repo . Открыть его можно так: nano /etc/yum.repos.d/CentOS-AppStream.repo Внутри можно изменить: enabled=1 → включает репозиторий enabled=0 → отключает репозиторий baseurl= или mirrorlist= → задать новый источник пакетов 3. Замена недоступных репозиториев CentOS 8 достиг конца поддержки , и официальные зеркала больше не работают. Вместо них можно подключить Vault или AlmaLinux/Rocky Linux : Использование архивного репозитория CentOS Vault Создайте резервную копию старых .repo файлов: mkdir /root/repo-backup && mv /etc/yum.repos.d/*.repo /root/repo-backu...

Что такое Redfish API? Развертывание серверов через Redfish API: подробное руководство с примерами

Введение в Redfish API Redfish API — это стандартный интерфейс управления серверами, разработанный DMTF (Distributed Management Task Force). Он предоставляет RESTful API для взаимодействия с серверными системами, включая включение/выключение, мониторинг состояния и развертывание операционной системы. Этот API позволяет автоматизировать управление серверами без необходимости физического доступа или использования устаревших интерфейсов, таких как IPMI. Требования Прежде чем приступить к работе, необходимо подготовить следующее: Сервер с поддержкой Redfish (например, HPE iLO, Dell iDRAC, Lenovo XClarity, Cisco UCS и др.). Доступ к Redfish API через сеть. Учетные данные для аутентификации. Инструмент для работы с API (cURL, Postman, Python с библиотекой requests ). Подключение и аутентификация Для взаимодействия с Redfish API используется стандартный HTTP-запрос с аутентификацией по логину и паролю. Например, для проверки работоспособности интерфейса можно выполнить GET-запрос ...