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

Так работает разделение хранения и вычислений:
Горячие данные записываются на высокопроизводительные локальные диски (SSD) для обеспечения производительности запросов в реальном времени.
Реже используемые данные мигрируют с SSD в экономичный OBS (OBS buckets невидимы пользователям), превращаясь из горячих данных в холодные. Вы можете вызвать index freezing API, чтобы вручную перевести горячие данные в холодные, или определить политику жизненного цикла (например, период хранения данных 90 дней), чтобы она срабатывала автоматически. Холодные данные хранятся в OBS для экономии, но их метаданные и поля даты сохраняются на локальных дисках для быстрого поиска.
В CSS индексы могут проходить следующие стадии в течение всего их жизненного цикла.
Разделённое хранение и вычисления могут быть автоматизированы с помощью политик управления жизненным циклом индекса. Подробнее см. Decoupling Storage and Compute Using ISM.
Войдите в OpenSearch Dashboards и перейдите на страницу выполнения команд. Кластеры OpenSearch поддерживают несколько методов доступа. В этом разделе в качестве примера используется OpenSearch Dashboards для описания процедур операций.
Левая часть консоли — это поле ввода команды, а треугольный значок в её правом верхнем углу является кнопкой выполнения. Правая часть отображает результат выполнения.
Заморозка индекса означает перемещение холодных данных с твердотельных накопителей (SSDs) в OBS, освобождая SSD‑хранилище для горячих, часто запрашиваемых данных. Замороженный индекс становится только для чтения.
Выполните следующую команду, чтобы выгрузить данные указанного индекса в OBS и установить для него класс хранения Standard:
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
index_name | String | N/A | Указывает один или несколько индексов.
|
Пример ответа:
{"freeze_uuid": "pdsRgUtSTymVDWR_HoTGFw" // ID of the index freezing task, which you can use to query the task progress.}
Если версия кластера OpenSearch 2.19.0 или 3.4.0, а версия образа не ранее x.x.x_25.9.0_xxx, задачи заморозки индексов не выполняются немедленно после отправки. Вместо этого они временно кэшируются на настраиваемый период (по умолчанию: одна минута) и затем обрабатываются пакетно. Правила кэширования для асинхронных задач заморозки индексов можно настроить. Подробнее см. Modify batch index freezing settings.
Выполните следующую команду, чтобы проверить прогресс заморозки индекса, указав идентификатор задачи:
Если версия кластера OpenSearch 2.19.0 или 3.4.0, а версия образа не ранее x.x.x_25.9.0_xxx, возвращаются прогрессы нескольких задач заморозки индексов одной и той же партии.
Пример ответа:
{"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}}]}}
Параметр | Описание |
|---|---|
stage | Состояние задачи заморозки индекса. Диапазон значений: |
shards_stats | Количество шардов в каждом состоянии. |
indices | Подробные сведения о состоянии каждого индекса, как описано в Table 3. |
Параметр | Описание |
|---|---|
uuid | ID задачи заморозки индекса. |
index | Информация об Index и shard. |
start_ms | Время начала задачи. |
end_ms | Время завершения задачи. Если задача всё ещё выполняется, отображается -1. |
total_time | Продолжительность выполнения задачи. |
total_time_in_millis | Продолжительность выполнения задачи в миллисекундах. |
stage | Состояние shard. |
failure | Причина сбоя задачи. Если сбой не произошёл, возвращается 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 | Продолжительность приостановки задачи заморозки из‑за ограничения скорости, в наносекундах. |
После завершения заморозки индекса параметры настроек будут возвращены, как описано в Table 4.
Параметр | Описание |
|---|---|
index.frozen_low_cost | Замороженный индекс. Значение фиксировано на true. |
index.blocks.write | Запись в замороженный индекс запрещена. Значение фиксировано на true. |
index.store.type | Тип хранилища индекса. Значение фиксировано на obs. |
Здесь описаны только некоторые ключевые параметры для запроса списка замороженных индексов. Для получения дополнительной информации об API см. CAT indices.
Выполните следующую команду, чтобы запросить список замороженных индексов по статусу заморозки индекса:
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
СТЕЙДЖ | String | N/A | Этап заморозки индекса. Диапазон значений: |
Пример ответа:
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}
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
node_id | String | N/A | Указывает один или несколько узлов кластера.
Вы можете выполнить следующую команду, чтобы получить идентификаторы узлов: |
Ниже приведён пример возвращённой информации при запросе статистики кэша замороженных индексов на всех узлах:
{"_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"}}}
OpenSearch получает доступ к различным типам файлов разными методами. Система кэша поддерживает многоуровневые кэши и использует блоки разного размера для кэширования различных типов файлов. Например, обычно большое количество небольших блоков используется для кэширования файлов .fdx и .tip, тогда как небольшое количество крупных блоков используется для кэширования файлов .fdt. Вы можете изменить настройки кэша в соответствии с потребностями сервиса. Table 7 описывает настраиваемые параметры.
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
low_cost.obs.blockcache.names | Массив | ["default"] | Список имен многоуровневых кэшей. Система кэшей поддерживает многоуровневые кэши для данных с различной гранулярностью доступа. Существует кэш по умолчанию с именем default. Если вы настраиваете этот параметр, значение должно включать как минимум кэш default, помимо других пользовательских имен кэшей. |
low_cost.obs.blockcache.<NAME>.type | ENUM | memory | Storage type of the cache named <NAME>. Диапазон значений:
|
low_cost.obs.blockcache.<NAME>.blockshift | Integer | 13 (означает 8 КБ) | Block size in the cache named <NAME> (in bytes). Формула: 2blockshift. Например, если значение равно 16, размер блока будет 216 байт, то есть 65536 байт или 64 КБ. Значение: количество сдвигов влево |
low_cost.obs.blockcache.<NAME>.bank.count | Целое | 1 | Number of partitions in the cache named <NAME>. Each partition is an independent unit in the cache. |
low_cost.obs.blockcache.<NAME>.number.blocks.perbank | Целое | 8192 | Number of blocks in each partition of the cache named <NAME>. |
low_cost.obs.blockcache.<NAME>.exclude.file.types | Массив | N/A | List of file name extensions for files that cannot be cached in the cache named <NAME>. If a file's extension is not in exclude.file.types or <NAME>.file.types (if configured), the default cache policy applies. |
low_cost.obs.blockcache.<NAME>.file.types | Массив | N/A | List of file name extensions for files that can be cached in the cache named <NAME>. If a file's extension is not in exclude.file.types or <NAME>.file.types (if configured), the default cache policy applies. |
index.frozen.obs.max_bytes_per_sec | String | 150MB | Максимальная скорость, с которой документы замороженных индексов загружаются в OBS. Формат значения: число + единица измерения Диапазон значений: от 0 до (263 – 1) байт Значение 0 указывает отсутствие ограничения. Изменение вступает в силу немедленно. |
low_cost.obs.index.upload.threshold.use.multipart | String | 1GB | Порог многокомпонентной загрузки. При выгрузке замороженных индексов в OBS, если размер отдельного документа превышает этот порог, выполняется многокомпонентная загрузка. Формат значения: число + единица измерения Диапазон значений: от 0 до (263 – 1) байт Значение 0 указывает, что многокомпонентная загрузка не используется. |
Ниже приведён типичный пример конфигурации кэша. Используется двухуровневая система кэша: default и large. Кэш default содержит в общей сложности 30 × 4096 блоков по 64 KB. Он используется для кэширования файлов, не являющихся .fdt. Кэш large содержит 5 × 1000 блоков по 2 MB. Он используется для кэширования файлов .fdx, .dvd и .tip.
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 2.19.0 или 3.4.0, а версия образа не ранее x.x.x_25.9.0_xxx, задачи замораживания индексов не выполняются сразу после отправки. Вместо этого они временно кэшируются на настраиваемый период, а затем обрабатываются пакетно. Правила кэширования асинхронных задач замораживания индексов могут быть настроены. Table 8 описывает соответствующие параметры.
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
low_cost.freeze.job.interval | TimeValue | 1m | Интервал выполнения задачи пакетного замораживания индекса. Диапазон значений: 10s до 10m Если этот параметр установлен в 1m, система кэширует запросы на замораживание индексов в течение 1 минуты, а затем выполняет их все сразу. |
low_cost.freeze.job.batch_size | Integer | 20 | Максимальное количество индексов, которое может быть включено в одну задачу пакетного замораживания индекса. Диапазон значений: от 1 до 100 Если этот параметр установлен в 20, каждый пакет может содержать 20 индексов. Например, если задача Index Lifecycle Management (ILM) отправляет 100 индексов для замораживания одновременно, они будут разделены на пять пакетов и заморожены по одному пакету за раз. |
low_cost.freeze.job.start_time | String | 00:00 (executable all day) | Время начала задач пакетного замораживания индексов, означающее, что такие задачи не могут быть запущены до указанного времени. Если отправленная задача замораживания индекса ещё не началась, ей придётся ждать до указанного времени начала. Формат значения: час:минута |
low_cost.freeze.job.end_time | String | 23:59 (executable all day) | Время завершения для задач пакетного замораживания индексов, означающее, что после указанного времени такие задачи не могут быть запущены. На уже запущенные задачи данная настройка не влияет. Формат: hour:minute |
Например, выполните следующую команду, чтобы изменить настройки пакетного замораживания индексов по умолчанию:
PUT _cluster/settings{"persistent": {"low_cost.freeze.job.interval": "5m","low_cost.freeze.job.batch_size": 30,"low_cost.freeze.job.start_time": "22:00","low_cost.freeze.job.end_time": "07:00"}}
При первом запросе к замороженным индексам на странице Discover в OpenSearch Dashboards все данные необходимо получить из OBS, поскольку в кэше нет данных. Если требуется вернуть большое количество документов, извлечение соответствующих полей времени и метаданных документов из OBS занимает много времени. Кеширование этой части данных в кластере позволяет значительно улучшить производительность запросов. Именно так CSS повышает производительность запросов для замороженных индексов. Настройки локального кэша предустановлены. Вы можете просмотреть их и при необходимости изменить.
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
low_cost.local_cache.max.capacity | Целое | 500 | Максимальное количество кэшей холодных данных, которые могут быть доступны на каждом узле. (Каждый шард соответствует кэшу.) Диапазон значений: 10–5000
|
index.low_cost.local_cache.threshold | Целое | 50 | Процент полей date в индексе, используемый в качестве порога для включения или отключения локального кэширования холодных данных.
Диапазон значений: 0–100 Единица измерения: % |
index.low_cost.local_cache.evict_time | Строка | 30d | Продолжительность хранения холодных данных в локальном кэше. Значение определяется index.frozen_date (время заморозки индекса). Если index.frozen_date недоступно, значение определяется временем создания индекса. Рекомендуется скорректировать продолжительность хранения в зависимости от использования диска. Диапазон значений: от 1 до 365 дней Единица измерения: d (дней) |
Ниже приведены некоторые примеры:
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}
Пример ответа:
{"_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.}}}}}
Чтобы помочь вам понять, как работает плагин разделения хранения и вычислений с 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}
Пример ответа:
Выполните следующую команду, чтобы изменить период хранения индекса на семь дней:
PUT _cluster/settings{"persistent": {"low_cost.obs_rate_index.evict_time": "7d"}}
Параметр | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
low_cost.obs_rate_index.evict_time | String | 30d | Период удержания индекса .freeze_obs_rate-YYYY.mm.dd на каждом узле.
Любое изменение вступает в силу немедленно. |
Чтобы обеспечить приемлемую производительность запросов к холодным данным (например, когда исторические данные запрашиваются периодически), используйте решение с многоуровневым хранением. Для получения подробной информации см. Switching Between Hot and Cold Data.