返回

Elasticsearch 冷热节点,为何自定义属性用 include 声明路由时索引无法流转,而 require 可以?

后端

1. 问题背景
在 Elasticsearch 集群中,我们可以通过自定义属性来定义冷热节点,以便将不同温度的数据存储在不同的节点上。通过这种方式,我们可以优化集群的性能和成本。但是,在使用 include 来声明路由时,我们可能会遇到索引无法流转的问题。而使用 require 声明路由时,索引却能正常流转。本文将探讨其原因。

2. 冷热节点定义
在 Elasticsearch 中,我们可以通过以下两种方式定义冷热节点:

  • data_hot :用于存储热数据。
  • data_warm :用于存储温数据。

使用自定义属性来定义冷热节点,我们可以通过以下配置:

{
  "settings": {
    "index": {
      "routing.allocation.include._tier": "data_hot,data_warm"
    }
  }
}

在该配置中,我们指定了索引可以路由到哪些节点上。这里,我们指定了索引可以路由到热节点或温节点上。

3. include 和 require 的区别
在 Elasticsearch 中,我们可以通过以下两种方式来声明路由:

  • include :允许索引路由到匹配指定条件的节点上。
  • require :要求索引只能路由到匹配指定条件的节点上。

在我们的案例中,我们使用 include 来声明路由,允许索引路由到热节点或温节点上。但是,当我们使用 include 来声明路由时,索引无法流转。这是因为 include 仅允许索引路由到匹配指定条件的节点上,而不会强制索引路由到匹配指定条件的节点上。因此,当索引需要流转时,它可能会路由到不匹配指定条件的节点上。

而当我们使用 require 来声明路由时,索引只能路由到匹配指定条件的节点上。这使得索引只能路由到热节点或温节点上,从而保证了索引能够正常流转。

4. 解决方法
为了解决这个问题,我们可以使用 require 来声明路由,确保索引只能路由到匹配指定条件的节点上。例如,我们可以使用以下配置:

{
  "settings": {
    "index": {
      "routing.allocation.require._tier": "data_hot,data_warm"
    }
  }
}

5. 结论
在 Elasticsearch 中,使用自定义属性来定义冷热节点时,使用 include 来声明路由可能会导致索引无法流转。这是因为 include 仅允许索引路由到匹配指定条件的节点上,而不会强制索引路由到匹配指定条件的节点上。而当我们使用 require 来声明路由时,索引只能路由到匹配指定条件的节点上,从而保证了索引能够正常流转。