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

Многоуровневое хранение на локальных и удалённых носителях

Многоуровневое хранение на локальных и удалённых носителях в Apache Doris позволяет разделять горячие и холодные данные. Холодные данные автоматически переносятся во внешние системы хранения (например, в S3-совместимое объектное хранилище или HDFS), что сокращает использование локальных дисков и общие затраты на хранение.

Сценарии использования:

  • Архивирование исторических данных: перенос редко используемых исторических данных в недорогое объектное хранилище.
  • Разделение горячих и холодных данных: хранение горячих данных на локальных SSD/HDD и перенос холодных данных в удалённое хранилище.
  • Оптимизация затрат на хранение: замена локального высокопроизводительного хранилища объектным хранилищем для снижения TCO.
Примечание

Данные в удалённом хранилище имеют только одну реплику. Надёжность данных зависит от гарантий надёжности самого удалённого хранилища. Убедитесь, что в удалённом хранилище включены EC (кодирование со стираниями) или механизмы хранения нескольких реплик.

Быстрая навигация​

РазделСодержание
Хранение холодных данных в S3-совместимом хранилищеПеренос холодных данных в S3-совместимое объектное хранилище
Хранение холодных данных в HDFSПеренос холодных данных в HDFS
Перенос холодных данных существующих таблиц в удалённое хранилищеНастройка удалённого хранилища для существующих таблиц или разделов
Настройка CompactionНастройка поведения Compaction для удалённого хранилища
ОграниченияФункциональные ограничения удалённого хранилища
Управление пространством для холодных данныхПросмотр и освобождение пространства, занятого холодными данными
Оптимизация запросов и производительностиМеханизм локального Cache
Часто задаваемые вопросыУстранение ошибок и замечания по настройке

Использование​

Настройка удалённого хранилища состоит из трёх шагов: создать Resource, создать Storage Policy и привязать политику при создании или изменении таблицы.

Хранение холодных данных в S3-совместимом хранилище​

Шаг 1: Создайте S3 Resource​

CREATE RESOURCE "remote_s3"
PROPERTIES
(
"type" = "s3",
"s3.endpoint" = "bj.s3.com",
"s3.region" = "bj",
"s3.bucket" = "test-bucket",
"s3.root.path" = "path/to/root",
"s3.access_key" = "bbb",
"s3.secret_key" = "aaaa",
"s3.connection.maximum" = "50",
"s3.connection.request.timeout" = "3000",
"s3.connection.timeout" = "1000"
);
подсказка

При создании S3 Resource проверяется подключение к удалённому хранилищу, чтобы убедиться в правильности конфигурации Resource.

Шаг 2: Создайте Storage Policy​

Привяжите Resource, созданный на предыдущем шаге:

CREATE STORAGE POLICY test_policy
PROPERTIES(
"storage_resource" = "remote_s3",
"cooldown_ttl" = "1d"
);

Шаг 3: Используйте Storage Policy при создании таблицы​

CREATE TABLE IF NOT EXISTS create_table_use_created_policy
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048)
)
UNIQUE KEY(k1)
DISTRIBUTED BY HASH (k1) BUCKETS 3
PROPERTIES(
"enable_unique_key_merge_on_write" = "false",
"storage_policy" = "test_policy"
);
Примечание

Таблица Unique с "enable_unique_key_merge_on_write" = "true" не может использовать удалённое хранилище.

Хранение холодных данных в HDFS​

Шаг 1: Создайте HDFS Resource​

CREATE RESOURCE "remote_hdfs" PROPERTIES (
"type" = "hdfs",
"fs.defaultFS" = "fs_host:default_fs_port",
"hadoop.username" = "hive",
"hadoop.password" = "hive",
"root_path" = "/my/root/path",
"dfs.nameservices" = "my_ha",
"dfs.ha.namenodes.my_ha" = "my_namenode1, my_namenode2",
"dfs.namenode.rpc-address.my_ha.my_namenode1" = "nn1_host:rpc_port",
"dfs.namenode.rpc-address.my_ha.my_namenode2" = "nn2_host:rpc_port",
"dfs.client.failover.proxy.provider.my_ha" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
);

Шаг 2: Создайте Storage Policy​

CREATE STORAGE POLICY test_policy PROPERTIES (
"storage_resource" = "remote_hdfs",
"cooldown_ttl" = "300"
);

Шаг 3: Создайте таблицу, использующую Storage Policy​

CREATE TABLE IF NOT EXISTS create_table_use_created_policy (
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048)
)
UNIQUE KEY(k1)
DISTRIBUTED BY HASH (k1) BUCKETS 3
PROPERTIES(
"enable_unique_key_merge_on_write" = "false",
"storage_policy" = "test_policy"
);
Примечание

Таблица Unique с "enable_unique_key_merge_on_write" = "true" не может использовать удалённое хранилище.

Перенос холодных данных существующих таблиц в удалённое хранилище​

Помимо создания новых таблиц, Doris также поддерживает настройку удалённого хранилища для существующих таблиц или разделов (PARTITION).

Настройка удалённого хранилища для всей таблицы:

ALTER TABLE create_table_not_have_policy SET ("storage_policy" = "test_policy");

Настройка удалённого хранилища для определённого раздела:

ALTER TABLE create_table_partition MODIFY PARTITION (*) SET("storage_policy" = "test_policy");
Приоритет политик на уровне таблицы и разделов

Если при создании таблицы всей таблице и отдельным разделам назначены разные Storage Policy, политики на уровне разделов игнорируются, и все разделы таблицы используют политику на уровне таблицы.

Чтобы назначить определённому разделу другую политику, используйте показанный выше оператор ALTER TABLE ... MODIFY PARTITION.

Подробные сведения о синтаксисе см. в следующих разделах:

Настройка Compaction​

Поведение Compaction для удалённого хранилища управляется параметрами BE:

ПараметрПо умолчаниюЕдиница измеренияОписание
cold_data_compaction_thread_num2количествоЧисло параллельных потоков Compaction для удалённого хранилища
cold_data_compaction_interval_sec1800секундыИнтервал выполнения Compaction для удалённого хранилища (по умолчанию 30 минут)

Ограничения​

Удалённое хранилище имеет следующие ограничения:

  • Таблицы, использующие удалённое хранилище, не поддерживают резервное копирование.
  • Сведения о расположении удалённого хранилища (например, endpoint, bucket и path) нельзя изменить.
  • Таблица модели Unique с включённым Merge-on-Write не поддерживает удалённое хранилище.
  • Storage Policy можно создавать, изменять и удалять. Перед удалением убедитесь, что ни одна таблица не ссылается на эту Storage Policy.
  • После назначения Storage Policy таблице отменить её назначение нельзя.

Управление пространством для холодных данных​

Просмотр объёма холодных данных​

Просмотреть объём пространства, занятого холодными данными, можно двумя способами:

СпособКомандаПолеПримечания
Способ 1SHOW PROC '/backends'RemoteUsedCapacityПросмотр общего размера объектов, загруженных каждым BE. С небольшой задержкой
Способ 2SHOW TABLETS FROM tableNameRemoteDataSizeПросмотр размера объектов, занимаемых каждым Tablet

Сборка мусора​

Сценарии, в которых в удалённом хранилище могут появиться ненужные данные:

  1. Загрузка Rowset завершается ошибкой, но некоторые Segment уже успешно загружены.
  2. Загруженные Rowset не согласованы между несколькими репликами.
  3. После завершения Compaction остаются старые Rowset, участвовавшие в Compaction.

Политика освобождения пространства: ненужные данные удаляются не сразу. Интервал очистки задаётся параметром BE remove_unused_remote_files_interval_sec, значение которого по умолчанию составляет 21600 секунд (6 часов).

Оптимизация запросов и производительности​

Для повышения производительности запросов и снижения затрат на вызовы API объектного хранилища Doris использует механизм локального Cache. При первом запросе к данным в удалённом хранилище Doris загружает их на локальный диск BE в качестве кэша.

Характеристики Cache:

  • Кэш хранится на локальном диске BE и не занимает оперативную память.
  • Кэш управляется по политике LRU (вытеснение данных, к которым дольше всего не обращались) и не поддерживает TTL.

Подробные сведения о настройке см. в документации Data Cache.

Часто задаваемые вопросы​

Вопрос 1: Что делать, если при создании S3 Resource возникает ошибка host must not be null?​

Сообщение об ошибке:

ERROR 1105 (HY000): errCode = 2, detailMessage = Failed to create repository:
connect to s3 failed: Unable to marshall request to JSON: host must not be null.

Причина: по умолчанию S3 SDK использует доступ в стиле virtual-hosted, но в некоторых сервисах объектного хранения (например, MinIO) этот стиль не включён или не поддерживается.

Решение: добавьте "use_path_style" = "true" в конфигурацию Resource, чтобы принудительно использовать доступ в стиле path-style:

CREATE RESOURCE "remote_s3"
PROPERTIES
(
"type" = "s3",
"s3.endpoint" = "bj.s3.com",
"s3.region" = "bj",
"s3.bucket" = "test-bucket",
"s3.root.path" = "path/to/root",
"s3.access_key" = "bbb",
"s3.secret_key" = "aaaa",
"s3.connection.maximum" = "50",
"s3.connection.request.timeout" = "3000",
"s3.connection.timeout" = "1000",
"use_path_style" = "true"
);

Вопрос 2: Как влияет изменение параметров переноса холодных данных, таких как cooldown_ttl?​

После изменения параметров переноса холодных данных изменения применяются только к данным, которые ещё не перенесены в удалённое хранилище. На данные, уже находящиеся в удалённом хранилище, они не влияют.

Пример: если изменить cooldown_ttl с 21 дня на 7 дней, данные, уже находящиеся в удалённом хранилище, не будут перенесены обратно в локальное хранилище.

Вопрос 3: Какие модели таблиц не поддерживают удалённое хранилище?​

Таблица модели Unique не поддерживает удалённое хранилище при включённом Merge-on-Write (то есть при "enable_unique_key_merge_on_write" = "true"). Все остальные модели (Duplicate, Aggregate и Unique с отключённым MoW) его поддерживают.

Вопрос 4: Как обеспечивается надёжность данных в удалённом хранилище?​

Doris хранит только одну реплику в удалённом хранилище, поэтому надёжность данных полностью зависит от самого удалённого хранилища. Для защиты данных рекомендуется включить в удалённом хранилище такие механизмы, как EC (кодирование со стираниями) или хранение нескольких реплик.