集群级别的分片分配和路由设置

编辑

分片分配是将分片副本分配给节点的过程。这可能发生在初始恢复、副本分配、重新平衡、将节点添加到集群或从集群中删除节点时,或者在更新影响分配的集群或索引设置时。

主节点的主要职责之一是决定将哪些分片分配给哪些节点,以及何时在节点之间移动分片以重新平衡集群。

有许多设置可用于控制分片分配过程

除此之外,还有一些其他的 其他集群级别的设置

集群级别的分片分配设置

编辑

您可以使用以下设置来控制分片分配和恢复

cluster.routing.allocation.enable

(动态) 为特定类型的分片启用或禁用分配

  • all - (默认) 允许所有类型分片的分片分配。
  • primaries - 仅允许主分片的分片分配。
  • new_primaries - 仅允许新索引的主分片的分片分配。
  • none - 不允许任何索引的任何类型的分片分配。

此设置仅影响未来的分配,不会重新分配或取消分配当前已分配的分片。它也不影响重新启动节点时本地主分片的恢复。重新启动的节点如果具有未分配主分片的副本,将立即恢复该主分片,前提是其分配 ID 与集群状态中的活动分配 ID 之一匹配。

cluster.routing.allocation.same_shard.host
(动态) 如果为 true,则禁止将一个分片的多个副本分配到同一主机上的不同节点,即具有相同网络地址的节点。默认为 false,这意味着一个分片的副本有时可能会分配到同一主机上的节点。此设置仅在您在每个主机上运行多个节点时才相关。
cluster.routing.allocation.node_concurrent_incoming_recoveries
(动态) 允许在一个节点上同时进行多少个并发的传入分片恢复。传入恢复是指目标分片(很可能是副本,除非分片正在重新定位)分配在节点上的恢复。默认为 2。增加此设置可能会导致分片移动对集群中的其他活动产生性能影响,但可能不会使分片移动更快地完成。我们不建议将此设置从其默认值 2 进行调整。
cluster.routing.allocation.node_concurrent_outgoing_recoveries
(动态) 允许在一个节点上同时进行多少个并发的传出分片恢复。传出恢复是指源分片(很可能是主分片,除非分片正在重新定位)分配在节点上的恢复。默认为 2。增加此设置可能会导致分片移动对集群中的其他活动产生性能影响,但可能不会使分片移动更快地完成。我们不建议将此设置从其默认值 2 进行调整。
cluster.routing.allocation.node_concurrent_recoveries
(动态) 一个用于同时设置 cluster.routing.allocation.node_concurrent_incoming_recoveriescluster.routing.allocation.node_concurrent_outgoing_recoveries 的快捷方式。仅当未配置更具体的设置时,此设置的值才会生效。默认为 2。增加此设置可能会导致分片移动对集群中的其他活动产生性能影响,但可能不会使分片移动更快地完成。我们不建议将此设置从其默认值 2 进行调整。
cluster.routing.allocation.node_initial_primaries_recoveries
(动态) 虽然副本的恢复是通过网络进行的,但在节点重新启动后,未分配主分片的恢复使用来自本地磁盘的数据。这些应该很快,因此每个节点可以并行进行更多的初始主分片恢复。默认为 4。增加此设置可能会导致分片恢复对集群中的其他活动产生性能影响,但可能不会使分片恢复更快地完成。我们不建议将此设置从其默认值 4 进行调整。

分片重新平衡设置

编辑

当每个节点上的分片数量相等,所有节点需要相同的资源,并且任何节点上都没有任何索引的分片集中时,集群是平衡的。Elasticsearch 运行一个称为重新平衡的自动过程,该过程在集群中的节点之间移动分片以改善其平衡。重新平衡遵守所有其他分片分配规则,例如 分配过滤强制感知,这可能会阻止它完全平衡集群。在这种情况下,重新平衡会努力在您配置的规则内实现最平衡的集群。如果您正在使用数据层,那么 Elasticsearch 会自动应用分配过滤规则,将每个分片放置在适当的层中。这些规则意味着平衡器在每个层内独立工作。

您可以使用以下设置来控制集群中分片的重新平衡

cluster.routing.allocation.allow_rebalance

(动态) 指定何时允许分片重新平衡

  • always - (默认) 始终允许重新平衡。
  • indices_primaries_active - 仅当集群中的所有主分片都已分配时。
  • indices_all_active - 仅当集群中的所有分片(主分片和副本)都已分配时。
cluster.routing.rebalance.enable

(动态) 为特定类型的分片启用或禁用重新平衡

  • all - (默认) 允许所有类型的分片进行分片平衡。
  • primaries - 仅允许主分片进行分片平衡。
  • replicas - 仅允许副本分片进行分片平衡。
  • none - 不允许任何索引进行任何类型的分片平衡。

重新平衡对于确保集群在中断后恢复到健康且完全弹性的状态非常重要。如果您调整此设置,请记住尽快将其设置回 all

cluster.routing.allocation.cluster_concurrent_rebalance
(动态) 定义允许在整个集群中同时进行的分片重新平衡的数量。默认为 2。请注意,此设置仅控制由于集群不平衡而导致的同时分片重新定位的数量。此设置不限制由于分配过滤强制感知 而导致的分片重新定位。增加此设置可能会导致集群使用额外的资源在节点之间移动分片,因此我们通常不建议将此设置从其默认值 2 进行调整。
cluster.routing.allocation.type

选择用于计算集群平衡的算法。默认为 desired_balance,它选择期望的平衡分配器。此分配器运行一个后台任务,该任务计算集群中分片的期望平衡。此后台任务完成后,Elasticsearch 会将分片移动到其期望的位置。

[8.8] 在 8.8 中已弃用。 balanced 分配器类型已弃用,不再推荐使用 也可以设置为 balanced 以选择旧的平衡分配器。此分配器是 8.6.0 之前的 Elasticsearch 版本中的默认分配器。它在前台运行,阻止主节点并行执行其他工作。它的工作原理是选择少量可以立即改善集群平衡的分片移动,并且当这些分片移动完成后,它会再次运行并选择其他一些要移动的分片。由于此分配器仅根据集群的当前状态做出决策,因此有时会在平衡集群时多次移动分片。

分片平衡启发式设置

编辑

重新平衡的工作原理是根据每个节点的分片分配计算其权重,然后在节点之间移动分片以减少较重节点的权重并增加较轻节点的权重。当没有可能的分片移动可以将任何节点的权重比其他任何节点的权重更接近可配置的阈值时,集群是平衡的。

节点的权重取决于它持有的分片数量以及这些分片在磁盘上的大小以及支持分片的写入流量所需的线程数表示的总估计资源使用量。当通过滚动创建数据流时,Elasticsearch 会估计属于数据流的分片的资源使用量。新分片的估计磁盘大小是数据流中其他分片的平均大小。新分片的估计写入负载是数据流中最近分片的实际写入负载的加权平均值。不属于数据流写入索引的分片的估计写入负载为零。

以下设置控制 Elasticsearch 如何将这些值组合成每个节点权重的整体度量。

cluster.routing.allocation.balance.threshold
(浮点数,动态) 触发分片重新平衡移动的最小权重改进值。默认为 1.0f。提高此值将导致 Elasticsearch 更早地停止重新平衡分片,从而使集群处于更不平衡的状态。
cluster.routing.allocation.balance.shard
(浮点数,动态) 定义分配给每个节点的总分片数的权重因子。默认为 0.45f。提高此值会增加 Elasticsearch 在其他平衡变量之前优先均衡各节点之间的分片总数的趋势。
cluster.routing.allocation.balance.index
(浮点数,动态) 定义分配给每个节点的每个索引的分片数的权重因子。默认为 0.55f。提高此值会增加 Elasticsearch 在其他平衡变量之前优先均衡各节点之间每个索引的分片数的趋势。
cluster.routing.allocation.balance.disk_usage
(浮点数,动态) 定义根据分片预测的磁盘大小(以字节为单位)平衡分片的权重因子。默认为 2e-11f。提高此值会增加 Elasticsearch 在其他平衡变量之前优先均衡各节点之间的总磁盘使用量的趋势。
cluster.routing.allocation.balance.write_load
(浮点数,动态) 定义每个分片写入负载的权重因子,以分片所需的估计索引线程数表示。默认为 10.0f。提高此值会增加 Elasticsearch 在其他平衡变量之前优先均衡各节点之间的总写入负载的趋势。
  • 如果您的集群很大,可能没有必要始终保持完全平衡的状态。对于集群而言,以某种不平衡状态运行比执行实现完美平衡所需的所有分片移动资源消耗更少。如果是这样,请增加 cluster.routing.allocation.balance.threshold 的值,以定义节点之间可接受的不平衡。例如,如果您每个节点平均有 500 个分片,并且可以接受节点之间 5%(25 个典型分片)的差异,请将 cluster.routing.allocation.balance.threshold 设置为 25
  • 我们不建议调整启发式权重因子设置的值。默认值在所有合理的集群中都能很好地工作。虽然不同的值可能会在某些方面改善当前的平衡,但它们可能会在未来造成意想不到的问题,或者阻止它优雅地处理意外的中断。
  • 无论平衡算法的结果如何,由于强制感知和分配过滤等分配规则,可能不允许重新平衡。使用集群分配解释 API 来解释当前分片的分配情况。

基于磁盘的分片分配设置

编辑

基于磁盘的分片分配器确保所有节点都有足够的磁盘空间,而不会执行不必要的分片移动。它基于一对称为低水位线高水位线的阈值来分配分片。其主要目标是确保没有节点超过高水位线,或者至少任何此类超额只是暂时的。如果某个节点超过高水位线,那么 Elasticsearch 将通过将其一些分片移动到集群中的其他节点来解决此问题。

节点不时临时超过高水位线是正常的。

分配器还尝试通过禁止将更多分片分配给超过低水位线的节点来使节点远离高水位线。重要的是,如果您所有的节点都已超过低水位线,则无法分配任何新分片,并且 Elasticsearch 将无法在节点之间移动任何分片以使磁盘使用率保持在低水位线以下。您必须确保您的集群总共有足够的磁盘空间,并且始终有一些节点低于低水位线。

由基于磁盘的分片分配器触发的分片移动还必须满足所有其他分片分配规则,例如分配过滤强制感知。如果这些规则过于严格,那么它们也会阻止保持节点磁盘使用率受控所需的分片移动。如果您正在使用数据层,那么 Elasticsearch 会自动配置分配过滤规则,以便将分片放置在适当的层中,这意味着基于磁盘的分片分配器在每个层中独立工作。

如果某个节点填充其磁盘的速度快于 Elasticsearch 将分片移动到其他位置的速度,则存在磁盘完全填满的风险。为了防止这种情况,作为最后的手段,一旦磁盘使用率达到洪水期水位线,Elasticsearch 将阻止向受影响节点上具有分片的索引进行写入。它还将继续将分片移动到集群中的其他节点上。当受影响节点的磁盘使用率降至高水位线以下时,Elasticsearch 会自动移除写入阻止。请参阅修复水位线错误以解决持久的水位线错误。

集群中节点使用的磁盘空间量差异很大是正常的。集群的平衡取决于多种因素的组合,其中包括每个节点上的分片数、这些分片所属的索引以及每个分片在磁盘大小和 CPU 使用率方面的资源需求。Elasticsearch 必须权衡所有这些因素,并且当查看所有这些因素的组合时处于平衡状态的集群,如果您只关注其中一个因素,则可能看起来不平衡。

您可以使用以下设置来控制基于磁盘的分配

cluster.routing.allocation.disk.threshold_enabled
(动态) 默认为 true。设置为 false 以禁用磁盘分配决策器。禁用后,它还将删除任何现有的 index.blocks.read_only_allow_delete 索引块。
cluster.routing.allocation.disk.watermark.low logo cloud
(动态) 控制磁盘使用率的低水位线。它默认为 85%,这意味着 Elasticsearch 不会将分片分配给磁盘使用率超过 85% 的节点。它可以设置为比率值,例如 0.85。它也可以设置为绝对字节值(如 500mb),以防止 Elasticsearch 在可用空间小于指定量时分配分片。此设置对新创建索引的主分片没有影响,但会阻止分配其副本。
cluster.routing.allocation.disk.watermark.low.max_headroom
(动态) 控制低水位线的最大余量(在百分比/比率值的情况下)。当 cluster.routing.allocation.disk.watermark.low 未显式设置时,默认为 200GB。这限制了所需的可用空间量。
cluster.routing.allocation.disk.watermark.high logo cloud
(动态) 控制高水位线。它默认为 90%,这意味着 Elasticsearch 将尝试将分片从磁盘使用率高于 90% 的节点重新定位。它可以设置为比率值,例如 0.9。它也可以设置为绝对字节值(类似于低水位线),以便在可用空间小于指定量时将分片从节点重新定位。此设置会影响所有分片的分配,无论之前是否已分配。
cluster.routing.allocation.disk.watermark.high.max_headroom
(动态) 控制高水位线的最大余量(在百分比/比率值的情况下)。当 cluster.routing.allocation.disk.watermark.high 未显式设置时,默认为 150GB。这限制了所需的可用空间量。
cluster.routing.allocation.disk.watermark.enable_for_single_data_node
(静态) 在早期版本中,默认行为是在进行分配决策时忽略单数据节点集群的磁盘水位线。自 7.14 起,此行为已弃用,并在 8.0 中删除。此设置唯一有效的值现在为 true。此设置将在未来的版本中删除。
cluster.routing.allocation.disk.watermark.flood_stage logo cloud

(动态) 控制洪水期水位线,默认为 95%。Elasticsearch 会在每个索引上强制实施只读索引块 (index.blocks.read_only_allow_delete),该索引在节点上分配了一个或多个分片,并且至少有一个磁盘超过了洪水期。此设置是防止节点耗尽磁盘空间的最后手段。当磁盘利用率降至高水位线以下时,将自动释放索引块。与低水位线和高水位线值类似,它也可以设置为比率值,例如 0.95,或绝对字节值。

重置 my-index-000001 索引上的只读索引块的示例

resp = client.indices.put_settings(
    index="my-index-000001",
    settings={
        "index.blocks.read_only_allow_delete": None
    },
)
print(resp)
response = client.indices.put_settings(
  index: 'my-index-000001',
  body: {
    'index.blocks.read_only_allow_delete' => nil
  }
)
puts response
const response = await client.indices.putSettings({
  index: "my-index-000001",
  settings: {
    "index.blocks.read_only_allow_delete": null,
  },
});
console.log(response);
PUT /my-index-000001/_settings
{
  "index.blocks.read_only_allow_delete": null
}
cluster.routing.allocation.disk.watermark.flood_stage.max_headroom
(动态) 控制洪水期水位线的最大余量(在百分比/比率值的情况下)。当 cluster.routing.allocation.disk.watermark.flood_stage 未显式设置时,默认为 100GB。这限制了所需的可用空间量。

您不能在 cluster.routing.allocation.disk.watermark.lowcluster.routing.allocation.disk.watermark.highcluster.routing.allocation.disk.watermark.flood_stage 设置中混合使用百分比/比率值和字节值。所有值要么设置为百分比/比率值,要么都设置为字节值。此强制执行是为了使 Elasticsearch 可以验证设置在内部是否一致,从而确保低磁盘阈值小于高磁盘阈值,并且高磁盘阈值小于洪水期阈值。对最大余量值执行类似的比较检查。

cluster.routing.allocation.disk.watermark.flood_stage.frozen logo cloud
(动态) 控制专用冻结节点的洪水期水位线,默认为 95%。
cluster.routing.allocation.disk.watermark.flood_stage.frozen.max_headroom logo cloud
(动态) 控制专用于冻结节点的洪水水位线(在百分比/比率值的情况下)的最大缓冲空间。如果未显式设置 cluster.routing.allocation.disk.watermark.flood_stage.frozen,则默认为 20GB。这限制了专用于冻结节点上所需的可用空间量。
cluster.info.update.interval
(动态) Elasticsearch 应该多久检查一次集群中每个节点的磁盘使用情况。默认为 30s

百分比值指的是已用磁盘空间,而字节值指的是可用磁盘空间。这可能会令人困惑,因为它颠倒了高和低的含义。例如,将低水位线设置为 10GB,将高水位线设置为 5GB 是有意义的,反之则不然。

一个示例是将低水位线更新为至少 100GB 可用空间,将高水位线更新为至少 50GB 可用空间,将洪水水位线更新为 10GB 可用空间,并每分钟更新一次关于集群的信息

resp = client.cluster.put_settings(
    persistent={
        "cluster.routing.allocation.disk.watermark.low": "100gb",
        "cluster.routing.allocation.disk.watermark.high": "50gb",
        "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
        "cluster.info.update.interval": "1m"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'cluster.routing.allocation.disk.watermark.low' => '100gb',
      'cluster.routing.allocation.disk.watermark.high' => '50gb',
      'cluster.routing.allocation.disk.watermark.flood_stage' => '10gb',
      'cluster.info.update.interval' => '1m'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m",
  },
});
console.log(response);
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "100gb",
    "cluster.routing.allocation.disk.watermark.high": "50gb",
    "cluster.routing.allocation.disk.watermark.flood_stage": "10gb",
    "cluster.info.update.interval": "1m"
  }
}

关于水位线的最大缓冲空间设置,请注意,这些仅适用于水位线设置为百分比/比率的情况。最大缓冲空间值的目的是限制在达到各自水位线之前所需的可用磁盘空间。这对于具有较大磁盘的服务器尤其有用,在这些服务器上,百分比/比率水位线可能会转化为对大量可用磁盘空间的要求,而最大缓冲空间可以用来限制所需的可用磁盘空间量。例如,让我们以洪水水位线的默认设置为例。它具有 95% 的默认值,而洪水最大缓冲空间设置的默认值为 100GB。这意味着

  • 对于较小的磁盘,例如 100GB,洪水水位线将在 95% 时达到,这意味着在剩余 5GB 可用空间时达到,因为 5GB 小于 100GB 的最大缓冲空间值。
  • 对于较大的磁盘,例如 100TB,洪水水位线将在剩余 100GB 可用空间时达到。这是因为仅 95% 的洪水水位线就需要 5TB 的可用磁盘空间,但这被最大缓冲空间设置限制为 100GB。

最后,只有在未显式设置各自的水位线设置(即,它们具有默认百分比值)的情况下,最大缓冲空间设置才具有其默认值。如果显式设置了水位线,则最大缓冲空间设置不具有其默认值,如果需要,则需要显式设置。

分片分配感知

编辑

您可以将自定义节点属性用作感知属性,以使 Elasticsearch 在分配分片时考虑您的物理硬件配置。如果 Elasticsearch 知道哪些节点在同一物理服务器、同一机架或同一区域中,则它可以分配主分片及其副本分片,以最大程度地减少在发生故障时丢失所有分片副本的风险。

当使用 动态 cluster.routing.allocation.awareness.attributes 设置启用分片分配感知时,分片仅分配给已为指定感知属性设置值的节点。如果您使用多个感知属性,Elasticsearch 在分配分片时会单独考虑每个属性。

属性值的数量决定了每个位置中分配的分片副本数量。如果每个位置中的节点数量不平衡并且存在大量副本,则副本分片可能会保持未分配状态。

了解有关设计弹性集群的更多信息。

启用分片分配感知

编辑

要启用分片分配感知

  1. 使用自定义节点属性指定每个节点的位置。例如,如果您希望 Elasticsearch 将分片分布到不同的机架,则可以使用名为 rack_id 的感知属性。

    您可以通过两种方式设置自定义属性

    • 通过编辑 elasticsearch.yml 配置文件

      node.attr.rack_id: rack_one
    • 在启动节点时使用 -E 命令行参数

      ./bin/elasticsearch -Enode.attr.rack_id=rack_one
  2. 通过在每个符合主节点条件的节点的 elasticsearch.yml 配置文件中设置 cluster.routing.allocation.awareness.attributes,告知 Elasticsearch 在分配分片时考虑一个或多个感知属性。

    cluster.routing.allocation.awareness.attributes: rack_id 

    将多个属性指定为逗号分隔的列表。

    您还可以使用 cluster-update-settings API 来设置或更新集群的感知属性

    resp = client.cluster.put_settings(
        persistent={
            "cluster.routing.allocation.awareness.attributes": "rack_id"
        },
    )
    print(resp)
    response = client.cluster.put_settings(
      body: {
        persistent: {
          'cluster.routing.allocation.awareness.attributes' => 'rack_id'
        }
      }
    )
    puts response
    const response = await client.cluster.putSettings({
      persistent: {
        "cluster.routing.allocation.awareness.attributes": "rack_id",
      },
    });
    console.log(response);
    PUT /_cluster/settings
    {
      "persistent" : {
        "cluster.routing.allocation.awareness.attributes" : "rack_id"
      }
    }

使用此示例配置,如果您启动两个将 node.attr.rack_id 设置为 rack_one 的节点,并创建一个包含 5 个主分片和每个主分片 1 个副本的索引,则所有主分片和副本都会在这两个节点上分配。

All primaries and replicas are allocated across two nodes in the same rack
图 1. 所有主分片和副本都分配在同一机架中的两个节点上

如果您添加两个将 node.attr.rack_id 设置为 rack_two 的节点,Elasticsearch 会将分片移动到新节点,从而确保(如果可能)同一分片的两个副本不在同一机架中。

Primaries and replicas are allocated across four nodes in two racks with no two copies of the same shard in the same rack
图 2. 主分片和副本分配在两个机架中的四个节点上,同一分片的两个副本不在同一机架中

如果 rack_two 发生故障并导致其两个节点都关闭,默认情况下,Elasticsearch 会将丢失的分片副本分配给 rack_one 中的节点。为了防止特定分片的多个副本分配在同一位置,您可以启用强制感知。

强制感知

编辑

默认情况下,如果一个位置发生故障,Elasticsearch 会将其分片分布在其余位置。如果集群没有足够的资源来托管所有分片(当一个位置丢失时),这可能是不希望的。

为了防止在整个位置发生故障时剩余位置过载,请使用 cluster.routing.allocation.awareness.force.* 设置指定应该存在的属性值。这意味着,在整个位置发生故障时,Elasticsearch 将倾向于保留一些未分配的副本,而不是使剩余位置的节点过载。

例如,如果您的感知属性名为 zone,并且在 zone1zone2 中配置了节点,则可以使用强制感知来使 Elasticsearch 在只有一个区域可用时保留一半的未分配分片副本

cluster.routing.allocation.awareness.attributes: zone
cluster.routing.allocation.awareness.force.zone.values: zone1,zone2 

指定所有可能的 zone 属性值。

使用此示例配置,如果您有两个将 node.attr.zone 设置为 zone1 的节点,以及一个将 number_of_replicas 设置为 1 的索引,Elasticsearch 会分配所有主分片,但不分配任何副本。一旦 node.attr.zone 的值不同的节点加入集群,它将分配副本分片。相反,如果您不配置强制感知,Elasticsearch 会将所有主分片和副本都分配给这两个节点,即使它们在同一区域中也是如此。

集群级分片分配过滤

编辑

您可以使用集群级分片分配过滤器来控制 Elasticsearch 从任何索引分配分片的位置。这些集群范围的过滤器与每个索引的分配过滤分配感知结合使用。

分片分配过滤器可以基于自定义节点属性或内置的 _name_host_ip_publish_ip_ip_host_id_tier 属性。

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

集群级分片分配过滤最常见的用例是当您想要停用节点时。要在关闭节点之前将分片移出节点,您可以创建一个按其 IP 地址排除该节点的过滤器

resp = client.cluster.put_settings(
    persistent={
        "cluster.routing.allocation.exclude._ip": "10.0.0.1"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'cluster.routing.allocation.exclude._ip' => '10.0.0.1'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "cluster.routing.allocation.exclude._ip": "10.0.0.1",
  },
});
console.log(response);
PUT _cluster/settings
{
  "persistent" : {
    "cluster.routing.allocation.exclude._ip" : "10.0.0.1"
  }
}

集群路由设置

编辑
cluster.routing.allocation.include.{attribute}
(动态) 将分片分配给其 {attribute} 具有至少一个逗号分隔值的节点。
cluster.routing.allocation.require.{attribute}
(动态) 仅将分片分配给其 {attribute} 具有所有逗号分隔值的节点。
cluster.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.cluster.put_settings(
    persistent={
        "cluster.routing.allocation.exclude._ip": "192.168.2.*"
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'cluster.routing.allocation.exclude._ip' => '192.168.2.*'
    }
  }
)
puts response
const response = await client.cluster.putSettings({
  persistent: {
    "cluster.routing.allocation.exclude._ip": "192.168.2.*",
  },
});
console.log(response);
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.exclude._ip": "192.168.2.*"
  }
}