Анализ принципа работы распределенной таблицы clickhouse

Большие данные

Таблицы в clickhouse можно разделить на распределенные и локальные.

  • Распределенная таблица

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

  • локальная таблица

Таблица, которая фактически хранит данные

1. Введение в механизм распределенных таблиц

Принципиальный анализ:

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

Принцип заключается в следующем:

2. Создайте распределенную таблицу

Правила создания распределенной таблицы:

  • Используйте оператор on cluster для выполнения следующего кода на компьютере в кластере, чтобы создать локальную таблицу и распределенную таблицу на каждом компьютере.Одна из локальных таблиц соответствует сегменту данных, а распределенная таблица обычно является локальной таблицей. Добавьте «_all» к имени. Он формирует отношение отображения «один ко многим» с локальными таблицами, после чего можно управлять несколькими локальными таблицами через прокси распределенной таблицы.
  • Здесь следует отметить, что структура таблицы распределенной таблицы максимально соответствует структуре локальной таблицы. Если оно несовместимо, при создании таблицы не будет сообщено об ошибке, но при запросе или вставке может быть выдано исключение.

Сначала создайте локальную таблицу на каждом осколке:

--使用ReplicatedMergeTree引擎创建本地表test_log
create table test_log on cluster ck_cluster
(
    totalDate Date,
    unikey    String
)
    engine = ReplicatedMergeTree('/clickhouse/test/tables/{shard}/test_log', '{replica}')
        PARTITION BY totalDate
        ORDER BY unikey
        SETTINGS index_granularity = 8192;

Шаблон создания движка распределенной таблицы:

ENGINE = Distributed(cluster, database, table, [sharding_key])

Описание параметра:

  • кластер: имя кластера.В процессе чтения и записи распределенных таблиц он будет использовать информацию о конфигурации кластера, чтобы найти соответствующий хост-узел.

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

  • sharding_key: ключ сегментирования Распределенная таблица будет распределять данные по каждой локальной таблице в соответствии с этим правилом.

    --Создать распределенную таблицу test_log_all, данные будут считываться и записываться в соответствии со значением случайной функции rand(), --Определить, в какой сегмент записываются данные, а также можно использовать хэш для получения значения. создать таблицу test_log_all на кластере ck_cluster ( общая дата Дата, уникальная строка ) engine = Distributed('ck_cluster', 'test', 'test_log', rand());

Свяжите локальную таблицу и распределенную таблицу, созданную выше, предполагая, что наш кластер clickhouse имеет два узла, соответствующая связь между распределенной таблицей и локальной таблицей показана на следующем рисунке:

На данный момент созданы локальная таблица test_log и распределенная таблица test_log_all кластера ck_cluster.

3. Используйте распределенные таблицы

  • Как наши задачи вставки, так и задачи запроса будут использовать распределенные таблицы. Данные хранятся в локальных таблицах соответственно. Распределенные таблицы представляют собой отношения прокси или сопоставления и не хранят данные. Можно понять, что распределенная таблица — это nginx, который отвечает за распределение задач чтения и записи в локальную таблицу.

  • Если вы хотите полностью удалить распределенную таблицу, вам необходимо удалить распределенную таблицу и локальную таблицу соответственно.Правила синтаксиса следующие:

    -- удалить распределенную таблицу УДАЛИТЬ ТАБЛИЦУ test_log_all НА КЛАСТЕР ck_cluster -- удалить локальную таблицу УДАЛИТЬ ТАБЛИЦУ test_log НА КЛАСТЕР ck_cluster

Справочники: анализ принципов ClickHouse и практика применения