本系列文章翻译ES官方8.0版本文档。

因为水平有限,翻译内容难免存在错漏,欢迎大家指出

索引分片分配过滤规则

  可以使用索引分片分配过滤规则为特定的索引指定分片存储的节点,这些过滤操作与集群分配(cluster-wide allocation filtering)和感知分配同时(allocation awareness)进行。


  cluster.routing.allocation配置是动态的,允许活跃索引将分片重集合中的一个节点迁移到其他节点。分片在满足其他所有的规则后就会进行重分配,如主分片和副分片不能分配到同一节点。

  举例来说,你可以通过节点的一些属性来了解节点的特性,然后就可以通过分分片筛选分配器为特定的索引指定最优的节点分配分片。

启用索引分片分配过滤规则

通过自定义节点属性过滤

  1. 可以在每个节点的elasticsearch.yml文件中指定自定义的节点属性,例如我们有smallmedium, 和big三种类型的节点,则可以添加size属性,如下
node.attr.size: medium

也可以在启动节点时设置,如下

./bin/elasticsearch -Enode.attr.size=medium

  2. 为索引添加过滤配置,index.routing.allocation配置支持三种过滤规则:includeexclude, and require。例如,需要将test索引的分片分配到big 或 medium节点,则使用index.routing.allocation.include配置项,如下

PUT test/_settings
{
  "index.routing.allocation.include.size": "big,medium"
}

如果设置多个过滤规则,则只有满足所有条件的节点才会分配分片:

  • 如果指定了require的过滤规则,则节点必须满足所有指定的该类规则。
  • 如果指定了exclude的过滤规则,则节点必须不满足所有的该类规则。
  • 如果指定了include的过滤规则,则节点需要至少满足一个规则。

例如,如下的配置则只有节点的size属性必须为big且rack属性必须为rack1的才能分配test索引的分片。

PUT test/_settings
{
  "index.routing.allocation.require.size": "big",
  "index.routing.allocation.require.rack": "rack1"
}

索引分片过滤配置

index.routing.allocation.include.{attribute}

将索引分片分配给至少满足一个条件的节点。

index.routing.allocation.require.{attribute}

将索引分片分配给满足所有条件的节点。

index.routing.allocation.exclude.{attribute}

将索引分片分配给不包含所有这些属性的节点。

  内置的分片分配属性如下

_name

根据节点名称匹配

_host_ip

根据节点ip匹配(与主机梦对应的ip)

_publish_ip

对外ip匹配

_ip

节点ip或者对外ip匹配

_host

机器名匹配

_id

节点id匹配

_tier

节点类型匹配

 

 

其中一些属性可以使用通配符设置,如

PUT test/_settings
{
  "index.routing.allocation.include._ip": "192.168.2.*"
}