Перейти к основному содержимому
Перейти к основному содержимому

Шарды и реплики таблиц


примечание

Эта тема не относится к 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()), берёт результат по модулю количества серверов шарда и использует это как 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: