Фильтрация распределения фрагментов на уровне индекса
Вы можете использовать фильтры распределения фрагментов для управления тем, где Elasticsearch распределяет фрагменты конкретного индекса. Эти фильтры на уровне индекса применяются совместно с фильтрацией распределения фрагментов на уровне кластера и осознанием распределения фрагментов.
Фильтры распределения фрагментов могут основываться на пользовательских атрибутах узла или встроенных атрибутах _name, _host_ip, _publish_ip, _ip, _host, _id, _tier и _tier_preference. Управление жизненным циклом индексов использует фильтры на основе пользовательских атрибутов узлов для определения способа перераспределения фрагментов при переходе между фазами.
Настройки cluster.routing.allocation динамичны, что позволяет мгновенно перемещать существующие индексы с одной группы узлов на другую. Фрагменты перемещаются только в том случае, если это возможно без нарушения других ограничений маршрутизации, таких как предотвращение размещения первичного и реплицированного фрагментов на одном узле.
Например, вы можете использовать пользовательский атрибут узла для указания характеристик производительности узла и использовать фильтрацию распределения фрагментов для маршрутизации фрагментов конкретного индекса на наиболее подходящие классы оборудования.
Включение фильтрации распределения фрагментов на уровне индекса
Для фильтрации по пользовательскому атрибуту узла:
-
Укажите характеристики фильтра с помощью пользовательского атрибута узла в конфигурационном файле каждого узла
elasticsearch.yml. Например, если у вас есть узлыsmall,mediumиbig, вы можете добавить атрибутsizeдля фильтрации по размеру узла.node.attr.size: medium
Вы также можете задать пользовательские атрибуты при запуске узла:
./bin/elasticsearch -Enode.attr.size=medium
-
Добавьте фильтр маршрутизации распределения в индекс. Настройки
index.routing.allocationподдерживают три типа фильтров:include,excludeиrequire. Например, чтобы указать Elasticsearch на распределение фрагментов индексаtestна узлыbigилиmedium, используйтеindex.routing.allocation.include:resp = client.indices.put_settings( index="test", settings={ "index.routing.allocation.include.size": "big,medium" }, ) print(resp)response = client.indices.put_settings( index: 'test', body: { 'index.routing.allocation.include.size' => 'big,medium' } ) puts responseconst response = await client.indices.putSettings({ index: "test", settings: { "index.routing.allocation.include.size": "big,medium", }, }); console.log(response);PUT test/_settings { "index.routing.allocation.include.size": "big,medium" }Если вы указываете несколько фильтров, для перераспределения фрагментов на узел должны быть выполнены следующие условия:
- Если заданы условия типа
require, должны быть выполнены все из них. - Если заданы условия типа
exclude, ни одно из них не должно быть выполнено. - Если заданы условия типа
include, должно быть выполнено хотя бы одно из них.
Например, для перемещения индекса
testна узлыbigвrack1вы можете указать:resp = client.indices.put_settings( index="test", settings={ "index.routing.allocation.require.size": "big", "index.routing.allocation.require.rack": "rack1" }, ) print(resp)response = client.indices.put_settings( index: 'test', body: { 'index.routing.allocation.require.size' => 'big', 'index.routing.allocation.require.rack' => 'rack1' } ) puts responseconst response = await client.indices.putSettings({ index: "test", settings: { "index.routing.allocation.require.size": "big", "index.routing.allocation.require.rack": "rack1", }, }); console.log(response);PUT test/_settings { "index.routing.allocation.require.size": "big", "index.routing.allocation.require.rack": "rack1" } - Если заданы условия типа
Настройки фильтра распределения индекса
-
index.routing.allocation.include.{attribute} - Назначить индекс узлу, у которого
{attribute}содержит хотя бы одно из перечисленных через запятую значений. -
index.routing.allocation.require.{attribute} - Назначить индекс узлу, у которого
{attribute}содержит все перечисленные через запятую значения. -
index.routing.allocation.exclude.{attribute} - Назначить индекс узлу, у которого
{attribute}не содержит ни одного из перечисленных через запятую значений.
Настройки распределения индекса поддерживают следующие встроенные атрибуты:
| | Сопоставление узлов по имени узла |
| | Сопоставление узлов по IP-адресу хоста (IP, связанный с именем хоста) |
| | Сопоставление узлов по IP-адресу публикации |
| | Сопоставление узлов по |
| | Сопоставление узлов по имени хоста |
| | Сопоставление узлов по идентификатору узла |
| | Сопоставление узлов по роли уровня данных узла. Для получения более подробной информации см. фильтрацию распределения фрагментов по уровню данных |
Фильтрация по _tier основана на ролях узла. Только подмножество ролей являются ролями уровня данных, и общая роль узла данных будет соответствовать любому фильтру по уровню.
Вы можете использовать подстановочные знаки при указании значений атрибутов, например:
resp = client.indices.put_settings(
index="test",
settings={
"index.routing.allocation.include._ip": "192.168.2.*"
},
)
print(resp) response = client.indices.put_settings(
index: 'test',
body: {
'index.routing.allocation.include._ip' => '192.168.2.*'
}
)
puts response const response = await client.indices.putSettings({
index: "test",
settings: {
"index.routing.allocation.include._ip": "192.168.2.*",
},
});
console.log(response); PUT test/_settings
{
"index.routing.allocation.include._ip": "192.168.2.*"
}
© 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/shard-allocation-filtering.html