Масштабирование
Описание
Эта примерная архитектура предназначена для обеспечения масштабируемости. Она включает три узла: два комбинированных сервера ClickHouse плюс координация (ClickHouse Keeper) и третий сервер только с ClickHouse Keeper для завершения кворума из трех. В этом примере мы создадим базу данных, таблицу и распределенную таблицу, которая сможет запрашивать данные на обоих узлах.
Уровень: Базовый
Терминология
Реплика
Копия данных. ClickHouse всегда имеет хотя бы одну копию ваших данных, и минимальное количество реплик составляет одну. Это важный момент, вы можете не привыкнуть считать оригинальную копию ваших данных как реплику, но именно такой термин используется в коде и документации ClickHouse. Добавление второй реплики ваших данных обеспечивает отказоустойчивость.
Шард
Подмножество данных. ClickHouse всегда имеет хотя бы один шард для ваших данных, поэтому если вы не разделяете данные на несколько серверов, ваши данные будут храниться в одном шарде. Шардирование данных на несколько серверов можно использовать для распределения нагрузки, если вы превышаете мощность одного сервера. Целевой сервер определяется по шифрующему ключу, который задаётся при создании распределенной таблицы. Шифрующий ключ может быть случайным или являться результатом хеш-функции. Примеры развертывания, связанные с шардированием, будут использовать rand()
в качестве шифрующего ключа и предоставят дополнительную информацию о том, когда и как выбрать другой шифрующий ключ.
Распределённая координация
ClickHouse Keeper предоставляет систему координации для репликации данных и выполнения распределённых DDL запросов. ClickHouse Keeper совместим с Apache ZooKeeper.
Среда
Диаграмма архитектуры

Узел | Описание |
---|---|
chnode1 | Данные + ClickHouse Keeper |
chnode2 | Данные + ClickHouse Keeper |
chnode3 | Используется для кворума ClickHouse Keeper |
В производственных средах мы настоятельно рекомендуем запускать ClickHouse Keeper на выделенных хостах. Эта базовая конфигурация запускает функциональность Keeper в процессе ClickHouse Server. Инструкции по развертыванию ClickHouse Keeper в отдельном режиме доступны в документации по установке.
Установка
Установите ClickHouse на трех серверах, следуя инструкциям для вашего типа архива (.deb, .rpm, .tar.gz и т.д.). Для этого примера вы будете следовать инструкциям по установке ClickHouse Server и клиента на всех трех машинах.
Редактирование конфигурационных файлов
При настройке ClickHouse Server путем добавления или редактирования конфигурационных файлов, вы должны:
- Добавлять файлы в директорию
/etc/clickhouse-server/config.d/
- Добавлять файлы в директорию
/etc/clickhouse-server/users.d/
- Оставить файл
/etc/clickhouse-server/config.xml
без изменений - Оставить файл
/etc/clickhouse-server/users.xml
без изменений
Конфигурация chnode1
Для chnode1
существует пять конфигурационных файлов. Вы можете выбрать объединение этих файлов в один, но для ясности в документации может быть проще рассмотреть их отдельно. Читая конфигурационные файлы, вы увидите, что большинство конфигураций одинаковы между chnode1
и chnode2
; различия будут выделены.
Конфигурация сети и логирования
Эти значения могут быть настроены по вашему усмотрению. Эта примерная конфигурация предоставляет вам журнал отладки, который будет обновляться при достижении 1000M трижды. ClickHouse будет слушать на IPv4 сети на портах 8123 и 9000 и будет использовать порт 9009 для межсерверной связи.
Конфигурация ClickHouse Keeper
ClickHouse Keeper предоставляет систему координации для репликации данных и выполнения распределенных DDL запросов. ClickHouse Keeper совместим с Apache ZooKeeper. Эта конфигурация включает ClickHouse Keeper на порту 9181. Выделенная строка указывает, что этот экземпляр Keeper имеет server_id
равный 1. Это единственное различие в файле enable-keeper.xml
на всех трех серверах. У chnode2
будет установлен server_id
равный 2, а у chnode3
— равный 3. Раздел конфигурации raft одинаков на всех трех серверах, и он выделен ниже, чтобы показать вам взаимосвязь между server_id
и экземпляром server
в конфигурации raft.
Если по какой-либо причине узел Keeper заменяется или восстанавливается, не используйте существующий server_id
. Например, если узел Keeper с server_id
равным 2 восстанавливается, дайте ему server_id
равный 4 или выше.
Конфигурация макросов
Макросы shard
и replica
упрощают работу с распределенным 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
. - Внутренняя репликация для шард установлена в true. Каждая шард может иметь параметр
internal_replication
, определенный в конфигурационном файле. Если этот параметр установлен в true, операция записи выбирает первую здоровую реплику и записывает данные в нее.
Конфигурирование использования Keeper
Выше уже была настроена несколько файлов ClickHouse Keeper. Этот конфигурационный файл use-keeper.xml
настраивает ClickHouse Server на использование ClickHouse Keeper для координации репликации и распределенного DDL. Этот файл указывает, что ClickHouse Server должен использовать Keeper на узлах chnode1
- chnode3
на порту 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
и выполните запрос к распределенной таблице, чтобы увидеть обе строки.