По мере экспоненциального роста данных традиционные монолитные архитектуры хранилища сталкиваются с проблемой балансировки производительности и экономичности. Для поддержки высокоскоростных запросов в реальном времени при одновременном снижении стоимости хранения огромных объёмов данных CSS предлагает функцию разделения хранилища и вычислений для кластеров OpenSearch.
При раздельном хранилище и вычислениях горячие данные, к которым часто обращаются, сохраняются на высокопроизводительных носителях, тогда как холодные данные, к которым обращаются реже, перемещаются на низкозатратные носители — Object Storage Service (OBS). Это обеспечивает производительность запросов в реальном времени для горячих данных при снижении долгосрочных расходов на хранение.
Рисунок 1 Архитектура раздельного хранилища и вычислений

Вот как работает разделение хранилища и вычислений:
Горячие данные записываются на высокопроизводительные локальные диски (SSD), чтобы обеспечить производительность запросов в реальном времени.
Редко используемые данные мигрируют с SSDs на экономичный OBS (OBS Бакет невидим для пользователей), превращая их из горячих данных в холодные данные. Вы можете вызвать API заморозки индекса, чтобы вручную перевести горячие данные в холодные, либо определить политику жизненного цикла (например, 90‑дневный период хранения данных), чтобы она срабатывала автоматически. Холодные данные сохраняются в OBS для экономии, но их метаданные и поля даты хранятся на локальных дисках для обеспечения быстрого поиска.
В CSS индексы могут проходить следующие стадии на протяжении всего их жизненного цикла.
Разделённые хранилище и вычисления могут быть автоматизированы с помощью политик управления жизненным циклом индекса. Для получения подробной информации смотрите Разделение хранилища индекса и вычислений в OpenSearch Кластере через управление жизненным циклом индекса.
Войдите в OpenSearch Dashboards и перейдите на страницу выполнения команд. Кластеры OpenSearch поддерживают несколько методов доступа. В этой теме OpenSearch Dashboards используется в качестве примера для описания процедур выполнения.
Левая часть консоли — это поле ввода команды, а треугольный значок в правом верхнем углу является кнопкой выполнения. Правая часть показывает результат выполнения.
Заморозка индекса означает перемещение холодных данных с твердотельных накопителей (SSD) в OBS, освобождая SSD‑хранилище для горячих, часто запрашиваемых данных. Замороженный индекс становится только для чтения.
Выполните следующую команду, чтобы дампировать данные указанного индекса в OBS и установить его класс хранения как Standard:
POST {index_name}/_freeze_low_cost
где, index_name указывает имя индекса, который будет заморожен.
Пример ответа:
{"freeze_uuid": "pdsRgUtSTymVDWR_HoTGFw"}
где, freeze_uuid указывает ID задачи заморозки индекса, который можно использовать для запроса прогресса задачи.
Выполните следующую команду, чтобы проверить прогресс заморозки индекса, указав ID задачи:
GET _freeze_low_cost_progress/{freeze_uuid}
Пример ответа:
{"stage" : "STARTED","shards_stats" : {"INIT" : 0,"FAILURE" : 0,"DONE" : 0,"STARTED" : 1,"ABORTED" : 0},"indices" : {"data1" : [{"uuid" : "7OS-G1-tRke2jHZPlckexg","index" : {"name" : "data1","index_id" : "4b5PHXJITLaS6AurImfQ9A","shard" : 2},"start_ms" : 1611972010852,"end_ms" : -1,"total_time" : "10.5s","total_time_in_millis" : 10505,"stage" : "STARTED","failure" : null,"size" : {"total_bytes" : 3211446689,"finished_bytes" : 222491269,"percent" : "6.0%"},"file" : {"total_files" : 271,"finished_files" : 12,"percent" : "4.0%"},"rate_limit" : {"paused_times" : 1,"paused_nanos" : 946460970}}]}}
Параметр | Описание |
|---|---|
Этап | Статус задачи заморозки индекса. Диапазон значений:
|
shards_stats | Количество шардов в каждом состоянии. |
индексы | Подробности статуса каждого индекса, как описано в Table 2. |
Параметр | Описание |
|---|---|
uuid | ID задачи заморозки индекса. |
индекс | Информация об индексе и шарде. |
start_ms | Время начала задачи. |
end_ms | Время завершения задачи. Если задача все еще выполняется, -1 отображается. |
total_time | Как долго задача выполняется. |
total_time_in_millis | Как долго задача выполняется, в миллисекундах. |
stage | Состояние шарда. |
ошибка | Причина ошибки задачи. Если ошибка не произошла, null возвращается. |
size.total_bytes | Общее количество байт для заморозки. |
size.finished_bytes | Количество байт, которые были заморожены. |
size.percent | Прогресс заморозки в терминах замороженных байт относительно общего количества байт для заморозки. |
file.total_bytes | Общее количество документов, которые будут заморожены. |
file.finished_bytes | Количество документов, которые были заморожены. |
file.percent | Прогресс заморозки в отношении количества замороженных документов по сравнению с общим количеством документов для заморозки. |
rate_limit.paused_times | Количество случаев, когда заморозка была приостановлена из‑за ограничения скорости. |
rate_limit.paused_nanos | Продолжительность приостановки задачи заморозки из‑за ограничения скорости, в наносекундах. |
Когда заморозка индекса завершится, параметры настроек будут возвращены, как описано в Таблица 3.
Параметр | Описание |
|---|---|
index.frozen_low_cost | Замороженный индекс. Значение фиксировано true. |
index.blocks.write | Запись в замороженный индекс запрещена. Значение фиксировано true. |
index.store.type | Тип хранилища индекса. Значение фиксировано obs. |
Здесь описаны только некоторые ключевые параметры для запроса списка замороженных индексов. Для получения дополнительной информации об API см. CAT индексы.
Выполните следующую команду, чтобы запросить список замороженных индексов на основе статуса заморозки индекса:
GET _cat/freeze_indices?stage={STAGE}
STAGE указывает статус заморозки индекса. Значение может быть:
Пример ответа:
green open data2 0bNtxWDtRbOSkS4JYaUgMQ 3 0 5 0 7.9kb 7.9kbgreen open data3 oYMLvw31QnyasqUNuyP6RA 3 0 51 0 23.5kb 23.5kb
После того как индекс заморожен, его данные выгружаются в OBS. Чтобы уменьшить прямое получение данных из OBS и тем самым улучшить производительность запросов, некоторые данные кэшируются в кластере. Данные, запрошенные в первый раз, извлекаются непосредственно из OBS. Полученные данные затем кэшируются в памяти кластера. При последующих запросах система сначала ищет кэш. CSS позволяет выполнять запрос статистики кеша для замороженных индексов, хранящихся в OBS‑бакетах. Вы также можете сбросить статус кэша и изменить конфигурацию кэша.
GET _frozen_stats
GET _frozen_stats/{node_id}
where, node_id указывает ID узла кластера.
Ниже приведён пример возвращаемой информации при запросе статистики кэша замороженных индексов на всех узлах:
{"_nodes" : {"total" : 1, // Total number of nodes"successful" : 1, // Successful nodes"failed" : 0 // Failed nodes},"cluster_name" : "css-zzz1", //Cluster name"nodes" : {"7uwKO38RRoaON37YsXhCYw" : {"name" : "css-zzz1-ess-esn-2-1", //Node name"transport_address" : "10.0.0.247:9300", //Node transport address"host" : "10.0.0.247", //Node host"ip" : "10.0.0.247", //Node IP address"block_cache" : {"default" : {"type" : "memory", //Cache type. memory indicates in-memory cache."block_cache_capacity" : 8192, //Cache capacity"block_cache_blocksize" : 8192, //Single block size in the cache, in bytes. In the example, the block size is 8 KB."block_cache_size" : 12, //Cache capacity used"block_cache_hit" : 14, //Number of cache hits"block_cache_miss" : 0, //Number of cache misses"block_cache_eviction" : 0, //Number of cache evictions"block_cache_store_fail" : 0 //Number of cache storage failures, which occur when the cache is full.}},"obs_stats" : {"list" : {"obs_list_count" : 17, //Number of times the OBS list API was called."obs_list_ms" : 265, //Total length of time spent calling the OBS list API."obs_list_avg_ms" : 15 //Average time spent calling the OBS list API.},"get_meta" : {"obs_get_meta_count" : 79, //Number of times the OBS get metadata API was called."obs_get_meta_ms" : 183, //Total length of time spent calling the OBS get metadata API."obs_get_meta_avg_ms" : 2 //Average time spent calling the OBS get metadata API.},"get_obj" : {"obs_get_obj_count" : 12, //Number of times the OBS get object API was called."obs_get_obj_ms" : 123, //Total length of time spent calling the OBS get object API."obs_get_obj_avg_ms" : 10 //Average time spent calling the OBS get object API.},"put_obj" : {"obs_put_obj_count" : 12, //Number of times the OBS put object API was called."obs_put_obj_ms" : 2451, //Total length of time spent calling the OBS put object API."obs_put_obj_avg_ms" : 204 //Average time spent calling the OBS put object API.},"obs_op_total" : {"obs_op_total_ms" : 3022, //Total length of time spent calling OBS APIs."obs_op_total_count" : 120, //Total number of times calling OBS APIs."obs_op_avg_ms" : 25 //Average time spent calling OBS APIs.}},"reader_cache" : {"hit_count" : 0,"miss_count" : 1,"load_success_count" : 1,"load_exception_count" : 0,"total_load_time" : 291194714,"eviction_count" : 0}}}}
Выполните следующую команду, чтобы сбросить статус кэша для замороженных индексов:
POST _frozen_stats/reset
Эта команда используется для отладки проблем с производительностью. Если вы сбросите статус кэша и затем выполните команду запроса кэша, вы сможете проверить точный статус команды кэша. Не рекомендуется использовать эту команду во время выполнения.
Пример ответа:
{"_nodes" : {"total" : 1,"successful" : 1,"failed" : 0},"cluster_name" : "Es-0325-007_01","nodes" : {"mqTdk2YRSPyOSXfesREFSg" : {"result" : "ok"}}}
Elasticsearch получает доступ к разным типам файлов с помощью различных методов. Система кэша поддерживает многоуровневые кэши и использует блоки разных размеров для кэширования различных типов файлов. Например, обычно большое количество небольших блоков используется для кэширования файлов .fdx и .tip, тогда как небольшое количество больших блоков используется для кэширования файлов .fdt. Вы можете изменить конфигурацию кэша в соответствии с потребностями сервиса. Таблица 4 описывает параметры, которые можно настроить.
Параметр | Тип | Описание |
|---|---|---|
low_cost.obs.blockcache.names | Массив | Список имен многоуровневых кэшей. Система кэша поддерживает многоуровневые кэши для данных с разной гранулярностью доступа. Существует кэш по умолчанию с именем default. Если вы настраиваете этот параметр, значение должно включать как минимум the по умолчанию кеш в дополнение к другим пользовательским именам кеша. Значение по умолчанию: по умолчанию |
low_cost.obs.blockcache.<NAME>.type | ENUM | Тип хранилища кеша с именем <NAME>. Диапазон значений:
Значение по умолчанию: memory |
low_cost.obs.blockcache.<NAME>.blockshift | Integer | Размер блока в кеше с именем <NAME> (в байтах). Формула: 2сдвиг блока. Например, если значение равно 16, размер блока составляет 216 байт, то есть 65536 байт или 64 KB. Значение: количество сдвигов влево Значение по умолчанию: 13 (эквивалентно 8 KB) |
low_cost.obs.blockcache.<NAME>.bank.count | Целое | Количество разделов в кэше с именем <NAME>. Каждый раздел является независимой единицей в кэше. Значение по умолчанию: 1 |
low_cost.obs.blockcache.<NAME>.number.blocks.perbank | Целое | Количество блоков в каждом разделе кэша с именем <NAME>. Значение по умолчанию: 8192 |
low_cost.obs.blockcache. <NAME>.exclude.file.types | Массив | Список расширений имён файлов для файлов, которые не могут быть кешированы в кеше с именем <NAME>. Если расширение файла не находится в exclude.file.types or <NAME>.file.types (if configured), политика кеша по умолчанию применяется. |
low_cost.obs.blockcache. <NAME>.file.types | Массив | Список расширений имён файлов для файлов, которые могут быть кешированы в кеше с именем <NAME>. Если расширение файла не находится в exclude.file.types or <NAME>.file.types (if configured), политика кеша по умолчанию применяется. |
index.frozen.obs.max_bytes_per_sec | Строка | Максимальная скорость, с которой документы замороженных индексов загружаются в OBS. Формат: <value><unit>. Единица может быть B (байт), KB, MB или GB. Изменение вступает в силу немедленно. Значение по умолчанию: 150 MB |
low_cost.obs.index.upload.threshold.use.multipart | Строка | Порог многокомпонентной загрузки. При выгрузке замороженных индексов в OBS, если размер отдельного документа превышает этот порог, выполняется многокомпонентная загрузка. Формат: <value><unit>. Единица может быть B (байт), KB, MB и GB. Многокомпонентная загрузка поддерживается OBS. 0 или не настроено: многокомпонентная загрузка может быть отключена. Значение по умолчанию: 1 GB |
Ниже приведён типичный пример конфигурации кэша. Используется двухуровневая система кэша: по умолчанию и большой. Это по умолчанию кеш has a total of 30 x 4096 64-KB blocks. It is used to cache non-.fdt files. The большой кеш has 5 x 1000 2-MB blocks. It is used to cache .fdx, .dvd, and .tip files.
low_cost.obs.blockcache.names: ["default", "large"]low_cost.obs.blockcache.default.type: filelow_cost.obs.blockcache.default.blockshift: 16low_cost.obs.blockcache.default.number.blocks.perbank: 4096low_cost.obs.blockcache.default.bank.count: 30low_cost.obs.blockcache.default.exclude.file.types: ["fdt"]low_cost.obs.blockcache.large.type: filelow_cost.obs.blockcache.large.blockshift: 21low_cost.obs.blockcache.large.number.blocks.perbank: 1000low_cost.obs.blockcache.large.bank.count: 5low_cost.obs.blockcache.large.file.types: ["fdx", "dvd", "tip"]
Только OpenSearch 1.3.6 и 2.19.0 clusters support query performance enhancement for frozen indexes.
When frozen indexes are queried on the Обзор page of OpenSearch Dashboards for the first time, all data needs to be retrieved from OBS because there is no data in the cache. If a large number of documents need to be returned, it takes a long time to retrieve the corresponding time fields and document metadata from OBS. By caching this part of data in the cluster, query performance can be improved significantly. This is how CSS improves query performance for frozen indexes. Local cache settings are preset. You can review them and modify them as needed.
Элемент конфигурации | Тип | область | Можно изменить динамически | Описание |
|---|---|---|---|---|
low_cost.local_cache.max.capacity | Целое | узел | Да | Максимальное количество холодных кэшей данных, которые могут быть доступны на каждом узле. (Каждый shard соответствует кэшу.) Диапазон значений: 10–5000 Значение по умолчанию: 500
|
index.low_cost.local_cache.threshold | Целое | индекс | Да | Порог включения локального кэширования холодных данных.
Диапазон значений: 0–100 Значение по умолчанию: 50 Единица измерения: % |
index.low_cost.local_cache.evict_time | String | index | Да | Продолжительность хранения холодных данных в локальном кэше. Значение определяется index.frozen_date (время заморозки индекса). Если index.frozen_date не доступен, значение определяется временем создания индекса. Рекомендуется скорректировать длительность удержания в зависимости от использования диска. Диапазон значений: от 1 до 365 дней Значение по умолчанию: 30d Единица: дни |
Ниже приведены некоторые примеры, где index_name указывает изменённый индекс.
PUT _cluster/settings{"persistent": {"low_cost.local_cache.max.capacity":1000}}
PUT {index_name}/_settings{"index.low_cost.local_cache.threshold":20}
PUT {index_name}/_settings{"index.low_cost.local_cache.evict_time":"7d"}
GET /_frozen_stats/local_cache
GET /_frozen_stats/local_cache/{node_id}
где, node_id указывает ID узла кластера.
Пример ответа:
{"_nodes" : {"total" : 1,"successful" : 1,"failed" : 0},"cluster_name" : "test","nodes" : {"6by3lPy1R3m55Dcq3liK8Q" : {"name" : "node-1","transport_address" : "127.0.0.1:9300","host" : "127.0.0.1","ip" : "127.0.0.1","local_cache" : {"get_stats" : {"get_total_count" : 562, //Total number of times data was retrieved from the local cold data cache."get_hit_count" : 562, //Total number of hits in the local cold data cache."get_miss_count" : 0, //Total number of local cold data cache misses."get_total_ns" : 43849200, //Total duration for retrieving data from the local cold data cache."get_avg_ns" : 78023 //Average duration for retrieving data from the local cold data cache.},"load_stats" : {"load_count" : 2, //Number of times cold data was loaded from the local cache"load_total_ms" : 29, //Total duration for loading cold data from the local cache"load_avg_ms" : 14, //Average duration for loading cold data from the local cache"load_fail_count" : 0, //Number of failures for loading cold data from the local cache"load_overflow_count" : 0 //Number of times the local cold data cache exceeds the cache pool size.},"reload_stats" : {"reload_count" : 0, //Number of times the local cold data cache was regenerated."reload_total_ms" : 0, //Total duration for regenerating the local cold data cache."reload_avg_ms" : 0, //Average duration for regenerating the local cold data cache."reload_fail_count" : 0 //Number of failures in regenerating the local cold data cache.},"init_stats" : {"init_count" : 0, //Number of times the local cold data cache was initialized."init_total_ms" : 0, //Total duration for initializing the local cold data cache."init_avg_ms" : 0, //Average duration for initializing the local cold data cache."init_fail_count" : 0 //Number of failures in initializing the local cold data cache.}}}}}
Только кластеры OpenSearch 1.3.6 и 2.19.0 поддерживают эту функцию.
Чтобы помочь вам понять, как плагин разделения хранения и вычислений работает с OBS, был добавлен API для сбора статистики реального времени скоростей OBS, и реальные‑временные скорости записываются в индекс .freeze_obs_rate-YYYY.mm.dd.
Метод расчёта: Средние скорости операций OBS за последние 5 секунд рассчитываются каждые 5 секунд.
Системный индекс .freeze_obs_rate-YYYY.mm.dd записывает статистику по скоростям операций OBS в реальном времени, помогая понять соответствующие тенденции ресурсов OBS, хранящих холодные данные. Период хранения индекса по умолчанию — 30 дней.
GET _frozen_stats/obs_rate
GET _frozen_stats/obs_rate/{node_id}
где, node_id указывает ID узла кластера.
Пример ответа:
{"_nodes" : {"total" : 1,"successful" : 1,"failed" : 0},"cluster_name" : "test","nodes" : {"dflDvcSwTJ-fkiIlT2zE3A" : {"name" : "node-1","transport_address" : "127.0.0.1:9300","host" : "127.0.0.1","ip" : "127.0.0.1","update_time" : 1671777600482, // Time when the current statistics were updated."obs_rate" : {"list_op_rate" : 0.0, // Rate of OBS list operations. Unit: times/s."get_meta_op_rate" : 0.0, // Rate of OBS get meta operations. Unit: times/s."get_obj_op_rate" : 0.0, // Rate of OBS get operations. Unit: times/s."put_op_rate" : 0.0, // Rate of OBS put operations. Unit: times/s."obs_total_op_rate" : 0.0, // Rate of all OBS operations. Unit: times/s."obs_upload_rate" : "0.0 MB/s", // OBS data upload rate. Unit: MB/s."obs_download_rate" : "0.0 MB/s" // OBS data download rate. Unit: MB/s.}}}}
Выполните следующую команду, чтобы изменить период хранения индекса на семь дней:
PUT _cluster/settings{"persistent": {"low_cost.obs_rate_index.evict_time": "7d"}}
Элемент конфигурации | Тип | область | Можно изменить динамически | Описание |
|---|---|---|---|---|
low_cost.obs_rate_index.evict_time | Строка | узел | Да | Период хранения .freeze_obs_rate-YYYY.mm.dd индекс.
|
Чтобы обеспечить приемлемую производительность запросов к холодным данным (например, когда исторические данные запрашиваются периодически), используйте решение с многоуровневым хранением. Для подробностей см Переключение между горячим и холодным хранением для кластера OpenSearch.