Шардирование таблиц в ClickHouse
Шардирование обеспечивает ряд преимуществ при высокой частоте запросов и работе с большими наборами данных. При этом создается распределенная таблица, которая маршрутизирует запросы к нижележащим таблицам. Обращаться к данным в шардированных таблицах можно как через распределенную таблицу, так и напрямую.
Существует три подхода к шардированию:
- Классический, когда распределенная таблица использует все шарды кластера.
- С группами шардов, когда часть шардов объединена в группу.
- Продвинутый с группами шардов, когда шарды разделены на две группы: в одной находится распределенная таблица, в другой — нижележащие таблицы.
Далее рассмотрены примеры настройки шардирования для всех трех подходов.
Подробнее читайте в разделе Шардирование в Managed Service for ClickHouse.
Чтобы настроить шардирование:
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Подготовьте инфраструктуру
-
Создайте кластер Managed Service for ClickHouse:
-
Имя кластера —
chcluster
. -
Тип диска — выберите нужный тип дисков.
От выбранного типа дисков зависит минимальное количество хостов в каждом шарде:
- Два хоста, если выбраны локальные SSD-диски (
local-ssd
). - Три хоста, если выбраны сетевые нереплицируемые диски (
network-ssd-nonreplicated
).
Дополнительные хосты для этих типов дисков необходимы для обеспечения отказоустойчивости.
Подробнее см. в разделе Типы дисков в Managed Service for ClickHouse.
- Два хоста, если выбраны локальные SSD-диски (
-
Имя БД —
tutorial
.
Хосты кластера должны быть доступны из интернета.
-
-
Создайте два дополнительных шарда с именами
shard2
,shard3
. -
Создайте группы шардов. Их количество зависит от типа шардирования:
- Шардирование с использованием групп шардов требует одну группу шардов с именем
sgroup
, которая включает шардыshard1
иshard2
. - Продвинутое шардирование с использованием групп шардов требует две группы:
sgroup
включаетshard1
иshard2
.sgroup_data
включаетshard3
.
Для классического шардирования создание групп шардов не требуется.
- Шардирование с использованием групп шардов требует одну группу шардов с именем
-
Если вы используете группы безопасности, настройте их так, чтобы к кластеру можно было подключаться из интернета.
Функциональность находится на стадии Preview.
-
Если у вас еще нет Terraform, установите и настройте его согласно инструкции.
-
Скачайте файл с настройками провайдера. Поместите его в отдельную рабочую директорию и укажите значения параметров.
-
Скачайте в ту же рабочую директорию файл конфигурации для одного из описанных ниже примеров шардирования:
- simple-sharding.tf — классическое шардирование.
- sharding-with-group.tf — шардирование с использованием групп шардов.
- advanced-sharding-with-groups.tf — продвинутое шардирование с использованием групп шардов.
В каждом файле описаны:
- сеть;
- подсеть;
- группа безопасности по умолчанию и правила, необходимые для подключения к кластеру из интернета;
- кластер Managed Service for ClickHouse с необходимыми хостами и шардами.
-
Укажите в конфигурационном файле имя пользователя и пароль, которые будут использоваться для доступа к кластеру Managed Service for ClickHouse.
-
Выполните команду
terraform init
в директории с конфигурационным файлом. Эта команда инициализирует провайдеров, указанных в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера. -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.
-
Настройте clickhouse-client
Установите и настройте clickhouse-client, чтобы иметь возможность подключаться с его помощью к базе данных.
Создайте таблицы с данными
Пусть необходимо включить шардирование для таблицы hits_v1
. Текст запроса на создание таблицы зависит от выбранного подхода к шардированию.
Структура таблицы, которую нужно подставить вместо обозначения <структура таблицы>
, приведена в документации ClickHouse.
После включения шардирования любым из способов, вы сможете отправлять SELECT
- и INSERT
-запросы к созданной распределенной таблице, и они будут обрабатываться согласно заданной конфигурации.
В примерах в качестве ключа шардирования используется случайное число rand()
.
Классическое шардирование
В этом примере распределенная таблица, которая будет создана на основе hits_v1
, использует все шарды shard1
, shard2
, shard3
кластера chcluster
.
Перед работой с распределенной таблицей:
-
Подключитесь к базе
tutorial
. -
Создайте таблицу
hits_v1
на движке MergeTree, которая будет размещена на всех хостах кластера:CREATE TABLE tutorial.hits_v1 ON CLUSTER '{cluster}' ( <структура таблицы> ) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192
Чтобы создать распределенную таблицу hits_v1_distributed
в кластере:
-
Подключитесь к базе
tutorial
. -
Создайте таблицу на движке Distributed:
CREATE TABLE tutorial.hits_v1_distributed ON CLUSTER '{cluster}' AS tutorial.hits_v1 ENGINE = Distributed('{cluster}', tutorial, hits_v1, rand())
Здесь допустимо вместо явного указания структуры таблицы использовать выражение
AS tutorial.hits_v1
, т. к. таблицыhits_v1_distributed
иhits_v1
находятся на одних и тех же хостах кластера.При создании таблицы на движке Distributed укажите идентификатор кластера
chcluster
. Его можно получить со списком кластеров в каталоге.Совет
Вместо идентификатора кластера можно использовать макрос
{cluster}
— при выполнении запроса идентификатор кластера, в котором выполняется операцияCREATE TABLE
, будет подставлен автоматически.
Шардирование с использованием групп шардов
В этом примере:
- Используется одна группа шардов
sgroup
. - Распределенная таблица и нижележащая таблица
hits_v1
расположены в одной группе шардовsgroup
кластера.
Перед работой с распределенной таблицей:
-
Подключитесь к базе
tutorial
. -
Создайте таблицу
hits_v1
на движке MergeTree, которая использует все хосты группы шардовsgroup
кластера:CREATE TABLE tutorial.hits_v1 ON CLUSTER sgroup ( <структура таблицы> ) ENGINE = MergeTree() PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192
Чтобы создать распределенную таблицу tutorial.hits_v1_distributed
в кластере:
-
Подключитесь к базе
tutorial
. -
Создайте таблицу на движке Distributed:
CREATE TABLE tutorial.hits_v1_distributed ON CLUSTER sgroup AS tutorial.hits_v1 ENGINE = Distributed(sgroup, tutorial, hits_v1, rand())
Здесь допустимо вместо явного указания структуры таблицы использовать выражение
AS tutorial.hits_v1
, т. к. таблицыhits_v1_distributed
иhits_v1
используют один шард и находятся на одних и тех же хостах.
Продвинутое шардирование с использованием групп шардов
В этом примере:
- Используются две группы шардов:
sgroup
иsgroup_data
. - Распределенная таблица расположена в группе шардов
sgroup
. - Нижележащая таблица
hits_v1
расположена в группе шардовsgroup_data
.
Перед работой с распределенной таблицей:
-
Подключитесь к базе
tutorial
. -
Создайте таблицу
hits_v1
на движке ReplicatedMergeTree, которая использует все хосты группы шардовsgroup_data
кластера:CREATE TABLE tutorial.hits_v1 ON CLUSTER sgroup_data ( <структура таблицы> ) ENGINE = ReplicatedMergeTree('/tables/{shard}/hits_v1', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID) SETTINGS index_granularity = 8192
Движок ReplicatedMergeTree используется для обеспечения отказоустойчивости.
Чтобы создать распределенную таблицу tutorial.hits_v1_distributed
в кластере:
-
Подключитесь к базе
tutorial
. -
Создайте таблицу на движке Distributed:
CREATE TABLE tutorial.hits_v1_distributed ON CLUSTER sgroup ( <структура таблицы> ) ENGINE = Distributed(sgroup_data, tutorial, hits_v1, rand())
Здесь необходимо явно указать структуру распределенной таблицы, т. к. таблицы
hits_v1_distributed
иhits_v1
используют разные шарды и находятся на разных хостах.
Проверьте работоспособность таблиц
Чтобы проверить работоспособность созданной распределенной таблицы tutorial.hits_v1_distributed
:
-
Загрузите тестовый набор данных
hits_v1
:curl https://storage.yandexcloud.net/doc-files/managed-clickhouse/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
-
Наполните таблицу тестовыми данными:
clickhouse-client \ --host "<FQDN любого хоста с распределенной таблицей>" \ --secure \ --port 9440 \ --user "<имя пользователя>" \ --password "<пароль пользователя>" \ --database "tutorial" \ --query "INSERT INTO tutorial.hits_v1_distributed FORMAT TSV" \ --max_insert_block_size=100000 < hits_v1.tsv
Чтобы узнать имена хостов, посмотрите список хостов ClickHouse в кластере.
-
Выполните один или несколько тестовых запросов к этой таблице. Например, можно узнать количество строк в ней:
SELECT count() FROM tutorial.hits_v1_distributed
Результат:
8873898
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, во избежание списания средств за них:
- Удалите кластер Managed Service for ClickHouse.
- Если для доступа к кластеру использовались статические публичные IP-адреса, освободите и удалите их.
Чтобы удалить инфраструктуру, созданную с помощью Terraform:
-
В терминале перейдите в директорию с планом инфраструктуры.
-
Удалите конфигурационный файл (
simple-sharding.tf
sharding-with-group.tf
илиadvanced-sharding-with-groups.tf
). -
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Подтвердите изменение ресурсов.
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
Все ресурсы, которые были описаны в конфигурационном файле, будут удалены.
-