Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Managed Service for ClickHouse
  • Начало работы
  • Пошаговые инструкции
  • Практические руководства
    • Все сценарии
    • Добавление данных в БД
    • Миграция данных в Managed Service for ClickHouse
    • Шардирование таблиц
    • Использование гибридного хранилища
    • Получение данных из Managed Service for Apache Kafka®
    • Получение данных из RabbitMQ
    • Обмен данными с Yandex Data Proc
    • Настройка Yandex Cloud DNS для доступа к кластеру из других облачных сетей
    • Анализ логов Yandex Object Storage при помощи Yandex DataLens
    • Настройка Managed Service for ClickHouse для Graphite
    • Сохранение потока данных Yandex Data Streams в Managed Service for ClickHouse
    • Миграция базы данных из Google BigQuery
    • Поставка данных из Managed Service for Apache Kafka® с помощью Yandex Data Transfer
  • Концепции
  • Управление доступом
  • Правила тарификации
  • Справочник API
  • История изменений
  • Вопросы и ответы
  1. Практические руководства
  2. Шардирование таблиц

Шардирование таблиц в ClickHouse

Статья создана
Yandex Cloud
  • Перед началом работы
    • Подготовьте инфраструктуру
    • Настройте clickhouse-client
  • Создайте таблицы с данными
    • Классическое шардирование
    • Шардирование с использованием групп шардов
    • Продвинутое шардирование с использованием групп шардов
  • Проверьте работоспособность таблиц
  • Удалите созданные ресурсы

Шардирование обеспечивает ряд преимуществ при высокой частоте запросов и работе с большими наборами данных. При этом создается распределенная таблица, которая маршрутизирует запросы к нижележащим таблицам. Обращаться к данным в шардированных таблицах можно как через распределенную таблицу, так и напрямую.

Существует три подхода к шардированию:

  • Классический, когда распределенная таблица использует все шарды кластера.
  • С группами шардов, когда часть шардов объединена в группу.
  • Продвинутый с группами шардов, когда шарды разделены на две группы: в одной находится распределенная таблица, в другой — нижележащие таблицы.

Далее рассмотрены примеры настройки шардирования для всех трех подходов.

Подробнее читайте в разделе Шардирование в Managed Service for ClickHouse.

Чтобы настроить шардирование:

  1. Создайте таблицы с данными.
  2. Проверьте работоспособность таблиц.

Если созданные ресурсы вам больше не нужны, удалите их.

Перед началом работы

Подготовьте инфраструктуру

Вручную
С помощью Terraform
  1. Создайте кластер Managed Service for ClickHouse:

    • Имя кластера — chcluster.

    • Тип диска — выберите нужный тип дисков.

      От выбранного типа дисков зависит минимальное количество хостов в каждом шарде:

      • Два хоста, если выбраны локальные SSD-диски (local-ssd).
      • Три хоста, если выбраны сетевые нереплицируемые диски (network-ssd-nonreplicated).

      Дополнительные хосты для этих типов дисков необходимы для обеспечения отказоустойчивости.

      Подробнее см. в разделе Типы дисков в Managed Service for ClickHouse.

    • Имя БД — tutorial.

    Хосты кластера должны быть доступны из интернета.

  2. Создайте два дополнительных шарда с именами shard2, shard3.

  3. Добавьте в кластер три хоста ZooKeeper.

  4. Создайте группы шардов. Их количество зависит от типа шардирования:

    • Шардирование с использованием групп шардов требует одну группу шардов с именем sgroup, которая включает шарды shard1 и shard2.
    • Продвинутое шардирование с использованием групп шардов требует две группы:
      • sgroup включает shard1 и shard2.
      • sgroup_data включает shard3.

    Для классического шардирования создание групп шардов не требуется.

  5. Если вы используете группы безопасности, настройте их так, чтобы к кластеру можно было подключаться из интернета.

    Функциональность находится на стадии Preview.

  1. Если у вас еще нет Terraform, установите и настройте его согласно инструкции.

  2. Скачайте файл с настройками провайдера. Поместите его в отдельную рабочую директорию и укажите значения параметров.

  3. Скачайте в ту же рабочую директорию файл конфигурации для одного из описанных ниже примеров шардирования:

    • simple-sharding.tf — классическое шардирование.
    • sharding-with-group.tf — шардирование с использованием групп шардов.
    • advanced-sharding-with-groups.tf — продвинутое шардирование с использованием групп шардов.

    В каждом файле описаны:

    • сеть;
    • подсеть;
    • группа безопасности по умолчанию и правила, необходимые для подключения к кластеру из интернета;
    • кластер Managed Service for ClickHouse с необходимыми хостами и шардами.
  4. Укажите в конфигурационном файле имя пользователя и пароль, которые будут использоваться для доступа к кластеру Managed Service for ClickHouse.

  5. Выполните команду terraform init в директории с конфигурационным файлом. Эта команда инициализирует провайдеров, указанных в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера.

  6. Проверьте корректность файлов конфигурации Terraform с помощью команды:

    terraform validate
    

    Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  7. Создайте необходимую инфраструктуру:

    1. Выполните команду для просмотра планируемых изменений:

      terraform plan
      

      Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.

    2. Если вас устраивают планируемые изменения, внесите их:

      1. Выполните команду:

        terraform apply
        
      2. Подтвердите изменение ресурсов.

      3. Дождитесь завершения операции.

    В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.

Настройте clickhouse-client

Установите и настройте clickhouse-client, чтобы иметь возможность подключаться с его помощью к базе данных.

Создайте таблицы с данными

Пусть необходимо включить шардирование для таблицы hits_v1. Текст запроса на создание таблицы зависит от выбранного подхода к шардированию.

Структура таблицы, которую нужно подставить вместо обозначения <структура таблицы>, приведена в документации ClickHouse.

После включения шардирования любым из способов, вы сможете отправлять SELECT- и INSERT-запросы к созданной распределенной таблице, и они будут обрабатываться согласно заданной конфигурации.

В примерах в качестве ключа шардирования используется случайное число rand().

Классическое шардирование

В этом примере распределенная таблица, которая будет создана на основе hits_v1, использует все шарды shard1, shard2, shard3 кластера chcluster.

Перед работой с распределенной таблицей:

  1. Подключитесь к базе tutorial.

  2. Создайте таблицу 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 в кластере:

  1. Подключитесь к базе tutorial.

  2. Создайте таблицу на движке 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 кластера.

Перед работой с распределенной таблицей:

  1. Подключитесь к базе tutorial.

  2. Создайте таблицу 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 в кластере:

  1. Подключитесь к базе tutorial.

  2. Создайте таблицу на движке 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 используют один шард и находятся на одних и тех же хостах.

Продвинутое шардирование с использованием групп шардов

В этом примере:

  1. Используются две группы шардов: sgroup и sgroup_data.
  2. Распределенная таблица расположена в группе шардов sgroup.
  3. Нижележащая таблица hits_v1 расположена в группе шардов sgroup_data.

Перед работой с распределенной таблицей:

  1. Подключитесь к базе tutorial.

  2. Создайте таблицу 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 в кластере:

  1. Подключитесь к базе tutorial.

  2. Создайте таблицу на движке 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:

  1. Загрузите тестовый набор данных hits_v1:

    curl https://storage.yandexcloud.net/doc-files/managed-clickhouse/hits_v1.tsv.xz | unxz --threads=`nproc` > hits_v1.tsv
    
  2. Наполните таблицу тестовыми данными:

    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 в кластере.

  3. Выполните один или несколько тестовых запросов к этой таблице. Например, можно узнать количество строк в ней:

    SELECT count() FROM tutorial.hits_v1_distributed
    

    Результат:

    8873898
    

Удалите созданные ресурсы

Удалите ресурсы, которые вы больше не будете использовать, во избежание списания средств за них:

Вручную
С помощью Terraform
  1. Удалите кластер Managed Service for ClickHouse.
  2. Если для доступа к кластеру использовались статические публичные IP-адреса, освободите и удалите их.

Чтобы удалить инфраструктуру, созданную с помощью Terraform:

  1. В терминале перейдите в директорию с планом инфраструктуры.

  2. Удалите конфигурационный файл (simple-sharding.tf sharding-with-group.tf или advanced-sharding-with-groups.tf).

  3. Проверьте корректность файлов конфигурации Terraform с помощью команды:

    terraform validate
    

    Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  4. Подтвердите изменение ресурсов.

    1. Выполните команду для просмотра планируемых изменений:

      terraform plan
      

      Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.

    2. Если вас устраивают планируемые изменения, внесите их:

      1. Выполните команду:

        terraform apply
        
      2. Подтвердите изменение ресурсов.

      3. Дождитесь завершения операции.

    Все ресурсы, которые были описаны в конфигурационном файле, будут удалены.

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Подготовьте инфраструктуру
  • Настройте clickhouse-client
  • Создайте таблицы с данными
  • Классическое шардирование
  • Шардирование с использованием групп шардов
  • Продвинутое шардирование с использованием групп шардов
  • Проверьте работоспособность таблиц
  • Удалите созданные ресурсы