Внешние диски для хранения данных
Данные, обрабатываемые в ClickHouse, обычно хранятся в локальной файловой системе машины, на которой работает сервер ClickHouse. Это требует дисков большой емкости, что может быть дорого. Чтобы избежать локального хранения данных, поддерживаются различные варианты хранения:
- Amazon S3 объектное хранилище.
- Azure Blob Storage.
- Не поддерживается: Распределенная файловая система Hadoop (HDFS)
ClickHouse также поддерживает внешние движки таблиц, которые отличаются от описанного на этой странице внешнего варианта хранения, поскольку они позволяют читать данные, хранящиеся в каком-либо общем файловом формате (например, Parquet). На этой странице мы описываем конфигурацию хранения для таблиц семейства ClickHouse MergeTree
или Log
.
- Для работы с данными, хранящимися на дисках
Amazon S3
, используйте движок таблиц S3. - Для работы с данными, хранящимися в Azure Blob Storage, используйте движок таблиц AzureBlobStorage.
- Для работы с данными в распределенной файловой системе Hadoop (не поддерживается) используйте движок таблиц HDFS.
Конфигурация внешнего хранилища
MergeTree
и Log
семейства движков таблиц могут хранить данные в S3
, AzureBlobStorage
, HDFS
(не поддерживается) используя диск с типами s3
,
azure_blob_storage
, hdfs
(не поддерживается) соответственно.
Конфигурация диска требует:
- Раздел
type
, равный одному изs3
,azure_blob_storage
,hdfs
(не поддерживается),local_blob_storage
,web
. - Конфигурацию конкретного типа внешнего хранилища.
Начиная с версии ClickHouse 24.1, возможно использовать новый параметр конфигурации. Он требует указания:
type
, равныйobject_storage
object_storage_type
, равный одному изs3
,azure_blob_storage
(или простоazure
, начиная с24.3
),hdfs
(не поддерживается),local_blob_storage
(или простоlocal
, начиная с24.3
),web
.
Дополнительно можно указать metadata_type
(по умолчанию равно local
), но также может быть установлено на plain
, web
, а начиная с 24.4
, plain_rewritable
.
Использование типа метаданных plain
описано в разделе простого хранения, тип метаданных web
может использоваться только с типом объекта хранения web
, тип метаданных local
хранит файлы метаданных локально (каждый файл метаданных содержит отображение к файлам в объектном хранилище и некоторую дополнительную метаинформацию о них).
Например:
равно следующей конфигурации (начиная с версии 24.1
):
Следующая конфигурация:
равна:
Пример полной конфигурации хранения будет выглядеть так:
Начиная с версии 24.1, она также может выглядеть так:
Чтобы сделать определенный тип хранения параметром по умолчанию для всех таблиц MergeTree
, добавьте следующий раздел в файл конфигурации:
Если вы хотите настроить определенную политику хранения для конкретной таблицы, вы можете определить ее в настройках при создании таблицы:
Вы также можете использовать disk
вместо storage_policy
. В этом случае не требуется иметь раздел storage_policy
в файле конфигурации, и достаточно раздела disk
.
Динамическая конфигурация
Также существует возможность указать конфигурацию хранения без предустановленного
диска в файле конфигурации, но она может быть настроена в
настройках запроса CREATE
/ATTACH
.
Следующий пример запроса строится на описанной выше динамической конфигурации диска и показывает, как использовать локальный диск для кэширования данных из таблицы, хранящейся по URL.
Пример ниже добавляет кэш к внешнему хранилищу.
В отмеченных ниже настройках обратите внимание, что диск типа type=web
вложен внутри
диска типа type=cache
.
В примере используется type=web
, но любой тип диска может быть настроен как динамический,
включая локальный диск. Локальные диски требуют аргумент пути, чтобы находиться внутри параметра конфигурации сервера custom_local_disks_base_directory
, который не имеет
значения по умолчанию, поэтому установите это также при использовании локального диска.
Сочетание конфигурации на основе конфигурации и конфигурации, определенной в sql, также возможно:
где web
взят из файла конфигурации сервера:
Использование хранилища S3
Обязательные параметры
Параметр | Описание |
---|---|
endpoint | URL конечной точки S3 в path или virtual hosted стилях. Должен включать корзину и корневой путь для хранения данных. |
access_key_id | Идентификатор ключа доступа S3, используемый для аутентификации. |
secret_access_key | Секретный ключ доступа S3, используемый для аутентификации. |
Дополнительные параметры
Параметр | Описание | Значение по умолчанию |
---|---|---|
region | Название региона S3. | - |
support_batch_delete | Управляет тем, нужно ли проверять поддержку пакетного удаления. Установите в false , когда используете Google Cloud Storage (GCS), поскольку GCS не поддерживает пакетные удаления. | true |
use_environment_credentials | Читает учетные данные AWS из переменных окружения: AWS_ACCESS_KEY_ID , AWS_SECRET_ACCESS_KEY и AWS_SESSION_TOKEN , если они существуют. | false |
use_insecure_imds_request | Если true , использует небезопасный запрос IMDS для получения учетных данных из метаданных Amazon EC2. | false |
expiration_window_seconds | Период грации (в секундах) для проверки, истекли ли учетные данные на основе времени истечения. | 120 |
proxy | Конфигурация прокси для конечной точки S3. Каждый элемент uri внутри блока proxy должен содержать URL прокси. | - |
connect_timeout_ms | Тайм-аус при подключении сокета в миллисекундах. | 10000 (10 секунд) |
request_timeout_ms | Тайм-аус запроса в миллисекундах. | 5000 (5 секунд) |
retry_attempts | Количество попыток повторного запроса для неудачных запросов. | 10 |
single_read_retries | Количество попыток повторного запроса при обрывах соединения во время чтения. | 4 |
min_bytes_for_seek | Минимальное количество байтов для использования операции поиска вместо последовательного чтения. | 1 MB |
metadata_path | Путь в локальной файловой системе для хранения файлов метаданных S3. | /var/lib/clickhouse/disks/<disk_name>/ |
skip_access_check | Если true , пропускает проверки доступа к диску во время старта. | false |
header | Добавляет указанный HTTP заголовок к запросам. Может быть указан несколько раз. | - |
server_side_encryption_customer_key_base64 | Обязательные заголовки для доступа к объектам S3 с шифрованием SSE-C. | - |
server_side_encryption_kms_key_id | Обязательные заголовки для доступа к объектам S3 с шифрованием SSE-KMS. Пустая строка использует управляемый ключ S3 от AWS. | - |
server_side_encryption_kms_encryption_context | Заголовок контекста шифрования для SSE-KMS (используется с server_side_encryption_kms_key_id ). | - |
server_side_encryption_kms_bucket_key_enabled | Включает ключи корзины S3 для SSE-KMS (используется с server_side_encryption_kms_key_id ). | Соответствует настройке на уровне корзины |
s3_max_put_rps | Максимальное количество запросов PUT в секунду перед ограничением. | 0 (безлимитный) |
s3_max_put_burst | Максимальное количество параллельных запросов PUT, прежде чем достигнуть предела RPS. | То же самое, что и s3_max_put_rps |
s3_max_get_rps | Максимальное количествоGET запросов в секунду перед ограничением. | 0 (безлимитный) |
s3_max_get_burst | Максимальное количество параллельных запросов GET перед ограничением RPS. | То же самое, что и s3_max_get_rps |
read_resource | Имя ресурса для планирования запросов на чтение. | Пустая строка (отключено) |
write_resource | Имя ресурса для планирования запросов на запись. | Пустая строка (отключено) |
key_template | Определяет формат генерации ключа объекта с использованием синтаксиса re2. Требуется флаг storage_metadata_write_full_object_key . Несовместимо с root path в endpoint . Требует key_compatibility_prefix . | - |
key_compatibility_prefix | Требуется с key_template . Указывает предыдущий root path из endpoint для чтения более старых версий метаданных. | - |
read_only | Разрешает только чтение с диска. | - |
Google Cloud Storage (GCS) также поддерживается с использованием типа s3
. См. Слияние MergeTree с GCS.
Использование простого хранения
В 22.10
был введен новый тип диска s3_plain
, который предоставляет однократное хранилище.
Параметры конфигурации для него такие же, как для типа диска s3
.
В отличие от типа диска s3
, он хранит данные без изменений. Другими словами,
вместо случайно сгенерированных имен блобов он использует обычные имена файлов
(так же, как ClickHouse хранит файлы на локальном диске) и не хранит никаких
метаданных локально. Например, он производен из данных на s3
.
Этот тип диска позволяет хранить статическую версию таблицы, так как не
разрешает выполнять слияния с существующими данными и не разрешает вставку новых
данных. Случай использования для этого типа диска - создание резервных копий, что можно сделать
с помощью BACKUP TABLE data TO Disk('plain_disk_name', 'backup_name')
. После этого
вы можете выполнить RESTORE TABLE data AS data_restored FROM Disk('plain_disk_name', 'backup_name')
или использовать ATTACH TABLE data (...) ENGINE = MergeTree() SETTINGS disk = 'plain_disk_name'
.
Конфигурация:
Начиная с 24.1
, можно настроить любой диск объектного хранилища (s3
, azure
, hdfs
(не поддерживается), local
), используя
тип метаданных plain
.
Конфигурация:
Использование перезаписываемого простого хранилища S3
Новый тип диска s3_plain_rewritable
был введен в 24.4
.
Похожий на тип диска s3_plain
, он не требует дополнительного хранилища для
файлов метаданных. Вместо этого метаданные хранятся в S3.
В отличие от типа диска s3_plain
, s3_plain_rewritable
позволяет выполнять слияния
и поддерживает операции INSERT
.
Мутации и репликацию таблиц не поддерживаются.
Случай использования для этого типа диска подходит для нереплицируемых таблиц MergeTree
. Хотя
тип диска s3
подходит для нереплицируемых таблиц MergeTree
, вы можете выбрать
тип диска s3_plain_rewritable
, если вам не нужны локальные метаданные
для таблицы и вы готовы принять ограниченный набор операций. Это может
быть полезно, например, для системных таблиц.
Конфигурация:
равно
Начиная с 24.5
, возможно настроить любой диск объектного хранилища
(s3
, azure
, local
) с использованием типа метаданных plain_rewritable
.
Использование Azure Blob Storage
Движки таблиц семейства MergeTree
могут хранить данные в Azure Blob Storage
используя диск с типом azure_blob_storage
.
Конфигурация:
Параметры подключения
Параметр | Описание | Значение по умолчанию |
---|---|---|
storage_account_url (Обязательный) | URL-адрес учетной записи Azure Blob Storage. Например: http://account.blob.core.windows.net или http://azurite1:10000/devstoreaccount1 . | - |
container_name | Имя целевого контейнера. | default-container |
container_already_exists | Контролирует поведение при создании контейнера: - false : Создает новый контейнер - true : Подключается напрямую к существующему контейнеру - Не установлено: Проверяет, существует ли контейнер, создает при необходимости | - |
Параметры аутентификации (диск будет пытаться все доступные методы и Учетные данные управляемого идентификатора):
Параметр | Описание |
---|---|
connection_string | Для аутентификации с использованием строки подключения. |
account_name | Для аутентификации с использованием Общего ключа (используется с account_key ). |
account_key | Для аутентификации с использованием Общего ключа (используется с account_name ). |
Параметры лимита
Параметр | Описание |
---|---|
s3_max_single_part_upload_size | Максимальный размер одного блока загрузки в Blob Storage. |
min_bytes_for_seek | Минимальный размер области, доступной для поиска. |
max_single_read_retries | Максимальное количество попыток прочитать кусок данных из Blob Storage. |
max_single_download_retries | Максимальное количество попыток скачать читаемый буфер из Blob Storage. |
thread_pool_size | Максимальное количество потоков для инстанцирования IDiskRemote . |
s3_max_inflight_parts_for_one_file | Максимальное количество параллельных запросов на загрузку для одного объекта. |
Другие параметры
Параметр | Описание | Значение по умолчанию |
---|---|---|
metadata_path | Путь в локальной файловой системе для хранения файлов метаданных для Blob Storage. | /var/lib/clickhouse/disks/<disk_name>/ |
skip_access_check | Если true , пропускает проверки доступа к диску во время старта. | false |
read_resource | Имя ресурса для планирования запросов на чтение. | Пустая строка (отключено) |
write_resource | Имя ресурса для планирования запросов на запись. | Пустая строка (отключено) |
metadata_keep_free_space_bytes | Количество свободного места на диске для метаданных. | - |
Примеры рабочих конфигураций можно найти в директории интеграционных тестов (см., например, test_merge_tree_azure_blob_storage или test_azure_blob_storage_zero_copy_replication).
Репликация без копирования отключена по умолчанию в версиях ClickHouse 22.8 и выше. Эта функция не рекомендуется для использования в производственной среде.
Использование хранилища HDFS (не поддерживается)
В этой примере конфигурации:
- диск типа
hdfs
(не поддерживается) - данные находятся по адресу
hdfs://hdfs1:9000/clickhouse/
Учтите, что HDFS не поддерживается, и, следовательно, могут возникнуть проблемы при его использовании. Если возникнут проблемы, вы можете сделать запрос на внесение изменений в код.
Имейте в виду, что HDFS может не работать в крайних случаях.
Использование шифрования данных
Вы можете шифровать данные, хранящиеся на S3, или HDFS (не поддерживается) внешних дисков, или на локальном диске. Чтобы включить режим шифрования, в файле конфигурации вы должны определить диск с типом encrypted
и выбрать диск, на котором будут храниться данные. Зашифрованный диск шифрует все записанные файлы на лету, и когда вы читаете файлы с зашифрованного диска, он автоматически их расшифровывает. Таким образом, вы можете работать с зашифрованным диском так же, как с обычным.
Пример конфигурации диска:
Например, когда ClickHouse записывает данные из какой-то таблицы в файл store/all_1_1_0/data.bin
на disk1
, то на самом деле этот файл будет записан на физическом диске по пути /path1/store/all_1_1_0/data.bin
.
При записи того же файла на disk2
он фактически будет записан на физическом диске по пути /path1/path2/store/all_1_1_0/data.bin
в зашифрованном виде.
Обязательные параметры
Параметр | Тип | Описание |
---|---|---|
type | String | Должен быть установлен в encrypted , чтобы создать зашифрованный диск. |
disk | String | Тип диска, который будет использоваться для базового хранения. |
key | Uint64 | Ключ для шифрования и расшифровки. Может быть задан в шестнадцатеричном формате с помощью key_hex . Несколько ключей могут быть указаны с использованием атрибута id . |
Дополнительные параметры
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
path | String | Корневая директория | Место на диске, где будут храниться данные. |
current_key_id | String | - | Идентификатор ключа, используемый для шифрования. Все указанные ключи могут использоваться для расшифровки. |
algorithm | Enum | AES_128_CTR | Алгоритм шифрования. Опции: - AES_128_CTR (16-битный ключ) - AES_192_CTR (24-битный ключ) - AES_256_CTR (32-битный ключ) |
Пример конфигурации диска:
Использование локального кэша
Возможна настройка локального кэша на дисках в конфигурации хранения, начиная с версии 22.3.
Для версий 22.3 - 22.7 кэш поддерживается только для типа диска s3
. Для версий >= 22.8 кэш поддерживается для любого типа диска: S3, Azure, Local, Encrypted и т.д.
Для версий >= 23.5 кэш поддерживается только для удаленных типов дисков: S3, Azure, HDFS (не поддерживается).
Кэш использует политику кэширования LRU
.
Пример конфигурации для версий, не ниже 22.8:
Пример конфигурации для версий, ниже 22.8:
Настройки конфигурации диска кэша:
Эти настройки должны быть определены в разделе конфигурации диска.
Параметр | Тип | По умолчанию | Описание |
---|---|---|---|
path | String | - | Обязательный. Путь к каталогу, где будет храниться кэш. |
max_size | Size | - | Обязательный. Максимальный размер кэша в байтах или удобочитаемом формате (например, 10Gi ). Файлы удаляются по политике LRU, когда достигается лимит. Поддерживаются форматы ki , Mi , Gi (с версии 22.10). |
cache_on_write_operations | Boolean | false | Включает кэш на запись для запросов INSERT и фоновых слияний. Может быть переопределен для конкретного запроса с помощью enable_filesystem_cache_on_write_operations . |
enable_filesystem_query_cache_limit | Boolean | false | Включает лимиты размера кэша на запрос для каждого запроса, основанные на max_query_cache_size . |
enable_cache_hits_threshold | Boolean | false | При включении данные кэшируются только после многократного чтения. |
cache_hits_threshold | Integer | 0 | Количество чтений, необходимое для кэширования данных (требует enable_cache_hits_threshold ). |
enable_bypass_cache_with_threshold | Boolean | false | Пропускает кэш для больших диапазонов чтения. |
bypass_cache_threshold | Size | 256Mi | Размер диапазона чтения, который вызывает пропуск кэша (требует enable_bypass_cache_with_threshold ). |
max_file_segment_size | Size | 8Mi | Максимальный размер одного файла кэша в байтах или удобочитаемом формате. |
max_elements | Integer | 10000000 | Максимальное количество файлов кэша. |
load_metadata_threads | Integer | 16 | Количество потоков для загрузки метаданных кэша при старте. |
Примечание: Значения размера поддерживают единицы такие как
ki
,Mi
,Gi
и т.д. (например,10Gi
).
Настройки запросов/профиля для файлового кэша
Настройка | Тип | По умолчанию | Описание |
---|---|---|---|
enable_filesystem_cache | Boolean | true | Включает/выключает использование кэша для каждого запроса, даже при использовании типа диска cache . |
read_from_filesystem_cache_if_exists_otherwise_bypass_cache | Boolean | false | При включении кэш используется только если данные существуют; новые данные не будут кэшироваться. |
enable_filesystem_cache_on_write_operations | Boolean | false (Cloud: true ) | Включает кэш на запись. Требует cache_on_write_operations в конфигурации кэша. |
enable_filesystem_cache_log | Boolean | false | Включает детальную запись использования кэша в system.filesystem_cache_log . |
max_query_cache_size | Size | false | Максимальный размер кэша для каждого запроса. Требует enable_filesystem_query_cache_limit в конфигурации кэша. |
skip_download_if_exceeds_query_cache | Boolean | true | Управляет поведением, когда достигается max_query_cache_size : - true : Останавливает загрузку новых данных - false : Удаляет старые данные, чтобы освободить место для новых данных |
Настройки конфигурации кэша и настройки запросов кэша соответствуют последней версии ClickHouse, для более ранних версий некоторые вещи могут не поддерживаться.
Системные таблицы кэша
Имя Таблицы | Описание | Требования |
---|---|---|
system.filesystem_cache | Отображает текущее состояние файлового кэша. | Нет |
system.filesystem_cache_log | Предоставляет подробную статистику использования кэша для каждого запроса. | Требует enable_filesystem_cache_log = true |
Команды кэша
SYSTEM DROP FILESYSTEM CACHE (<cache_name>) (ON CLUSTER)
-- ON CLUSTER
Эта команда поддерживается только в том случае, если не указан <cache_name>
SHOW FILESYSTEM CACHES
Показать список файловых кэшей, которые были сконфигурированы на сервере.
(Для версий до или равных 22.8
команда называется SHOW CACHES
)
DESCRIBE FILESYSTEM CACHE '<cache_name>'
Показать конфигурацию кэша и некоторые общие статистические данные для конкретного кэша.
Имя кэша можно взять из команды SHOW FILESYSTEM CACHES
. (Для версий до или равных 22.8
команда называется DESCRIBE CACHE
)
Текущие метрики кэша | Асинхронные метрики кэша | События профиля кэша |
---|---|---|
FilesystemCacheSize | FilesystemCacheBytes | CachedReadBufferReadFromSourceBytes , CachedReadBufferReadFromCacheBytes |
FilesystemCacheElements | FilesystemCacheFiles | CachedReadBufferReadFromSourceMicroseconds , CachedReadBufferReadFromCacheMicroseconds |
CachedReadBufferCacheWriteBytes , CachedReadBufferCacheWriteMicroseconds | ||
CachedWriteBufferCacheWriteBytes , CachedWriteBufferCacheWriteMicroseconds |
Использование статического веб-хранилища (только для чтения)
Это диск только для чтения. Его данные только читаются и никогда не изменяются. Новая таблица загружается на этот диск через запрос ATTACH TABLE
(см. пример ниже). Локальный диск фактически не используется, каждый запрос SELECT
будет приводить к http
запросу для получения необходимых данных. Любые изменения в данных таблицы приведут к исключению, т.е. следующие типы запросов не разрешены: CREATE TABLE
,
ALTER TABLE
, RENAME TABLE
,
DETACH TABLE
и TRUNCATE TABLE
.
Веб-хранилище можно использовать только для чтения. Пример использования - размещение
примерных данных или миграция данных. Существует инструмент clickhouse-static-files-uploader
,
который подготавливает каталог данных для данной таблицы (SELECT data_paths FROM system.tables WHERE name = 'table_name'
).
Для каждой необходимой таблицы вы получаете каталог файлов. Эти файлы могут быть загружены
на, например, веб-сервер со статическими файлами. После этой подготовки
вы можете загрузить эту таблицу на любой сервер ClickHouse через DiskWeb
.
В этой примерной конфигурации:
- диск типа
web
- данные размещены по адресу
http://nginx:80/test1/
- используется кэш на локальном носителе
Хранилище также может быть настроено временно в рамках запроса, если набор данных из веба не ожидается для рутинного использования, см. динамическая конфигурация и пропустите редактирование файла конфигурации.
Демо-набор данных размещен на GitHub. Чтобы подготовить свои собственные таблицы для веб хранилища, смотрите инструмент clickhouse-static-files-uploader
В этом запросе ATTACH TABLE
предоставленный UUID
соответствует имени каталога данных, а конечная точка - это URL для сырого контента GitHub.
Готовый тестовый случай. Необходимо добавить эту конфигурацию в config:
А затем выполнить этот запрос:
Обязательные параметры
Параметр | Описание |
---|---|
type | web . В противном случае диск не будет создан. |
endpoint | URL конечной точки в формате path . URL конечной точки должен содержать корневой путь для хранения данных, куда они были загружены. |
Необязательные параметры
Параметр | Описание | Значение по умолчанию |
---|---|---|
min_bytes_for_seek | Минимальное количество байтов для использования операции seek вместо последовательного чтения | 1 MB |
remote_fs_read_backoff_threashold | Максимальное время ожидания при попытке чтения данных для удаленного диска | 10000 секунд |
remote_fs_read_backoff_max_tries | Максимальное количество попыток чтения с использованием backoff | 5 |
Если запрос завершился с исключением DB:Exception Unreachable URL
, вы можете попробовать отрегулировать настройки: http_connection_timeout, http_receive_timeout, keep_alive_timeout.
Чтобы получить файлы для загрузки, выполните:
clickhouse static-files-disk-uploader --metadata-path <path> --output-dir <dir>
(--metadata-path
можно найти в запросе SELECT data_paths FROM system.tables WHERE name = 'table_name'
).
При загрузке файлов через endpoint
их необходимо загружать в путь <endpoint>/store/
, но конфигурация должна содержать только endpoint
.
Если URL недоступен при загрузке диска, когда сервер запускает таблицы, все ошибки будут обработаны. Если в этом случае произошли ошибки, таблицы можно перезагрузить (стать видимыми) с помощью DETACH TABLE table_name
-> ATTACH TABLE table_name
. Если метаданные были успешно загружены при старте сервера, таблицы будут доступны сразу.
Используйте настройку http_max_single_read_retries, чтобы ограничить максимальное количество попыток во время одного HTTP чтения.
Репликация без копирования (не готова к производству)
Репликация без копирования возможна, но не рекомендуется, с дисками S3
и HDFS
(не поддерживается). Репликация без копирования означает, что если данные хранятся удаленно на нескольких машинах и требуют синхронизации, то реплицируется только метаданные (пути к частям данных), но не сами данные.
Репликация без копирования по умолчанию отключена в версии ClickHouse 22.8 и выше. Эта функция не рекомендуется для использования в производственной среде.