Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Разделение хранилища и вычислительных ресурсов

Обзор

В этом руководстве рассматривается, как использовать ClickHouse и S3 для реализации архитектуры с раздельными хранилищем и вычислительными ресурсами.

Разделение хранилища и вычислительных ресурсов означает, что вычислительные ресурсы и ресурсы хранения управляются независимо друг от друга. В ClickHouse это обеспечивает лучшую масштабируемость, экономическую эффективность и гибкость. При необходимости вы можете масштабировать ресурсы хранения и вычислений по отдельности, оптимизируя производительность и затраты.

Использование ClickHouse с S3 в качестве хранилища особенно полезно в сценариях, где производительность запросов к «холодным» данным менее критична. ClickHouse поддерживает использование S3 в качестве хранилища для движка MergeTree с помощью S3BackedMergeTree. Этот движок таблицы позволяет воспользоваться преимуществами S3 в плане масштабируемости и снижения затрат, сохраняя при этом производительность вставки и запросов движка MergeTree.

Обратите внимание: реализация и сопровождение архитектуры с раздельными хранилищем и вычислительными ресурсами сложнее, чем стандартные развертывания ClickHouse. Хотя самоуправляемый ClickHouse позволяет разделять хранилище и вычисления, как описано в этом руководстве, мы рекомендуем использовать ClickHouse Cloud, который позволяет использовать ClickHouse в такой архитектуре без дополнительной настройки с помощью движка таблицы SharedMergeTree.

Это руководство предполагает, что вы используете ClickHouse версии 22.8 или выше.

Использование S3 как диска ClickHouse

Создание диска

Создайте новый файл в каталоге ClickHouse config.d, чтобы сохранить конфигурацию хранилища:

vim /etc/clickhouse-server/config.d/storage_config.xml

Скопируйте следующий XML во вновь созданный файл, заменив BUCKET, ACCESS_KEY_ID, SECRET_ACCESS_KEY на параметры AWS-бакета, в котором вы хотите хранить данные:

<clickhouse>
  <storage_configuration>
    <disks>
      <s3_disk>
        <type>s3</type>
        <endpoint>$BUCKET</endpoint>
        <access_key_id>$ACCESS_KEY_ID</access_key_id>
        <secret_access_key>$SECRET_ACCESS_KEY</secret_access_key>
        <metadata_path>/var/lib/clickhouse/disks/s3_disk/</metadata_path>
      </s3_disk>
      <s3_cache>
        <type>cache</type>
        <disk>s3_disk</disk>
        <path>/var/lib/clickhouse/disks/s3_cache/</path>
        <max_size>10Gi</max_size>
      </s3_cache>
    </disks>
    <policies>
      <s3_main>
        <volumes>
          <main>
            <disk>s3_disk</disk>
          </main>
        </volumes>
      </s3_main>
    </policies>
  </storage_configuration>
</clickhouse>

Если вам нужно дополнительно настроить диск S3 — например, указать region или отправить пользовательский HTTP-header, — список соответствующих параметров можно найти здесь.

Вы также можете заменить access_key_id и secret_access_key следующими значениями — в этом случае система попытается получить учетные данные из переменных окружения и метаданных Amazon EC2:

<use_environment_credentials>true</use_environment_credentials>

После создания файла конфигурации необходимо изменить владельца и группу файла на пользователя и группу clickhouse:

chown clickhouse:clickhouse /etc/clickhouse-server/config.d/storage_config.xml

Теперь можно перезапустить сервер ClickHouse, чтобы изменения применились:

service clickhouse-server restart

Создайте таблицу на базе S3

Чтобы проверить, что S3-диск настроен правильно, можно попробовать создать таблицу и выполнить запрос к ней.

Создайте таблицу, указав новую storage policy:

CREATE TABLE my_s3_table
  (
    `id` UInt64,
    `column1` String
  )
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main';

Обратите внимание, что нам не пришлось указывать движок как S3BackedMergeTree. ClickHouse автоматически преобразует тип движка внутри системы, если обнаруживает, что таблица использует S3 в качестве хранилища.

Покажем, что таблица была создана с правильной политикой:

SHOW CREATE TABLE my_s3_table;

Должен отобразиться следующий результат:

┌─statement────────────────────────────────────────────────────
│ CREATE TABLE default.my_s3_table
(
  `id` UInt64,
  `column1` String
)
ENGINE = MergeTree
ORDER BY id
SETTINGS storage_policy = 's3_main', index_granularity = 8192
└──────────────────────────────────────────────────────────────

Теперь вставим несколько строк в нашу новую таблицу:

INSERT INTO my_s3_table (id, column1)
  VALUES (1, 'abc'), (2, 'xyz');

Давайте убедимся, что строки были вставлены:

SELECT * FROM my_s3_table;
┌─id─┬─column1─┐
│  1 │ abc     │
│  2 │ xyz     │
└────┴─────────┘

2 rows in set. Elapsed: 0.284 sec.

В консоли AWS, если данные были успешно записаны в S3, вы должны увидеть, что ClickHouse создал новые файлы в указанном вами бакете.

Если всё сработало успешно, теперь вы используете ClickHouse с разделением хранилища и вычислительных ресурсов!

Пример S3 бакета с использованием разделения вычислительных ресурсов и хранилища

Настройка репликации для обеспечения отказоустойчивости (необязательно)

Для отказоустойчивости можно использовать несколько серверных узлов ClickHouse, размещённых в нескольких регионах AWS, с отдельным S3 бакетом для каждого узла.

Репликацию с S3-дисками можно настроить с помощью движка таблицы ReplicatedMergeTree. Подробности см. в следующем руководстве:

Дополнительные материалы

Navigation