Шарды и реплики таблиц
Эта тема не относится к ClickHouse Cloud, где Параллельные реплики функционируют как несколько шардов в традиционных кластерах ClickHouse без общего хранения, а объектное хранилище заменяет реплики, обеспечивая высокую доступность и отказоустойчивость.
Что такое шарды таблиц в ClickHouse?
В традиционных кластерах ClickHouse с архитектурой shared-nothing шардирование используется, когда ① данные слишком велики для единственного сервера или ② один сервер слишком медлен для обработки данных. Следующая фигура иллюстрирует случай ①, когда таблица uk_price_paid_simple превышает возможности одной машины:

В таком случае данные могут быть распределены между несколькими серверами ClickHouse в виде шардов таблиц:

Каждый шард содержит подмножество данных и функционирует как обычная таблица ClickHouse, к которой можно выполнять запросы независимо. Однако запросы будут обрабатывать только это подмножество, что может быть допустимым вариантом в зависимости от распределения данных. Обычно распределенная таблица (обычно на сервер) предоставляет единый обзор полного набора данных. Она не хранит данные сама по себе, а пересылает SELECT запросы ко всем шардам, собирает результаты и направляет INSERT для равномерного распределения данных.
Создание распределенной таблицы
Чтобы проиллюстрировать пересылку SELECT запросов и маршрутизацию INSERT, мы рассмотрим пример таблицы Что такое части таблиц, разделенной на два шара на двух серверах ClickHouse. Сначала мы покажем DDL-запрос для создания соответствующей Распределенной таблицы для этой конфигурации:
Клаузула ON CLUSTER
делает DDL-запрос распределенным DDL-запросом, инструктируя ClickHouse создать таблицу на всех серверах, перечисленных в определении кластера test_cluster
. Распределенный DDL требует дополнительного компонента Keeper в архитектуре кластера.
Для параметров распределенного движка мы указываем имя кластера (test_cluster
), имя базы данных (uk
) для целевой шардированной таблицы, имя шардированной целевой таблицы (uk_price_paid_simple
) и ключ шардирования для маршрутизации INSERT. В этом примере мы используем функцию rand для случайного назначения строк на шарды. Однако можно использовать любое выражение — даже сложные — в качестве ключа шардирования, в зависимости от случая использования. Следующий раздел иллюстрирует, как работает маршрутизация INSERT.
Маршрутизация INSERT
Ниже показана схема, иллюстрирующая, как INSERT в распределенную таблицу обрабатываются в ClickHouse:

① INSERT (с одной строкой), направленный на распределенную таблицу, отправляется на сервер ClickHouse, который хостит таблицу, либо напрямую, либо через балансировщик нагрузки.
② Для каждой строки из INSERT (в нашем примере только одна) ClickHouse оценивает ключ шардирования (в данном случае rand()), берет результат по модулю количество серверов шардов и использует это как идентификатор целевого сервера (идентификаторы начинаются с 0 и увеличиваются на 1). Строка затем пересылается и ③ вставляется в соответствующий шард таблицы сервера.
Следующий раздел объясняет, как работает пересылка SELECT.
Пересылка SELECT
Эта схема показывает, как обрабатываются SELECT-запросы с распределенной таблицей в ClickHouse:

① Аггрегационный запрос SELECT, нацеленный на распределенную таблицу, отправляется на соответствующий сервер ClickHouse, либо напрямую, либо через балансировщик нагрузки.
② Распределенная таблица пересылает запрос ко всем серверам, которые хостят шарды целевой таблицы, где каждый сервер ClickHouse вычисляет свой локальный агрегатный результат параллельно.
Затем сервер ClickHouse, на котором изначально была нацелена распределенная таблица ③ собирает все локальные результаты, ④ объединяет их в окончательный глобальный результат и ⑤ возвращает его отправителю запроса.
Что такое реплики таблиц в ClickHouse?
Репликация в ClickHouse обеспечивает целостность данных и резервное копирование за счет поддержания копий данных шардов на нескольких серверах. Поскольку аппаратные сбои неизбежны, репликация предотвращает потерю данных, обеспечивая наличие нескольких реплик для каждого шарда. Записи могут направляться на любую реплику, либо напрямую, либо через распределенную таблицу, которая выбирает реплику для операции. Изменения автоматически пропагируются на другие реплики. В случае сбоя или обслуживания данные остаются доступными на других репликах, и как только сбойный хост восстанавливается, он автоматически синхронизируется, чтобы оставаться актуальным.
Обратите внимание, что для репликации требуется компонент Keeper в архитектуре кластера.
Следующая схема иллюстрирует кластер ClickHouse с шестью серверами, где два шарда таблицы Shard-1
и Shard-2
, представленные ранее, имеют по три реплики. Запрос отправляется в этот кластер:

Обработка запросов работает аналогично конфигурациям без реплик, при этом только одна реплика с каждого шарда выполняет запрос.
Реплики не только обеспечивают целостность данных и резервное копирование, но также улучшают пропускную способность обработки запросов, позволяя нескольким запросам выполняться параллельно на разных репликах.
① Запрос, нацеленный на распределенную таблицу, отправляется на соответствующий сервер ClickHouse, либо напрямую, либо через балансировщик нагрузки.
② Распределенная таблица пересылает запрос одной реплике с каждого шарда, где каждый сервер ClickHouse, хостящий выбранную реплику, вычисляет свой локальный результат запроса параллельно.
Остальная часть работает так же, как и в конфигурациях без реплик и не показана на схеме выше. Сервер ClickHouse, хостящий изначально нацеленную распределенную таблицу, собирает все локальные результаты, объединяет их в окончательный глобальный результат и возвращает его отправителю запроса.
Обратите внимание, что ClickHouse позволяет настраивать стратегию пересылки запросов для ②. По умолчанию — в отличие от схемы выше — распределенная таблица предпочитает локальную реплику, если она доступна, но могут использоваться и другие стратегии балансировки нагрузки.
Где найти дополнительную информацию
Для получения дополнительной информации, выходящей за рамки этого общего введения в шарды и реплики таблиц, ознакомьтесь с нашим руководством по развертыванию и масштабированию.
Мы также настоятельно рекомендуем это учебное видео для более глубокого понимания шардов и реплик ClickHouse: