Шарды и реплики таблиц
Эта тема не относится к ClickHouse Cloud, где параллельные реплики функционируют как несколько шардов в традиционных кластерах ClickHouse с архитектурой "отсутствие общего доступа", а объектное хранилище заменяет реплики, обеспечивая высокую доступность и отказоустойчивость.
Что такое шарды таблиц в ClickHouse?
В традиционных кластерах ClickHouse с архитектурой отсутствие общего доступа шардирование используется, когда ① данные слишком большие для одного сервера или ② один сервер слишком медленный для обработки данных. В следующем рисунке иллюстрируется случай ①, когда таблица 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()), берет результат по модулю количества серверов-шардов и использует его как 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: