API уменьшения индекса
Сжимает существующий индекс в новый индекс с меньшим количеством первичных фрагментов.
resp = client.indices.shrink(
index="my-index-000001",
target="shrunk-my-index-000001",
)
print(resp) response = client.indices.shrink( index: 'my-index-000001', target: 'shrunk-my-index-000001' ) puts response
const response = await client.indices.shrink({
index: "my-index-000001",
target: "shrunk-my-index-000001",
});
console.log(response); POST /my-index-000001/_shrink/shrunk-my-index-000001
Запрос
POST /<index>/_shrink/<target-index>
PUT /<index>/_shrink/<target-index>
Предварительные условия
- Если включены функции безопасности Elasticsearch, у вас должна быть привилегия индекса для индекса.
-
Перед сжатием индекса:
- Индекс должен быть только для чтения.
- Копия каждого фрагмента индекса должна находиться на одном узле.
- Индекс должен иметь статус работоспособности.
Для упрощения распределения фрагментов рекомендуется также удалить реплики фрагментов индекса. Позднее вы можете повторно добавить реплики фрагментов как часть операции сжатия.
Вы можете использовать следующий запрос API обновления настроек индекса, чтобы удалить реплики фрагментов индекса и переместить оставшиеся фрагменты индекса на тот же узел.
resp = client.indices.put_settings(
index="my_source_index",
settings={
"settings": {
"index.number_of_replicas": 0,
"index.routing.allocation.require._name": "shrink_node_name"
}
},
)
print(resp) response = client.indices.put_settings(
index: 'my_source_index',
body: {
settings: {
'index.number_of_replicas' => 0,
'index.routing.allocation.require._name' => 'shrink_node_name'
}
}
)
puts response const response = await client.indices.putSettings({
index: "my_source_index",
settings: {
settings: {
"index.number_of_replicas": 0,
"index.routing.allocation.require._name": "shrink_node_name",
},
},
});
console.log(response); PUT /my_source_index/_settings
{
"settings": {
"index.number_of_replicas": 0,
"index.routing.allocation.require._name": "shrink_node_name"
}
} | Удаляет реплики фрагментов для индекса. | |
| Перемещает фрагменты индекса на указанный узел. См. Фильтрацию распределения фрагментов на уровне индекса. |
Перемещение исходного индекса может занять некоторое время. Прогресс можно отслеживать с помощью API, или можно использовать API для ожидания, пока все фрагменты не будут перемещены с помощью параметра wait_for_no_relocating_shards.
Затем вы можете сделать индекс только для чтения с помощью следующего запроса с использованием API добавления блока индекса:
resp = client.indices.add_block(
index="my_source_index",
block="write",
)
print(resp) response = client.indices.add_block( index: 'my_source_index', block: 'write' ) puts response
const response = await client.indices.addBlock({
index: "my_source_index",
block: "write",
});
console.log(response); PUT /my_source_index/_block/write
Описание
API сжатия индексов позволяет сжать существующий индекс в новый индекс с меньшим количеством первичных фрагментов. Запрашиваемое количество первичных фрагментов в целевом индексе должно быть делителем количества фрагментов в исходном индексе. Например, индекс с 8 первичными фрагментами может быть сжат в 4, 2 или 1 первичных фрагментов, или индекс с 15 первичными фрагментами может быть сжат в 5, 3 или 1. Если количество фрагментов в индексе является простым числом, его можно сжать только в один первичный фрагмент. Перед сжатием (первичная или реплицирующая) копия каждого фрагмента индекса должна быть присутствовать на одном узле.
Текущий индекс записи в потоке данных сжать нельзя. Чтобы сжать текущий индекс записи, поток данных должен быть сначала перенесён, чтобы создать новый индекс записи, а затем предыдущий индекс записи можно сжать.
Как работает сжатие
Операция сжатия:
- Создаёт новый целевой индекс с таким же определением, как у исходного индекса, но с меньшим количеством первичных фрагментов.
- Создает жёсткие ссылки на сегменты из исходного индекса в целевой индекс. (Если файловая система не поддерживает жёсткие ссылки, все сегменты копируются в новый индекс, что является гораздо более длительным процессом. Также если используются несколько путей данных, фрагменты на разных путях данных требуют полной копии файлов сегментов, если они не находятся на одном диске, так как жёсткие ссылки не работают между дисками)
- Восстанавливает целевой индекс, как если бы это был закрытый индекс, который только что был повторно открыт. Восстанавливает фрагменты к настройке индекса
.routing.allocation.initial_recovery._id.
Сжать индекс
Чтобы сжать my_source_index в новый индекс под названием my_target_index, выполните следующий запрос:
resp = client.indices.shrink(
index="my_source_index",
target="my_target_index",
settings={
"index.routing.allocation.require._name": None,
"index.blocks.write": None
},
)
print(resp) response = client.indices.shrink(
index: 'my_source_index',
target: 'my_target_index',
body: {
settings: {
'index.routing.allocation.require._name' => nil,
'index.blocks.write' => nil
}
}
)
puts response const response = await client.indices.shrink({
index: "my_source_index",
target: "my_target_index",
settings: {
"index.routing.allocation.require._name": null,
"index.blocks.write": null,
},
});
console.log(response); POST /my_source_index/_shrink/my_target_index
{
"settings": {
"index.routing.allocation.require._name": null,
"index.blocks.write": null
}
} | Очистить требования к распределению, скопированные из исходного индекса. | |
| Очистить блок записи индекса, скопированный из исходного индекса. |
Вышеприведенный запрос возвращает результат сразу после добавления целевого индекса в состояние кластера — он не ожидает начала операции сжатия.
Индексы можно сжимать только в том случае, если они удовлетворяют следующим требованиям:
- Целевой индекс не должен существовать.
- Исходный индекс должен иметь больше первичных фрагментов, чем целевой индекс.
- Количество первичных фрагментов в целевом индексе должно быть делителем количества первичных фрагментов в исходном индексе. Исходный индекс должен иметь больше первичных фрагментов, чем целевой индекс.
- Индекс не должен содержать более
2,147,483,519документов в целом по всем фрагментам, которые будут сжаты в один фрагмент в целевом индексе, так как это максимальное количество документов, которое может поместиться в один фрагмент. - Узел, обрабатывающий процесс сжатия, должен иметь достаточное свободное дисковое пространство для размещения второй копии существующего индекса.
API _shrink похож на API create index и принимает параметры settings и aliases для целевого индекса:
resp = client.indices.shrink(
index="my_source_index",
target="my_target_index",
settings={
"index.number_of_replicas": 1,
"index.number_of_shards": 1,
"index.codec": "best_compression"
},
aliases={
"my_search_indices": {}
},
)
print(resp) response = client.indices.shrink(
index: 'my_source_index',
target: 'my_target_index',
body: {
settings: {
'index.number_of_replicas' => 1,
'index.number_of_shards' => 1,
'index.codec' => 'best_compression'
},
aliases: {
my_search_indices: {}
}
}
)
puts response const response = await client.indices.shrink({
index: "my_source_index",
target: "my_target_index",
settings: {
"index.number_of_replicas": 1,
"index.number_of_shards": 1,
"index.codec": "best_compression",
},
aliases: {
my_search_indices: {},
},
});
console.log(response); POST /my_source_index/_shrink/my_target_index
{
"settings": {
"index.number_of_replicas": 1,
"index.number_of_shards": 1,
"index.codec": "best_compression"
},
"aliases": {
"my_search_indices": {}
}
} | Количество фрагментов в целевом индексе. Это должно быть делителем количества фрагментов в исходном индексе. | |
| Лучшая компрессия будет работать только тогда, когда в индекс вносятся новые записи, например, при принудительном слиянии фрагмента в один сегмент. |
Описания полей не могут быть указаны в запросе _shrink.
Отслеживание процесса сжатия
Процесс сжатия можно отследить с помощью API, или можно использовать API для ожидания, пока все первичные фрагменты не будут распределены, установив параметр wait_for_status в значение yellow.
API _shrink возвращает результат, как только целевой индекс добавлен в состояние кластера, до распределения каких-либо фрагментов. В этот момент все фрагменты находятся в состоянии unassigned. Если по какой-либо причине целевой индекс не может быть распределен на узле сжатия, его первичный фрагмент останется unassigned до тех пор, пока он не будет распределён на этом узле.
После распределения первичного фрагмента он переходит в состояние initializing, и начинается процесс сжатия. Когда операция сжатия завершена, фрагмент станет active. В этот момент Elasticsearch попытается распределить все реплики и может принять решение о перемещении первичного фрагмента на другой узел.
Ожидание активных фрагментов
Поскольку операция сжатия создаёт новый индекс для сжатия фрагментов, значение настройки ожидания активных фрагментов при создании индекса также применяется к действию сжатия индекса.
Параметры пути
-
<index> - (Обязательный, строка) Имя исходного индекса, который нужно сжать.
-
<target-index> -
(Обязательный, строка) Имя целевого индекса, который нужно создать.
Имена индексов должны соответствовать следующим критериям:
- Только строчные буквы
- Не может содержать
\,/,*,?,",<,>,|, ` ` (пробел),,,# - Индексы до версии 7.0 могли содержать двоеточие (
:), но это устарело и не будет поддерживаться в версии 7.0 и выше - Не может начинаться с
-,_,+ - Не может быть
.или.. - Не может быть длиннее 255 байт (обратите внимание, что это байты, поэтому многобайтовые символы быстрее достигнут предела в 255 байт)
- Имена, начинающиеся с
., устарели, за исключением скрытых индексов и внутренних индексов, управляемых плагинами
Параметры запроса
-
wait_for_active_shards -
(Необязательный, строка) Количество копий каждого фрагмента, которые должны быть активны перед выполнением операции. Устанавливается в
allили любое неотрицательное целое число до общего количества копий каждого фрагмента в индексе (number_of_replicas+1). По умолчанию используется1, что означает ожидание активации каждого первичного фрагмента.См. Активные фрагменты.
-
master_timeout - (Необязательный, единицы измерения времени) Период ожидания мастер-узла. Если мастер-узел недоступен до истечения срока ожидания, запрос завершается ошибкой. По умолчанию используется
30s. Также можно установить значение-1, чтобы указать, что запрос никогда не должен превысить время ожидания. -
timeout - (Необязательный, единицы измерения времени) Период ожидания ответа от всех соответствующих узлов в кластере после обновления метаданных кластера. Если ответ не получен до истечения срока ожидания, обновление метаданных кластера все равно применяется, но ответ будет указывать, что он не был полностью подтвержден. По умолчанию используется
30s. Также можно установить значение-1, чтобы указать, что запрос никогда не должен превысить время ожидания.
Тело запроса
-
aliases -
(Необязательный, объект объектов) Псевдонимы для результирующего индекса.
Свойства объектов
aliases-
<alias> -
(Обязательный, объект) Ключ — имя псевдонима. Имена псевдонимов индексов поддерживают date math.
Тело объекта содержит параметры для псевдонима. Поддерживается пустой объект.
Свойства
<alias>-
filter - (Необязательный, объект Query DSL) Запрос, используемый для ограничения документов, к которым может получить доступ псевдоним.
-
index_routing - (Необязательный, строка) Значение, используемое для маршрутизации операций индексирования на определенный фрагмент. Если указано, это переопределяет значение
routingдля операций индексирования. -
is_hidden - (Необязательный, Булево) Если
true, псевдоним скрыт. По умолчаниюfalse. Все индексы для псевдонима должны иметь одинаковое значениеis_hidden. -
is_write_index - (Необязательный, Булево) Если
true, индекс является индексом записи для псевдонима. По умолчаниюfalse. -
routing - (Необязательный, строка) Значение, используемое для маршрутизации операций индексирования и поиска на определенный фрагмент.
-
search_routing - (Необязательный, строка) Значение, используемое для маршрутизации операций поиска на определенный фрагмент. Если указано, это переопределяет значение
routingдля операций поиска.
-
-
-
settings - (Необязательный, объект настроек индекса) Параметры конфигурации для целевого индекса. См. Настройки индекса.
-
max_primary_shard_size - (Необязательный, единицы измерения размера в байтах) Максимальный размер первичного фрагмента для целевого индекса. Используется для поиска оптимального количества фрагментов для целевого индекса. При установке этого параметра объем хранилища каждого фрагмента в целевом индексе не будет превышать заданного значения. Количество фрагментов целевого индекса по-прежнему будет зависеть от количества фрагментов исходного индекса, но если параметр меньше размера одного фрагмента в исходном индексе, количество фрагментов для целевого индекса будет равно количеству фрагментов исходного индекса. Например, при установке этого параметра в 50 ГБ, если исходный индекс имеет 60 первичных фрагментов общей емкостью 100 ГБ, то целевой индекс будет иметь 2 первичных фрагмента, каждый размером 50 ГБ; если исходный индекс имеет 60 первичных фрагментов общей емкостью 1000 ГБ, то целевой индекс будет иметь 20 первичных фрагментов; если исходный индекс имеет 60 первичных фрагментов общей емкостью 4000 ГБ, то целевой индекс по-прежнему будет иметь 60 первичных фрагментов. Этот параметр конфликтует с
number_of_shardsвsettings, может быть установлен только один из них.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/indices-shrink-index.html