Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Модули индексов ›Распределение фрагментов индексов

Фильтрация распределения фрагментов на уровне индекса

Вы можете использовать фильтры распределения фрагментов для управления тем, где Elasticsearch распределяет фрагменты конкретного индекса. Эти фильтры на уровне индекса применяются совместно с фильтрацией распределения фрагментов на уровне кластера и осознанием распределения фрагментов.

Фильтры распределения фрагментов могут основываться на пользовательских атрибутах узла или встроенных атрибутах _name, _host_ip, _publish_ip, _ip, _host, _id, _tier и _tier_preference. Управление жизненным циклом индексов использует фильтры на основе пользовательских атрибутов узлов для определения способа перераспределения фрагментов при переходе между фазами.

Настройки cluster.routing.allocation динамичны, что позволяет мгновенно перемещать существующие индексы с одной группы узлов на другую. Фрагменты перемещаются только в том случае, если это возможно без нарушения других ограничений маршрутизации, таких как предотвращение размещения первичного и реплицированного фрагментов на одном узле.

Например, вы можете использовать пользовательский атрибут узла для указания характеристик производительности узла и использовать фильтрацию распределения фрагментов для маршрутизации фрагментов конкретного индекса на наиболее подходящие классы оборудования.

Включение фильтрации распределения фрагментов на уровне индекса

Для фильтрации по пользовательскому атрибуту узла:

  1. Укажите характеристики фильтра с помощью пользовательского атрибута узла в конфигурационном файле каждого узла elasticsearch.yml. Например, если у вас есть узлы small, medium и big, вы можете добавить атрибут size для фильтрации по размеру узла.

    node.attr.size: medium

    Вы также можете задать пользовательские атрибуты при запуске узла:

    ./bin/elasticsearch -Enode.attr.size=medium
  2. Добавьте фильтр маршрутизации распределения в индекс. Настройки 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 response
    const 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 response
    const 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} не содержит ни одного из перечисленных через запятую значений.

Настройки распределения индекса поддерживают следующие встроенные атрибуты:

_name

Сопоставление узлов по имени узла

_host_ip

Сопоставление узлов по IP-адресу хоста (IP, связанный с именем хоста)

_publish_ip

Сопоставление узлов по IP-адресу публикации

_ip

Сопоставление узлов по _host_ip или _publish_ip

_host

Сопоставление узлов по имени хоста

_id

Сопоставление узлов по идентификатору узла

_tier

Сопоставление узлов по роли уровня данных узла. Для получения более подробной информации см. фильтрацию распределения фрагментов по уровню данных

Фильтрация по _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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API