Skip to main content
Skip to main content
Edit this page

Хранение данных на внешних дисках

Данные, которые обрабатываются в 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.

Обязательные параметры:

  • typeencrypted. Иначе зашифрованный диск создан не будет.
  • 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:

А затем выполните этот запрос:

Обязательные параметры:

  • typeweb. Иначе диск создан не будет.
  • 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.