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

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

Каждый шард удерживает подмножество данных и функционирует как обычная таблица ClickHouse, которую можно запрашивать независимо. Однако запросы будут обрабатывать только это подмножество, что может быть допустимым в зависимости от распределения данных. Обычно объединенная таблица distributed (часто на сервер) обеспечивает единый обзор полного набора данных. Она не хранит данные, а перенаправляет SELECT запросы ко всем шартам, собирает результаты и отправляет INSERTS для равномерного распределения данных.
Создание распределенной таблицы
Чтобы проиллюстрировать перенаправление 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()), берет результат по модулю количество серверов шардов и использует это в качестве целевого ID сервера (ID начинаются с 0 и увеличиваются на 1). Строка затем перенаправляется и ③ вставляется в шард таблицы соответствующего сервера.
Следующий раздел объясняет, как работает перенаправление SELECT.
Перенаправление SELECT
Эта диаграмма показывает, как обрабатываются SELECT запросы с распределенной таблицей в ClickHouse:

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

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