Типовой кластер

Кластер ADQM не имеет мастер-ноды и единой точки входа. Запросы могут отправляться к любому из хостов в кластере.

Рассмотрим типовой кластер ADQM — три шарда, каждый состоит из двух реплик (иными словами, распределенный кластер из 3 узлов с фактором репликации 2). Шарды — это серверы или группы серверов, на которых размещаются разные части одной базы данных. Реплики — дублирующие серверы в составе шарда, которые содержат одинаковые данные.

Пример типового кластера ADQM
Пример типового кластера ADQM
Пример типового кластера ADQM
Пример типового кластера ADQM

Локальные таблицы — это реплицируемые таблицы, которые отвечают за хранение данных. Распределенные таблицы не хранят данные, они позволяют сделать запрос на несколько локальных таблиц, распределенных на хостах, которые объединены в виртуальный кластер.

В настройках каждого сервера (config.xml) должны присутствовать следующие секции:

  • remote_servers — кластеры, которые используются для создания распределенных таблиц и выполнения распределенных запросов;

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

Конфигурация remote_servers для представленного кластера:

<remote_servers>
  <default_cluster>
        <shard>
            <replica>
                <host>host_1</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>host_4</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <replica>
                <host>host_2</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>host_5</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard>
            <replica>
                <host>host_3</host>
                <port>9000</port>
            </replica>
            <replica>
                <host>host_6</host>
                <port>9000</port>
            </replica>
        </shard>
  </default_cluster>
</remote_servers>

Здесь задан распределенный кластер с именем default_cluster, состоящий из трех шардов, каждый из которых содержит две реплики. В качестве параметров для каждого сервера указываются host (адрес удаленного сервера) и port (TCP-порт для межсерверного взаимодействия, обычно 9000).

Настройка macros содержит идентификаторы шарда и реплики для каждого сервера. Например, макросы для host-1:

<macros>
    <replica>1</replica>
    <shard>1</shard>
</macros>
ПРИМЕЧАНИЕ

Чтобы объединить хосты ADQM в кластер, используйте интерфейс ADCM — подробнее в статье Конфигурирование логических кластеров в интерфейсе ADCM.

Создание реплицируемых таблиц

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

CREATE TABLE test_local ON CLUSTER default_cluster
(
    id Int32,
    value_string String
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test_local', '{replica}')
ORDER BY id;

Для создания реплицируемых таблиц используется движок ReplicatedMergeTree. Метаинформация, относящаяся к процессу репликации, хранится в ZooKeeper или ClickHouse Keeper. Соответственно, ReplicatedMergeTree имеет два обязательных параметра для формирования отдельного каталога в ZooKeeper/ClickHouse Keeper для каждой реплицируемой таблицы:

  • путь к таблице ZooKeeper/ClickHouse Keeper;

  • имя реплики в ZooKeeper/ClickHouse Keeper (идентифицирует разные реплики одной и той же таблицы).

В данном примере для создания реплицируемых таблиц используется распределенный DDL-запроc (ON CLUSTER) — запрос, который можно выполнить один раз на одном сервере, при этом необходимые таблицы будут созданы на всех хостах кластера. Идентификатор шарда и имя реплики, указанные как переменные {shard} и {replica} в параметрах ReplicatedMergeTree, заменяются на определенные значения из секции macros конфигурации каждого сервера. Таким образом для каждого экземпляра реплицируемой таблицы будет задан уникальный путь в ZooKeeper.

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

Создание распределенных таблиц

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

CREATE TABLE test_distr ON CLUSTER default_cluster AS default.test_local
ENGINE = Distributed(default_cluster, default, test_local, rand());

В данном примере в движок Distributed передаются следующие параметры:

  • кластер, на котором будет запущен запрос (имя кластера в remote_servers конфигурационного файла сервера);

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

  • реплицируемая таблица, к которой будет обращаться распределенная таблица;

  • ключ шардирования для вставки данных в распределенную таблицу (выражение rand() используется для случайного распределения данных по шардам).

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней