索引级分片分配过滤

编辑

您可以使用分片分配过滤器来控制 Elasticsearch 将特定索引的分片分配到哪里。这些按索引设置的过滤器与集群范围的分配过滤分配感知结合使用。

分片分配过滤器可以基于自定义节点属性或内置的 _name_host_ip_publish_ip_ip_host_id_tier_tier_preference 属性。索引生命周期管理使用基于自定义节点属性的过滤器来确定在阶段之间移动时如何重新分配分片。

cluster.routing.allocation 设置是动态的,使现有索引能够立即从一组节点移动到另一组节点。只有在不违反其他路由约束(例如,永远不在同一节点上分配主分片和副本分片)的情况下,才会重新定位分片。

例如,您可以使用自定义节点属性来指示节点的性能特征,并使用分片分配过滤将特定索引的分片路由到最合适的硬件类别。

启用索引级分片分配过滤

编辑

要基于自定义节点属性进行过滤

  1. 在每个节点的 elasticsearch.yml 配置文件中使用自定义节点属性指定过滤器特征。例如,如果您有 smallmediumbig 节点,则可以添加一个 size 属性以基于节点大小进行过滤。

    node.attr.size: medium

    您还可以在启动节点时设置自定义属性

    ./bin/elasticsearch -Enode.attr.size=medium
  2. 将路由分配过滤器添加到索引。 index.routing.allocation 设置支持三种类型的过滤器:includeexcluderequire。 例如,要告知 Elasticsearch 将 test 索引中的分片分配到 bigmedium 节点,请使用 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 索引移动到 rack1 中的 big 节点,您可以指定

    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

按节点 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.*"
}