Skip to main content
В этом примере вы узнаете, как настроить простой кластер ClickHouse с возможностью масштабирования. В конфигурации используются пять серверов. Два из них используются для сегментирования данных. Остальные три сервера используются для координации.
Архитектура кластера, который вы будете настраивать, показана ниже:
Хотя ClickHouse Server и ClickHouse Keeper можно запускать вместе на одном сервере, мы настоятельно рекомендуем использовать выделенные хосты для ClickHouse Keeper в производственных средах — именно этот подход мы и продемонстрируем в данном примере.Серверы Keeper могут быть менее мощными, и 4 ГБ оперативной памяти обычно достаточно для каждого сервера Keeper до тех пор, пока ваши серверы ClickHouse не станут достаточно крупными.

Предварительные требования

1

Настройка структуры каталогов и тестовой среды

Файлы с примерамиСледующие шаги помогут вам с нуля настроить кластер. Если вы хотите пропустить их и сразу перейти к запуску кластера, файлы с примерами можно взять из репозитория examples каталог «docker-compose-recipes».
В этом руководстве вы будете использовать Docker compose для настройки кластера ClickHouse. Данную конфигурацию можно адаптировать для работы на отдельных локальных машинах, виртуальных машинах или облачных инстансах.Выполните следующие команды для создания структуры каталогов для данного примера:
Добавьте следующий файл docker-compose.yml в каталог cluster_2S_1R:
docker-compose.yml
Создайте следующие подкаталоги и файлы:
  • Каталог config.d содержит файл конфигурации сервера ClickHouse config.xml, в котором задаётся пользовательская конфигурация для каждого узла ClickHouse. Эта конфигурация объединяется с файлом конфигурации ClickHouse config.xml по умолчанию, который входит в состав каждой установки ClickHouse.
  • Каталог users.d содержит файл пользовательской конфигурации users.xml, в котором задаётся пользовательская конфигурация для пользователей. Эта конфигурация объединяется с файлом конфигурации ClickHouse users.xml по умолчанию, который входит в состав каждой установки ClickHouse.
Пользовательские каталоги конфигурацииРекомендуется использовать каталоги config.d и users.d при создании собственной конфигурации, а не изменять напрямую конфигурацию по умолчанию в /etc/clickhouse-server/config.xml и etc/clickhouse-server/users.xml.Строка
обеспечивает, что разделы конфигурации, определённые в каталогах config.d и users.d, переопределяют разделы конфигурации по умолчанию, заданные в стандартных файлах config.xml и users.xml.
2

Настройка узлов ClickHouse

Настройка сервера

Теперь измените каждый пустой файл конфигурации config.xml, расположенный по пути fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d. Выделенные ниже строки необходимо изменить, чтобы они были специфичны для каждого узла:
Каждый раздел приведённого выше конфигурационного файла подробно описан ниже.

Сеть и логирование

Возможность внешних подключений через сетевой интерфейс включается при активации настройки listen host. Это гарантирует, что хост сервера ClickHouse доступен с других хостов:
Порт HTTP API установлен на 8123:
TCP-порт для взаимодействия по собственному протоколу ClickHouse между clickhouse-client и другими инструментами ClickHouse, а также между clickhouse-server и другими clickhouse-servers, установлен в 9000:
Логирование настраивается в блоке <logger>. Приведённая ниже конфигурация задаёт отладочный лог с ротацией по достижении 1000 МБ, не более трёх файлов:
Дополнительную информацию о конфигурации логирования см. в комментариях в стандартном файле конфигурации ClickHouse.

Конфигурация кластера

Конфигурация кластера задаётся в блоке <remote_servers>. Здесь определяется имя кластера cluster_2S_1R.Блок <cluster_2S_1R></cluster_2S_1R> определяет структуру кластера с помощью настроек <shard></shard> и <replica></replica> и служит шаблоном для распределённых DDL-запросов — то есть запросов, выполняемых по всему кластеру с использованием предложения ON CLUSTER. По умолчанию распределённые DDL-запросы разрешены, однако их можно отключить с помощью настройки allow_distributed_ddl_queries.internal_replication по умолчанию имеет значение false, так как на каждый сегмент приходится только одна реплика.
Для каждого сервера указываются следующие параметры:

Конфигурация Keeper

Раздел <ZooKeeper> указывает ClickHouse, где запущен ClickHouse Keeper (или ZooKeeper). Поскольку мы используем кластер Keeper, необходимо указать каждый <node> кластера вместе с его hostname и номером порта с помощью тегов <host> и <port> соответственно.Настройка ClickHouse Keeper рассматривается на следующем шаге руководства.
Хотя ClickHouse Keeper можно запускать на том же сервере, что и ClickHouse Server, в продакшн-средах мы настоятельно рекомендуем запускать ClickHouse Keeper на выделенных хостах.

Конфигурация макросов

Кроме того, раздел <macros> используется для определения подстановок параметров для реплицированных таблиц. Они перечислены в system.macros и позволяют использовать подстановки вида {shard} и {replica} в запросах.
Они будут определяться по-разному в зависимости от структуры кластера.

Конфигурация пользователя

Теперь внесите следующие изменения в каждый пустой конфигурационный файл users.xml, расположенный по пути fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d:
/users.d/users.xml
В данном примере default user настроен без пароля для удобства. На практике такой подход не рекомендуется.
В этом примере файл users.xml одинаков на всех узлах кластера.
3

Настройка ClickHouse Keeper

Настройка Keeper

Чтобы репликация работала, необходимо развернуть и настроить кластер ClickHouse Keeper. ClickHouse Keeper обеспечивает систему координации для репликации данных, выступая в качестве замены ZooKeeper, который также можно использовать. Однако рекомендуется использовать ClickHouse Keeper, так как он обеспечивает более строгие гарантии и надежность, а также потребляет меньше ресурсов, чем ZooKeeper. Для Высокой доступности и сохранения кворума рекомендуется запускать как минимум три узла ClickHouse Keeper.
ClickHouse Keeper может работать на любом узле кластера вместе с ClickHouse, однако рекомендуется запускать его на выделенном узле, что позволяет масштабировать кластер ClickHouse Keeper и управлять им независимо от кластера базы данных.
Создайте файлы keeper_config.xml для каждого узла ClickHouse Keeper, выполнив следующую команду из корневой папки примера:
Измените пустые файлы конфигурации, созданные в каждом каталоге узла fs/volumes/clickhouse-keeper-{}/etc/clickhouse-keeper. Выделенные ниже строки нужно изменить для каждого узла:
/clickhouse-keeper/keeper_config.xml
Каждый файл конфигурации должен содержать следующую уникальную конфигурацию (показана ниже). Используемый server_id должен быть уникальным для соответствующего узла ClickHouse Keeper в кластере и совпадать с <id> сервера, заданным в разделе <raft_configuration>. tcp_port — порт, используемый клиентами ClickHouse Keeper.
Следующий раздел используется для настройки серверов, которые участвуют в кворуме алгоритма консенсуса Raft:
ClickHouse Cloud упрощает администрированиеClickHouse Cloud снимает операционную нагрузку, связанную с управлением сегментами и репликами. Платформа автоматически обеспечивает высокую доступность, репликацию и масштабирование. Вычислительные ресурсы и хранилище разделены и масштабируются по мере необходимости без ручной настройки и постоянного обслуживания.Подробнее
4

Проверьте настройку

Убедитесь, что на вашем компьютере запущен Docker. Запустите кластер командой docker-compose up из корневого каталога cluster_2S_1R:
Вы должны увидеть, как docker начинает скачивать образы ClickHouse и Keeper, а затем запускает контейнеры:
Чтобы убедиться, что кластер работает, подключитесь к clickhouse-01 или clickhouse-02 и выполните следующий запрос. Ниже показана команда для подключения к первому узлу:
Если всё прошло успешно, вы увидите приглашение клиента ClickHouse:
Выполните следующий запрос, чтобы проверить, какие топологии кластера определены для каких хостов:
Query
Response
Выполните следующий запрос, чтобы проверить состояние кластера ClickHouse Keeper:
Query
Response
Команда mntr также часто используется, чтобы убедиться, что ClickHouse Keeper запущен, и получить информацию о состоянии и ролях трёх узлов Keeper. В конфигурации, используемой в этом примере, вместе работают три узла. Они выберут leader, а остальные узлы будут followers.Команда mntr предоставляет информацию о производительности, а также о том, является ли конкретный узел follower или leader.
Возможно, вам потребуется установить netcat, чтобы отправить команду mntr в Keeper. Информацию о загрузке см. на странице nmap.org.
Выполните приведённую ниже команду в оболочке на clickhouse-keeper-01, clickhouse-keeper-02 и clickhouse-keeper-03, чтобы проверить состояние каждого узла Keeper. Команда для clickhouse-keeper-01 показана ниже:
Ниже приведён пример ответа от узла-реплики:
Response
Ниже приведён пример ответа от узла-лидера:
Response
На этом этапе вы успешно настроили кластер ClickHouse с двумя сегментами, в каждом из которых по одной реплике. На следующем шаге вы создадите таблицу в кластере.
5

Создайте базу данных

Теперь, когда вы убедились, что кластер правильно настроен и работает, вы воссоздадите ту же таблицу, которая используется в руководстве по работе с UK property prices — демонстрационным набором данных. Она содержит около 30 миллионов строк с ценами сделок с недвижимостью в Англии и Уэльсе с 1995 года.Подключитесь к клиенту каждого хоста, выполнив каждую из следующих команд в отдельных вкладках или окнах терминала:
Вы можете выполнить приведённый ниже запрос в clickhouse-client на каждом хосте, чтобы убедиться, что пока не создано никаких баз данных, кроме стандартных:
Query
Response
На клиенте clickhouse-01 выполните следующий распределённый DDL-запрос, используя предложение ON CLUSTER, чтобы создать новую базу данных uk:
Вы можете снова выполнить тот же запрос, что и раньше, из клиента на каждом хосте, чтобы убедиться, что база данных создана во всём кластере, хотя запрос был выполнен только на clickhouse-01:
6

Создайте таблицу в кластере

Теперь, когда база данных создана, создайте таблицу. Выполните следующий запрос с любого из хост-клиентов:
Обратите внимание, что он идентичен запросу, использованному в исходном операторе CREATE в руководстве по демонстрационному набору данных UK property prices, за исключением предложения ON CLUSTER.Предложение ON CLUSTER предназначено для распределённого выполнения DDL-запросов (Data Definition Language), таких как CREATE, DROP, ALTER и RENAME, и гарантирует, что эти изменения схемы будут применены на всех узлах кластера.Вы можете выполнить приведённый ниже запрос из клиента на каждом хосте, чтобы убедиться, что таблица была создана во всём кластере:
Query
Response
Прежде чем выполнять вставку данных UK price paid, давайте проведем небольшой эксперимент и посмотрим, что произойдет, если вставить данные в обычную таблицу с любого из хостов.Создайте тестовую базу данных и таблицу, выполнив следующий запрос с любого из хостов:
Теперь на clickhouse-01 выполните следующий запрос INSERT:
Переключитесь на clickhouse-02 и выполните следующий запрос INSERT:
Query
Теперь на clickhouse-01 или clickhouse-02 выполните следующий запрос:
Вы заметите, что, в отличие от таблицы ReplicatedMergeTree, возвращается только строка, вставленная в таблицу на этом конкретном хосте, а не обе строки.Чтобы читать данные из двух сегментов, нам нужен интерфейс, способный обрабатывать запросы ко всем сегментам, объединяя данные из обоих сегментов, когда мы выполняем SELECT-запросы к этой таблице, или выполняя вставку данных в оба сегмента, когда мы выполняем запросы INSERT.В ClickHouse такой интерфейс называется distributed таблица и создаётся с помощью движка таблицы Distributed. Давайте посмотрим, как это работает.
7

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

Создайте distributed таблицу, выполнив следующий запрос:
В этом примере в качестве ключа сегментирования выбрана функция rand(), поэтому вставка случайным образом распределяется по сегментам.Теперь выполните запрос к distributed таблице с любого из хостов, и вы получите обе строки, вставленные на двух хостах, в отличие от предыдущего примера:
Давайте сделаем то же самое для наших данных о ценах на недвижимость в Великобритании. С любого из клиентских хостов выполните следующий запрос, чтобы создать distributed таблицу, используя существующую таблицу, которую мы ранее создали с помощью ON CLUSTER:
8

Вставка данных в distributed таблицу

Теперь подключитесь к любому из хостов и вставьте данные:
После вставки данных можно проверить количество строк с помощью распределённой таблицы:
Query
Response
Если вы выполните следующий запрос на любом из хостов, то увидите, что данные более или менее равномерно распределены по сегментам (имейте в виду, что выбор сегмента для вставки определялся с помощью rand(), поэтому результаты могут отличаться):
Что произойдёт, если один из хостов выйдет из строя? Смоделируем это, остановив clickhouse-01:
Убедитесь, что хост недоступен, выполнив команду:
Response
Теперь с clickhouse-02 выполните тот же запрос SELECT, что и раньше, к распределённой таблице:
Response
К сожалению, наш кластер не является отказоустойчивым. Если один из хостов выходит из строя, кластер считается неработоспособным и запрос завершается с ошибкой — в отличие от реплицированной таблицы из предыдущего примера, в которую мы могли вставлять данные даже при отказе одного из хостов.

Заключение

Преимущество этой топологии кластера в том, что данные распределяются по отдельным хостам и требуют вдвое меньше дискового пространства на каждом узле. Что еще важнее, запросы обрабатываются на обоих сегментах, что эффективнее с точки зрения использования памяти и снижает I/O на каждом хосте. Основной недостаток этой топологии кластера, разумеется, в том, что потеря одного из хостов лишает нас возможности выполнять запросы. В следующем примере мы рассмотрим, как настроить кластер с двумя сегментами и двумя репликами, обеспечивающий как масштабируемость, так и отказоустойчивость.
Последнее изменение 23 июля 2026 г.