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

Разделение хранения и вычислений

Обзор

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

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

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

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

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

предупреждение

Не настраивайте политику жизненного цикла AWS/GCS. Это не поддерживается и может привести к повреждённым таблицам.

1. Используйте S3 в качестве диска ClickHouse

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

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

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

Скопируйте следующий XML в newly созданный файл, заменив 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

2. Создание таблицы, использующей S3

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

Создайте таблицу, указав новую политику хранения S3:

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 с использованием разделения вычислений и хранения

3. Реализация репликации для отказоустойчивости (по желанию)

предупреждение

Не настраивайте политику жизненного цикла AWS/GCS. Это не поддерживается и может привести к повреждённым таблицам.

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

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

Дальнейшее чтение