索引级别分片分配过滤编辑

您可以使用分片分配过滤器来控制 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",
        body={"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
    PUT test/_settings
    {
      "index.routing.allocation.include.size": "big,medium"
    }

    如果您指定多个过滤器,则节点必须同时满足以下条件才能将分片重新分配到该节点

    • 如果指定了任何 require 类型条件,则必须满足所有条件
    • 如果指定了任何 exclude 类型条件,则不能满足任何条件
    • 如果指定了任何 include 类型条件,则必须满足至少一个条件

    例如,要将 test 索引移动到 rack1 中的 big 节点,您可以指定

    resp = client.indices.put_settings(
        index="test",
        body={
            "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
    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",
    body={"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
PUT test/_settings
{
  "index.routing.allocation.include._ip": "192.168.2.*"
}