Шардирование таблиц в 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
.
Для классического шардирования создание групп шардов не требуется.
- Шардирование с использованием групп шардов требует одну группу шардов с именем
-
Если вы используете группы безопасности, настройте их так, чтобы к кластеру можно было подключаться из интернета.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации для одного из описанных ниже примеров шардирования:
- simple-sharding.tf
— классическое шардирование. - sharding-with-groups.tf
— шардирование с использованием групп шардов. - advanced-sharding-with-groups.tf
— продвинутое шардирование с использованием групп шардов.
В каждом файле описаны:
- сеть;
- подсеть;
- группа безопасности по умолчанию и правила, необходимые для подключения к кластеру из интернета;
- кластер Managed Service for ClickHouse® с необходимыми хостами и шардами.
- simple-sharding.tf
-
Укажите в конфигурационном файле имя пользователя и пароль, которые будут использоваться для доступа к кластеру Managed Service for ClickHouse®.
-
Проверьте корректность файлов конфигурации 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-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc