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

Хотя возможно запускать ClickHouse Server и ClickHouse Keeper на одном и том же сервере, мы настоятельно рекомендуем использовать выделенные хосты для ClickHouse Keeper в производственных средах, что является подходом, который мы продемонстрируем в этом примере.
Серверы Keeper могут быть меньшими, и обычно 4 ГБ ОП достаточно для каждого сервера Keeper, пока ваши серверы ClickHouse не вырастут в размерах.
Предварительные требования
- Вы ранее настроили локальный сервер ClickHouse
- Вы знакомы с основными концепциями конфигурации ClickHouse, такими как файлы конфигурации
- У вас установлен Docker на вашем компьютере
Настройка структуры каталогов и тестовой среды
Следующие шаги помогут вам настроить кластер с нуля. Если вы предпочитаете пропустить эти шаги и сразу перейти к запуску кластера, вы можете получить примерные файлы из репозитория примеров
В этом учебнике вы будете использовать Docker compose для настройки кластера ClickHouse. Эта настройка может быть изменена для работы на отдельных локальных машинах, виртуальных машинах или облачных экземплярах.
Выполните следующие команды для настройки структуры каталогов для этого примера:
Добавьте следующий файл docker-compose.yml
в каталог clickhouse-cluster
:
Создайте следующие подкаталоги и файлы:
- Директория
config.d
содержит файл конфигурации сервера ClickHouseconfig.xml
, в котором определяется пользовательская конфигурация для каждого узла 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
.
Настройка узлов 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 |
Каждый раздел приведенного выше файла конфигурации объясняется более подробно ниже.
Сеть и логирование
Внешняя связь с сетевым интерфейсом включается активацией настройки listen host. Это гарантирует, что хост сервера ClickHouse доступен для других хостов:
Порт для HTTP API установлен на 8123
:
TCP-порт для взаимодействия по нативному протоколу ClickHouse между clickhouse-client и другими нативными инструментами ClickHouse, а также clickhouse-server и другими clickhouse-server установлен на 9000
:
Логирование определяется в блоке <logger>
. Эта примерная конфигурация предоставляет
вам отладочный журнал, который будет перекатываться при достижении 1000M три раза:
Для получения дополнительной информации о конфигурации логирования см. комментарии, включенные в стандартный файл конфигурации 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
установлен в true, чтобы данные записывались только в одну из реплик.
Для каждого сервера указаны следующие параметры:
Параметр | Описание | Значение по умолчанию |
---|---|---|
host | Адрес удаленного сервера. Вы можете использовать как доменное имя, так и адрес IPv4 или IPv6. Если вы укажете домен, сервер выполнит запрос DNS при старте, и результат будет храниться до тех пор, пока сервер работает. Если запрос DNS завершится неудачно, сервер не запустится. Если вы измените запись DNS, необходимо перезапустить сервер. | - |
port | TCP-порт для ведения связи (tcp_port в конфигурации, обычно равен 9000). Не путать с http_port . | - |
Конфигурация Keeper
Секция <ZooKeeper>
указывает ClickHouse, где работает ClickHouse Keeper (или ZooKeeper).
Поскольку мы используем кластер ClickHouse Keeper, каждый <node>
кластера должен быть указан,
вместе с его именем хоста и номером порта с помощью тегов <host>
и <port>
соответственно.
Настройка ClickHouse Keeper объясняется на следующем этапе учебника.
Хотя возможно запускать ClickHouse Keeper на том же сервере, что и сервер ClickHouse, в производственных средах мы настоятельно рекомендуем, чтобы ClickHouse Keeper работал на выделенных хостах.
Конфигурация макросов
Кроме того, секция <macros>
используется для определения замен параметров для
реплицированных таблиц. Они перечислены в system.macros
и позволяют использовать замены
такие как {shard}
и {replica}
в запросах.
Эти значения будут определены уникально в зависимости от компоновки кластера.
Настройка пользователей
Теперь измените каждый пустой файл конфигурации users.xml
, расположенный по адресу
fs/volumes/clickhouse-{}/etc/clickhouse-server/users.d
, следующим образом:
Директория | Файл |
---|---|
fs/volumes/clickhouse-01/etc/clickhouse-server/users.d | users.xml |
fs/volumes/clickhouse-02/etc/clickhouse-server/users.d | users.xml |
В этом примере пользователь по умолчанию настроен без пароля для простоты. На практике это не рекомендуется.
В этом примере каждый файл users.xml
идентичен для всех узлов в кластере.
Настройка 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-server/config.d | keeper_config.xml |
fs/volumes/clickhouse-keeper-02/etc/clickhouse-server/config.d | keeper_config.xml |
fs/volumes/clickhouse-keeper-03/etc/clickhouse-server/config.d | keeper_config.xml |
Каждый файл конфигурации будет содержать следующую уникальную конфигурацию (представленную ниже).
server_id
, используемый для этого конкретного узла ClickHouse Keeper в кластере, должен быть уникальным и соответствовать значению <id>
, определенному в разделе <raft_configuration>
.
tcp_port
— это порт, используемый клиентами ClickHouse Keeper.
Следующий раздел используется для настройки серверов, которые участвуют в квorum для алгоритма Raft:
ClickHouse Cloud устраняет операционную нагрузку, связанную с управлением шардами и репликами. Платформа автоматически обрабатывает задачи высокой доступности, репликации и принятия решений о масштабировании. Вычисления и хранилище разделены и масштабируются в зависимости от спроса без необходимости в ручной настройке или постоянном обслуживании.
Протестируйте настройку
Убедитесь, что Docker работает на вашем компьютере.
Запустите кластер, используя команду docker-compose up
из корневого каталога cluster_2S_1R
:
Вы должны увидеть, как Docker начинает загружать образы ClickHouse и Keeper, а затем запускать контейнеры:
Чтобы проверить, что кластер запущен, подключитесь к clickhouse-01
или clickhouse-02
и выполните
следующий запрос. Команда для подключения к первому узлу показана:
Если успешно, вы увидите приглашение клиента 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 с одним шардом и двумя репликами. На следующем шаге вы создадите таблицу в кластере.
Создание базы данных
Теперь, когда вы подтвердили, что кластер настроен и работает правильно, вы воссоздадите ту же таблицу, что и в учебнике примера Цены на недвижимость в Великобритании. Она состоит примерно из 30 миллионов строк цен, уплаченных за недвижимость в Англии и Уэльсе с 1995 года.
Подключитесь к клиенту каждого хоста, запустив каждую из следующих команд в отдельных вкладках или окнах терминала:
Вы можете выполнить запрос ниже из clickhouse-client каждого хоста, чтобы подтвердить, что баз данных еще не создано, кроме стандартных:
Запустите следующий распределенный DDL-запрос из клиента clickhouse-01
, чтобы создать новую базу данных под названием uk
:
Вы можете снова выполнить тот же запрос, что и раньше, из клиента каждого хоста,
чтобы подтвердить, что база данных была создана по всему кластеру, несмотря на то, что запрос был выполнен только на clickhouse-01
:
Создание таблицы в кластере
Теперь, когда база данных создана, вы создадите распределенную таблицу.
Распределенные таблицы - это таблицы, которые имеют доступ к шардированным хранилищам, расположенным на разных
хостах, и определяются с использованием движка таблиц Distributed
. Распределенная таблица
служит интерфейсом для всех шардов в кластере.
Запустите следующий запрос из любого клиента хоста:
Обратите внимание, что он идентичен запросу, использованному в исходном операторе CREATE
учебника примера Цены на недвижимость в Великобритании,
за исключением оператора ON CLUSTER
.
Оператор ON CLUSTER
предназначен для распределенного выполнения DDL (языка определения данных)
запросов, таких как CREATE
, DROP
, ALTER
и RENAME
, обеспечивая применение этих
изменений схемы ко всем узлам в кластере.
Вы можете выполнить запрос ниже из клиента каждого хоста, чтобы подтвердить, что таблица была создана по всему кластеру:
Вставка данных в распределенную таблицу
Перед тем как вставить данные о ценах на недвижимость в Великобритании, давайте проведем небольшой эксперимент, чтобы увидеть, что произойдет, когда мы вставляем данные в обычную таблицу с любого хоста.
Создайте тестовую базу данных и таблицу с помощью следующего запроса с любого хоста:
Теперь на clickhouse-01
выполните следующий запрос INSERT
:
Переключитесь на clickhouse-02
и выполните следующий запрос INSERT
:
Теперь с clickhouse-01
или clickhouse-02
выполните следующий запрос:
Вы заметите, что возвращается только та строка, которая была вставлена в таблицу на этом конкретном хосте, а не обе строки.
Чтобы читать данные из двух шардов, нам нужен интерфейс, который может обрабатывать запросы по всем шарам, объединяя данные из обоих шардов, когда мы выполняем выборочные запросы к ним, и обрабатывая вставку данных в отдельные шары, когда мы выполняем запросы на вставку.
В ClickHouse этот интерфейс называется распределенной таблицей, которую мы создаем с помощью
движка таблиц Distributed
. Давайте посмотрим, как это работает.
Создайте распределенную таблицу с помощью следующего запроса:
В этом примере функция rand()
выбрана в качестве ключа шардирования, чтобы
вставки случайным образом распределялись по шартам.
Теперь выполните запрос к распределенной таблице с любого хоста, и вы получите обратно обе строки, которые были вставлены на двух хостах:
Давайте сделаем то же самое для данных о ценах на недвижимость в Великобритании. С любого клиента хоста
выполните следующий запрос для создания распределенной таблицы, используя существующую таблицу,
созданную ранее с ON CLUSTER
:
Теперь подключитесь к любому из хостов и вставьте данные:
После вставки данных вы можете проверить количество строк с помощью распределенной таблицы:
Если вы выполните следующий запрос на любом хосте, вы увидите, что данные были
более или менее равномерно распределены по шартам (имейте в виду, что выбор шардов для вставки
был установлен с помощью rand()
, так что результаты могут отличаться):
Что произойдет, если один из хостов выйдет из строя? Давайте смоделируем это, выключив
clickhouse-01
:
Проверьте, что хост отключен, запустив:
Теперь с clickhouse-02
выполните тот же выборочный запрос, который мы выполняли ранее на распределенной
таблице:
К сожалению, наш кластер не является отказоустойчивым. Если один из хостов выйдет из строя, кластер считается поврежденным, и запрос завершится неудачей, в отличие от реплицированной таблицы, которую мы видели в предыдущем примере, где мы смогли вставить данные даже когда один из хостов вышел из строя.
Заключение
Преимущество этой топологии кластера заключается в том, что данные распределяются по отдельным хостам и используются половина памяти на узел. Более того, запросы обрабатываются по обоим шартам, что более эффективно с точки зрения использования памяти и снижает ввод-вывод на хост.
Основным недостатком этой топологии кластера является то, что потеря одного из хостов делает нас неспособными обрабатывать запросы.
В следующем примере мы рассмотрим, как настроить кластер с двумя шардерами и двумя репликами, обеспечивающий масштабируемость и отказоустойчивость.