Обзор
В этом руководстве рассматривается, как использовать 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 с разделением хранилища и вычислительных ресурсов!

Настройка репликации для обеспечения отказоустойчивости (необязательно)
Для отказоустойчивости можно использовать несколько серверных узлов ClickHouse, размещённых в нескольких регионах AWS, с отдельным S3 бакетом для каждого узла.
Репликацию с S3-дисками можно настроить с помощью движка таблицы ReplicatedMergeTree. Подробности см. в следующем руководстве: