Масштабирование
Конфигурация ClickHouse Keeper
ClickHouse Keeper предоставляет систему координации для репликации данных и выполнения распределённых запросов DDL. ClickHouse Keeper совместим с Apache ZooKeeper. Эта конфигурация включает ClickHouse Keeper на порту 9181. Выделенная строка указывает, что этот экземпляр Keeper имеет server_id
равный 1. Это единственное отличие в файле enable-keeper.xml
между тремя серверами. chnode2
будет иметь server_id
равный 2
, а chnode3
будет иметь server_id
равный 3
. Раздел конфигурации raft одинаков на всех трех серверах, и он выделен ниже, чтобы показать вам соотношение между server_id
и экземпляром server
в конфигурации raft.
Если по какой-либо причине узел Keeper заменяется или восстанавливается, не повторяйте существующий server_id
. Например, если узел Keeper с server_id
равным 2
восстанавливается, дайте ему server_id
равный 4
или выше.
Конфигурация макросов
Макросы shard
и replica
уменьшают сложность распределённых DDL. Сконфигурированные значения автоматически подставляются в ваши запросы DDL, что упрощает ваши DDL. Макросы для этой конфигурации указывают номер шардов и реплики для каждого узла. В этом примере с 2 шардом и 1 репликой макрос реплики — replica_1
на обоих узлах chnode1
и chnode2
, поскольку есть только одна реплика. Макрос шардов равен 1
на chnode1
и 2
на chnode2
.
Конфигурация репликации и шардирования
Начинаем сверху:
- Раздел
remote_servers
в XML указывает каждый из кластеров в среде. Атрибутreplace=true
заменяет примерremote_servers
в стандартной конфигурации ClickHouse на конфигурациюremote_servers
, указанную в этом файле. Без этого атрибута удалённые серверы в этом файле будут добавлены к списку примеров в стандартной конфигурации. - В этом примере есть один кластер с именем
cluster_2S_1R
. - Создается секрет для кластера с именем
cluster_2S_1R
со значениемmysecretphrase
. Секрет разделяется на всех удалённых серверах в среде, чтобы обеспечить правильное соединение серверов. - Кластер
cluster_2S_1R
имеет два шарда, и каждый из этих шардов имеет одну реплику. Посмотрите на схему архитектуры в начале этого документа и сравните её с двумя определениямиshard
в XML ниже. В каждом определении шардов есть одна реплика. Хост и порт для этой реплики указаны. Реплика для первого шарада в конфигурации хранится наchnode1
, а реплика для второго шарада в конфигурации хранится наchnode2
. - Внутренняя репликация для шардов установлена в истинное значение. Каждый шард может иметь параметр
internal_replication
, определяемый в файле конфигурации. Если этот параметр установлен в истинное значение, операция записи выбирает первую здоровую реплику и записывает данные в неё.
Конфигурация использования Keeper
В вышеупомянутых файлах был настроен ClickHouse Keeper. Этот файл конфигурации use-keeper.xml
настраивает ClickHouse Server на использование ClickHouse Keeper для координации репликации и распределенных DDL. Этот файл указывает, что ClickHouse Server должен использовать Keeper на узлах chnode1 - 3 на порту 9181, и файл одинаков на chnode1
и chnode2
.
Конфигурация chnode2
Так как конфигурация очень похожа на chnode1
и chnode2
, здесь будут указаны только отличия.
Конфигурация сети и логирования
Конфигурация ClickHouse Keeper
Этот файл содержит одно из двух отличий между chnode1
и chnode2
. В конфигурации Keeper server_id
установлен в 2
.
Конфигурация макросов
Конфигурация макросов имеет одно из отличий между chnode1
и chnode2
. shard
установлен в 2
на этом узле.
Конфигурация репликации и шардирования
Конфигурация использования Keeper
Конфигурация chnode3
Так как chnode3
не хранит данные и используется только как ClickHouse Keeper для обеспечения третьего узла в кворуме, chnode3
имеет только два файла конфигурации: один для настройки сети и логирования, и один для настройки ClickHouse Keeper.
Конфигурация сети и логирования
Конфигурация ClickHouse Keeper
Тестирование
- Подключитесь к
chnode1
и проверьте, что кластерcluster_2S_1R
, настроенный выше, существует
- Создайте базу данных в кластере
- Создайте таблицу с движком таблицы MergeTree в кластере.
Не нужно указывать параметры в движке таблицы, так как они будут автоматически определены в зависимости от наших макросов.
- Подключитесь к
chnode1
и вставьте строку
- Подключитесь к
chnode2
и вставьте строку
- Подключитесь к любому узлу,
chnode1
илиchnode2
, и вы увидите только строку, которая была вставлена в эту таблицу на этом узле. например, наchnode2
- Создайте распределенную таблицу для запроса обоих шардов на обоих узлах.
(В этом примере функция
rand()
установлена как ключ шардирования, чтобы она случайным образом распределяла каждую вставку)
- Подключитесь к любому из узлов
chnode1
илиchnode2
и выполните запрос к распределённой таблице, чтобы увидеть обе строки.