Хранение данных на внешних дисках
Данные, которые обрабатываются в ClickHouse, обычно хранятся в файловой системе локально, где развернут сервер ClickHouse. При этом для хранения данных требуются диски большого объема, которые могут быть довольно дорогостоящими. Решением проблемы может стать хранение данных отдельно от сервера — в распределенных файловых системах — Amazon S3 или Hadoop (HDFS).
Для работы с данными, хранящимися в файловой системе Amazon S3
, используйте движок S3, а для работы с данными в файловой системе Hadoop — движок HDFS.
Репликация без копирования данных
Для дисков S3
и HDFS
в ClickHouse поддерживается репликация без копирования данных (zero-copy): если данные хранятся на нескольких репликах, то при синхронизации пересылаются только метаданные (пути к кускам данных), а сами данные не копируются.
Использование сервиса HDFS для хранения данных
Таблицы семейств MergeTree и Log могут хранить данные в сервисе HDFS при использовании диска типа HDFS
.
Пример конфигурации:
Обязательные параметры:
endpoint
— URL точки приема запроса на стороне HDFS в форматеpath
. URL точки должен содержать путь к корневой директории на сервере, где хранятся данные.
Необязательные параметры:
min_bytes_for_seek
— минимальное количество байтов, которые используются для операций поиска вместо последовательного чтения. Значение по умолчанию:1 МБайт
.
Использование виртуальной файловой системы для шифрования данных
Вы можете зашифровать данные, сохраненные на внешних дисках S3 или HDFS или на локальном диске. Чтобы включить режим шифрования, в конфигурационном файле вы должны указать диск с типом encrypted
и тип диска, на котором будут сохранены данные. Диск типа encrypted
шифрует данные "на лету", то есть при чтении файлов с этого диска расшифровка происходит автоматически. Таким образом, вы можете работать с диском типа 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
—encrypted
. Иначе зашифрованный диск создан не будет.disk
— тип диска для хранения данных.key
— ключ для шифрования и расшифровки. Тип: UInt64. Вы можете использовать параметрkey_hex
для шифрования в шестнадцатеричной форме. Вы можете указать несколько ключей, используя атрибутid
(смотрите пример выше).
Необязательные параметры:
path
— путь к месту на диске, где будут сохранены данные. Если не указан, данные будут сохранены в корневом каталоге.current_key_id
— ключ, используемый для шифрования. Все указанные ключи могут быть использованы для расшифровки, и вы всегда можете переключиться на другой ключ, сохраняя доступ к ранее зашифрованным данным.algorithm
— алгоритм шифрования данных. Возможные значения:AES_128_CTR
,AES_192_CTR
илиAES_256_CTR
. Значение по умолчанию:AES_128_CTR
. Длина ключа зависит от алгоритма:AES_128_CTR
— 16 байт,AES_192_CTR
— 24 байта,AES_256_CTR
— 32 байта.
Пример конфигурации:
Хранение данных на веб-сервере
Существует утилита clickhouse-static-files-uploader
, которая готовит каталог данных для данной таблицы (SELECT data_paths FROM system.tables WHERE name = 'table_name'
). Для каждой таблицы, необходимой вам, вы получаете каталог файлов. Эти файлы могут быть загружены, например, на веб-сервер в виде статических файлов. После этой подготовки вы можете загрузить эту таблицу на любой сервер ClickHouse через DiskWeb
.
Этот тип диска используется только для чтения, то есть данные на нем неизменяемы. Новая таблица загружается с помощью запроса ATTACH TABLE
(см. пример ниже) и при каждом чтении данные будут доставаться по заданному url
через http запрос, то есть локально данные не хранятся. Любое изменение данных приведет к исключению, т.е. не допускаются следующие типы запросов: CREATE TABLE, ALTER TABLE, RENAME TABLE, DETACH TABLE и TRUNCATE TABLE.
Хранение данных на веб-сервере поддерживается только для табличных движков семейства MergeTree и Log. Чтобы получить доступ к данным, хранящимся на диске web
, при выполнении запроса используйте настройку storage_policy. Например, ATTACH TABLE table_web UUID '{}' (id Int32) ENGINE = MergeTree() ORDER BY id SETTINGS storage_policy = 'web'
.
Готовый тестовый пример. Добавьте эту конфигурацию в config:
А затем выполните этот запрос:
Обязательные параметры:
type
—web
. Иначе диск создан не будет.endpoint
— URL точки приема запроса в форматеpath
. URL точки должен содержать путь к корневой директории на сервере для хранения данных, куда эти данные были загружены.
Необязательные параметры:
min_bytes_for_seek
— минимальное количество байтов, которое используются для операций поиска вместо последовательного чтения. Значение по умолчанию:1
Mb.remote_fs_read_backoff_threashold
— максимальное время ожидания при попытке чтения данных с удаленного диска. Значение по умолчанию:10000
секунд.remote_fs_read_backoff_max_tries
— максимальное количество попыток чтения данных с задержкой. Значение по умолчанию: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>/store/
, но конфигурация должна содержать только endpoint
.
Если URL-адрес недоступен при загрузке на диск, когда сервер запускает таблицы, то все ошибки будут пойманы. Если в этом случае были ошибки, то таблицы можно перезагрузить (сделать видимыми) с помощью DETACH TABLE table_name
-> ATTACH TABLE table_name
. Если метаданные были успешно загружены при запуске сервера, то таблицы будут доступны сразу.
Чтобы ограничить количество попыток чтения данных во время одного HTTP-запроса, используйте настройку http_max_single_read_retries.