Репликация и масштабирование
В этом примере вы узнаете, как развернуть простой кластер ClickHouse, который одновременно обеспечивает репликацию и масштабирование. Он состоит из двух шардов и двух реплик, а также кластера ClickHouse Keeper из 3 узлов для координации работы и поддержания кворума в кластере.
Архитектура кластера, который вы будете настраивать, показана ниже:

Хотя можно запускать ClickHouse Server и ClickHouse Keeper вместе на одном сервере, мы настоятельно рекомендуем использовать выделенные хосты для ClickHouse Keeper в продукционных средах — именно этот подход мы продемонстрируем в данном примере.
Серверы Keeper могут быть менее мощными, и в большинстве случаев 4 ГБ ОЗУ достаточно для каждого сервера Keeper, пока ваши серверы ClickHouse существенно не вырастут.
Предварительные требования
- Вы уже развернули локальный сервер ClickHouse
- Вы знакомы с базовыми концепциями конфигурирования ClickHouse, такими как конфигурационные файлы
- На вашей машине установлен Docker
Настройка структуры каталогов и тестовой среды
Следующие шаги помогут вам настроить кластер с нуля. Если вы предпочитаете пропустить эти шаги и сразу перейти к запуску кластера, вы можете получить примерные файлы из репозитория ClickHouse Examples, каталог 'docker-compose-recipes'.
В этом руководстве вы будете использовать Docker Compose для развёртывания кластера ClickHouse. Эту конфигурацию можно адаптировать для работы на отдельных локальных машинах, виртуальных машинах или облачных инстансах.
Выполните следующие команды для создания структуры каталогов для этого примера:
Добавьте следующий файл docker-compose.yml в каталог clickhouse-cluster:
Создайте следующие подкаталоги и файлы:
- Каталог
config.dсодержит файл конфигурации сервера ClickHouseconfig.xml, в котором задаётся пользовательская конфигурация для каждого узла ClickHouse. Эта конфигурация объединяется с файлом конфигурации ClickHouseconfig.xmlпо умолчанию, который устанавливается вместе с каждым экземпляром ClickHouse. - Каталог
users.dсодержит файл конфигурации пользователейusers.xml, в котором задаётся пользовательская конфигурация для пользователей. Эта конфигурация объединяется с файлом конфигурации ClickHouseusers.xmlпо умолчанию, который устанавливается вместе с каждым экземпляром ClickHouse.
Рекомендуется использовать каталоги config.d и users.d при написании собственной
конфигурации, вместо того чтобы напрямую изменять конфигурацию по умолчанию
в /etc/clickhouse-server/config.xml и etc/clickhouse-server/users.xml.
Строка
Обеспечивает, что разделы конфигурации, определённые в каталогах config.d и users.d,
имеют приоритет над разделами конфигурации по умолчанию, заданными в файлах
config.xml и users.xml.
Настройка узлов ClickHouse
Настройка сервера
Теперь измените каждый пустой файл конфигурации config.xml, расположенный по пути
fs/volumes/clickhouse-{}/etc/clickhouse-server/config.d. Строки, выделенные
ниже, должны быть изменены для каждого узла отдельно:
| Каталог | Файл |
|---|---|
fs/volumes/clickhouse-01/etc/clickhouse-server/config.d | config.xml |
fs/volumes/clickhouse-02/etc/clickhouse-server/config.d | config.xml |
fs/volumes/clickhouse-03/etc/clickhouse-server/config.d | config.xml |
fs/volumes/clickhouse-04/etc/clickhouse-server/config.d | config.xml |
Каждый раздел указанного выше конфигурационного файла подробно описан ниже.
Сеть и логирование
Внешние подключения к сетевому интерфейсу разрешаются путем активации параметра listen_host. Это гарантирует, что сервер ClickHouse доступен для других хостов:
Порт HTTP API установлен в значение 8123:
TCP-порт для взаимодействия по собственному протоколу ClickHouse между clickhouse-client
и другими нативными инструментами ClickHouse, а также между clickhouse-server и другими экземплярами clickhouse-server
равен 9000:
Конфигурация логирования определяется в блоке <logger>. Данный пример конфигурации создаёт
отладочный лог с ротацией при достижении размера 1000M (три раза):
Дополнительную информацию о настройке логирования см. в комментариях стандартного файла конфигурации ClickHouse.
Конфигурация кластера
Конфигурация кластера задаётся в блоке <remote_servers>.
Здесь задано имя кластера cluster_2S_2R.
Блок <cluster_2S_2R></cluster_2S_2R> определяет топологию кластера
с помощью параметров <shard></shard> и <replica></replica> и служит
шаблоном для распределённых DDL-запросов — запросов, выполняемых на всём
кластере с использованием конструкции ON CLUSTER. По умолчанию распределённые DDL-запросы
разрешены, но могут быть отключены с помощью параметра allow_distributed_ddl_queries.
internal_replication установлен в true, чтобы данные записывались только на одну из реплик.
Секция <cluster_2S_2R></cluster_2S_2R> определяет топологию кластера
и служит шаблоном для распределённых DDL-запросов — запросов, выполняемых
на всех узлах кластера с помощью конструкции ON CLUSTER.
Конфигурация Keeper
Секция <ZooKeeper> указывает ClickHouse, где запущен ClickHouse Keeper (или ZooKeeper).
Поскольку используется кластер ClickHouse Keeper, необходимо указать каждый узел <node> кластера
вместе с его именем хоста и номером порта с помощью тегов <host> и <port> соответственно.
Настройка ClickHouse Keeper описана на следующем шаге руководства.
Хотя ClickHouse Keeper можно запустить на том же сервере, что и ClickHouse Server, для production-окружений мы настоятельно рекомендуем использовать выделенные хосты для ClickHouse Keeper.
Конфигурация макросов
Кроме того, секция <macros> используется для определения подстановки параметров для
реплицируемых таблиц. Они перечислены в system.macros и позволяют использовать подстановки
типа {shard} и {replica} в запросах.
Настройка пользователя
Теперь измените каждый пустой конфигурационный файл users.xml, расположенный в
fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d, следующим образом:
В данном примере пользователь по умолчанию настроен без пароля для упрощения. На практике это не рекомендуется.
В данном примере файл users.xml одинаков для всех узлов кластера.
Настройка ClickHouse Keeper
Далее необходимо настроить 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. Выделенные ниже строки необходимо изменить так, чтобы они были уникальными для каждого узла:
| Каталог | Файл |
|---|---|
fs/volumes/clickhouse-keeper-01/etc/clickhouse-keeper | keeper_config.xml |
fs/volumes/clickhouse-keeper-02/etc/clickhouse-keeper | keeper_config.xml |
fs/volumes/clickhouse-keeper-03/etc/clickhouse-keeper | keeper_config.xml |
Каждый файл конфигурации будет содержать следующую уникальную конфигурацию (см. ниже).
server_id должен быть уникальным для данного узла ClickHouse Keeper
в кластере и соответствовать серверу <id>, определённому в разделе <raft_configuration>.
tcp_port — это порт, используемый клиентами ClickHouse Keeper.
Следующий раздел описывает настройку серверов, участвующих в кворуме для алгоритма консенсуса Raft:
ClickHouse Cloud снимает операционную нагрузку, связанную с управлением шардами и репликами. Платформа автоматически обеспечивает высокую доступность, репликацию и принятие решений о масштабировании. Вычислительные ресурсы и хранилище разделены и автоматически масштабируются по мере необходимости, не требуя ручной настройки и постоянного обслуживания.
Проверка настройки
Убедитесь, что Docker запущен на вашем компьютере.
Запустите кластер командой docker-compose up из корневого каталога cluster_2S_2R:
Вы увидите, как docker начнет загружать образы ClickHouse и Keeper, а затем запустит контейнеры:
Чтобы проверить, что кластер запущен, подключитесь к любому из узлов и выполните следующий запрос. Команда для подключения к первому узлу:
При успешном подключении вы увидите командную строку клиента ClickHouse:
Выполните следующий запрос, чтобы проверить, какие топологии кластера определены для каких хостов:
Выполните следующий запрос, чтобы проверить состояние кластера ClickHouse Keeper:
Команда mntr также часто используется для проверки того, что ClickHouse Keeper
запущен, и для получения информации о состоянии и взаимоотношениях трёх узлов Keeper.
В конфигурации, используемой в этом примере, три узла работают совместно.
Узлы выбирают лидера, а остальные узлы становятся ведомыми.
Команда mntr предоставляет информацию, связанную с производительностью, а также о том,
является ли конкретный узел лидером или ведомым.
Вам может потребоваться установить netcat, чтобы отправить команду mntr Keeper’у.
См. страницу nmap.org для получения информации о скачивании.
Выполните приведённую ниже команду в оболочке на clickhouse-keeper-01, clickhouse-keeper-02 и
clickhouse-keeper-03, чтобы проверить состояние каждого узла Keeper. Команда
для clickhouse-keeper-01 показана ниже:
Ниже приведён пример ответа от ведомого узла:
Ниже приведён пример ответа от ведущего узла:
Таким образом, вы успешно настроили кластер ClickHouse с двумя шардами и двумя репликами. На следующем шаге вы создадите таблицу в кластере.
Создание базы данных
Теперь, когда вы убедились, что кластер правильно настроен и запущен, вы создадите ту же таблицу, что и в руководстве по примеру набора данных UK property prices. Она содержит около 30 миллионов записей о ценах на недвижимость в Англии и Уэльсе с 1995 года.
Подключитесь к клиенту каждого хоста, выполнив следующие команды в отдельных вкладках или окнах терминала:
Вы можете выполнить приведённый ниже запрос из clickhouse-client на каждом хосте, чтобы убедиться, что помимо стандартных баз данных других пока не создано:
Из клиента clickhouse-01 выполните следующий распределённый DDL-запрос с использованием
конструкции ON CLUSTER для создания новой базы данных uk:
Вы можете снова выполнить тот же запрос из клиента каждого хоста,
чтобы убедиться, что база данных создана во всём кластере, несмотря на то, что
запрос выполнялся только из clickhouse-01:
Создание таблицы в кластере
Теперь, когда база данных создана, создайте таблицу с репликацией.
Выполните следующий запрос из любого клиента на хосте:
Обратите внимание, что этот запрос идентичен запросу из исходной инструкции CREATE в
руководстве по примеру набора данных цен на недвижимость в Великобритании,
за исключением конструкции ON CLUSTER и использования движка ReplicatedMergeTree.
Конструкция ON CLUSTER предназначена для распределённого выполнения DDL-запросов (Data Definition Language),
таких как CREATE, DROP, ALTER и RENAME, что обеспечивает применение
изменений схемы на всех узлах кластера.
Движок ReplicatedMergeTree
работает так же, как обычный движок таблиц MergeTree, но дополнительно реплицирует данные.
Необходимо указать два параметра:
zoo_path: Путь в Keeper/ZooKeeper, по которому хранятся метаданные таблицы.replica_name: Имя реплики таблицы.
Параметр zoo_path можно задать произвольно, однако рекомендуется следовать соглашению об использовании префикса
где:
{database}и{table}будут автоматически подставлены.{shard}и{replica}— макросы, которые были определены ранее в файлеconfig.xmlкаждого узла ClickHouse.
Вы можете выполнить приведённый ниже запрос из клиента каждого хоста, чтобы убедиться, что таблица создана во всём кластере:
Вставка данных в распределённую таблицу
Для вставки данных в таблицу нельзя использовать ON CLUSTER, поскольку эта конструкция
не применяется к DML-запросам (Data Manipulation Language — язык манипулирования данными), таким как INSERT, UPDATE
и DELETE. Для вставки данных необходимо использовать
табличный движок Distributed.
Как описано в руководстве по настройке кластера с 2 шардами и 1 репликой, распределённые таблицы — это таблицы, имеющие доступ к шардам, расположенным на разных
хостах, и определяемые с помощью табличного движка Distributed.
Распределённая таблица служит интерфейсом для всех шардов в кластере.
С любого из клиентов хоста выполните следующий запрос для создания распределённой таблицы на основе существующей реплицируемой таблицы, созданной на предыдущем шаге:
На каждом хосте теперь будут доступны следующие таблицы в базе данных uk:
Данные можно вставить в таблицу uk_price_paid_distributed с любого из
клиентских хостов с помощью следующего запроса:
Выполните следующий запрос, чтобы убедиться, что вставленные данные равномерно распределены по узлам кластера:
Заключение
Преимущество такой топологии кластера с 2 шардами и 2 репликами в том, что она обеспечивает и масштабируемость, и отказоустойчивость. Данные распределяются по отдельным хостам, снижая требования к хранению и операциям ввода-вывода (I/O) на каждый узел, а запросы обрабатываются параллельно на обоих шардах, что повышает производительность и эффективность использования памяти. Важно, что кластер может выдержать потерю одного узла и продолжить обслуживать запросы без перебоев, поскольку у каждого шарда есть резервная реплика на другом узле.
Основной недостаток такой топологии кластера — увеличенные затраты на хранение: требуется в два раза больше дискового пространства по сравнению с конфигурацией без реплик, поскольку каждый шард дублируется. Кроме того, хотя кластер выдерживает отказ одного узла, одновременная потеря двух узлов может сделать кластер неработоспособным в зависимости от того, какие именно узлы выйдут из строя и как распределены шарды. Эта топология представляет собой компромисс между доступностью и стоимостью, что делает её подходящей для продакшн-сред, где требуется определённый уровень отказоустойчивости без расходов на более высокий коэффициент репликации.
Чтобы узнать, как ClickHouse Cloud обрабатывает запросы, обеспечивая и масштабируемость, и отказоустойчивость, см. раздел "Parallel Replicas".