Elasticsearch 冷热节点,为何自定义属性用 include 声明路由时索引无法流转,而 require 可以?
2023-12-17 03:26:42
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 来声明路由时,索引只能路由到匹配指定条件的节点上,从而保证了索引能够正常流转。