Типовой кластер
Кластер ADQM не имеет мастер-ноды и единой точки входа. Запросы могут отправляться к любому из хостов в кластере.
Рассмотрим типовой кластер ADQM — три шарда, каждый состоит из двух реплик (иными словами, распределенный кластер из 3 узлов с фактором репликации 2). Шарды — это серверы или группы серверов, на которых размещаются разные части одной базы данных. Реплики — дублирующие серверы в составе шарда, которые содержат одинаковые данные.
Локальные таблицы — это реплицируемые таблицы, которые отвечают за хранение данных. Распределенные таблицы не хранят данные, они позволяют сделать запрос на несколько локальных таблиц, распределенных на хостах, которые объединены в виртуальный кластер.
В настройках каждого сервера (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()
используется для случайного распределения данных по шардам).