--- title: "Easysearch 冷热架构实战" date: 2025-09-08 lastmod: 2025-09-08 description: "这篇文档主要介绍了如何使用索引生命周期策略(ILM)和冷热架构在Easysearch集群中自动管理索引的迁移。" tags: ["Easyearch"] summary: "在之前的文章中,我们介绍了如何使用 索引生命周期策略来管理索引。如果要求索引根据其生命周期阶段自动在不同的节点之间迁移,还需要用到冷热架构。我们来看看具体如何实现。 冷热架构 # 冷热架构其实就是在 Easyearch 集群中定义不同属性的节点,这些节点共同组成冷热架构。比如给所有热节点一个 hot 属性,给所有冷节点一个 cold 属性。在 Easyearch 中分配节点属性是通过配置文件(easysearch.yml)来实现的,比如我要定义一个热节点和一个冷节点,我可以在对应节点的配置文件中添加如下行: # 热节点添加下面的行 node.attr.temp: hot # 冷节点添加下面的行 node.attr.temp: cold 有了这些属性,我们就可以指定索引分片在分配时,是落在 hot 节点还是 cold 节点。 查看节点属性 测试环境是个 2 节点的 Easysearch 集群。 比如我创建新索引 test-index,希望它被分配到 hot 节点上。 PUT test-index { "settings": { "number_of_replicas": 0, "index.routing.allocation.require.temp": "hot" } } 可以看到 test-index 索引的分片分配到 hot 节点 node-1 上。我们修改索引分配节点的属性,让其移动到 cold 节点 node-2 上。 PUT test-index/_settings { "settings": { "index.routing.allocation.require.temp": "cold" } } 生命周期与冷热架构 # 在上面的例子中,我们通过索引分配节点属性对索引“坐落”的节点进行了控制。在索引生命周期策略中也支持对该属性进行修改,实现索引根据生命周期阶段自动在不同的节点之间移动的目的。" --- 在之前的文章中,我们介绍了如何使用[索引生命周期策略](https://infinilabs.cn/blog/2025/easysearch-ilm-practical-guide/)来管理索引。如果要求索引根据其生命周期阶段自动在不同的节点之间迁移,还需要用到冷热架构。我们来看看具体如何实现。 ## 冷热架构 冷热架构其实就是在 Easyearch 集群中定义不同属性的节点,这些节点共同组成冷热架构。比如给所有热节点一个 hot 属性,给所有冷节点一个 cold 属性。在 Easyearch 中分配节点属性是通过配置文件(easysearch.yml)来实现的,比如我要定义一个热节点和一个冷节点,我可以在对应节点的配置文件中添加如下行: ```plain # 热节点添加下面的行 node.attr.temp: hot # 冷节点添加下面的行 node.attr.temp: cold ``` 有了这些属性,我们就可以指定索引分片在分配时,是落在 hot 节点还是 cold 节点。 **查看节点属性** 测试环境是个 2 节点的 Easysearch 集群。 {{% load-img "/img/blog/2025/easysearch-hot-warm-arch/1.png" "" %}} 比如我创建新索引 test-index,希望它被分配到 hot 节点上。 ```plain PUT test-index { "settings": { "number_of_replicas": 0, "index.routing.allocation.require.temp": "hot" } } ``` {{% load-img "/img/blog/2025/easysearch-hot-warm-arch/2.png" "" %}} 可以看到 test-index 索引的分片分配到 hot 节点 node-1 上。我们修改索引分配节点的属性,让其移动到 cold 节点 node-2 上。 ```plain PUT test-index/_settings { "settings": { "index.routing.allocation.require.temp": "cold" } } ``` {{% load-img "/img/blog/2025/easysearch-hot-warm-arch/3.png" "" %}} ## 生命周期与冷热架构 在上面的例子中,我们通过索引分配节点属性对索引“坐落”的节点进行了控制。在索引生命周期策略中也支持对该属性进行修改,实现索引根据生命周期阶段自动在不同的节点之间移动的目的。 比如我们定义一个简单的索引策略: + 索引创建后进入 hot 阶段,此阶段的索引被分配到 hot 节点 + 创建索引 3 分钟后,索引进入 cold 阶段,此阶段索引分片移动到 cold 节点 ## 创建策略 ```plain PUT _ilm/policy/ilm_test { "policy": { "phases": { "hot": { "min_age": "0m", }, "cold": { "min_age": "3m", "actions": { "allocate" : { "require" : { "temp": "cold" } } } } } } } ``` 生命周期策略后台是定期触发的任务,为了更快的观测到效果,可以修改任务触发周期为每分钟 1 次。 ```plain PUT _cluster/settings { "transient": { "index_lifecycle_management.job_interval":"1" } } ``` ## 创建索引模板 创建完索引生命周期策略,还需要索引模板把索引和生命周期策略关联起来。我们创建一个模板把所有 ilm_test 开头的索引与 ilm_test 生命周期策略关联,为了便于观察,指定索引没有副本分片。 ```plain PUT _template/ilm_test { "order" : 100000, "index_patterns" : [ "ilm_test*" ], "settings" : { "index" : { "lifecycle" : { "name" : "ilm_test" }, "number_of_replicas" : "0", "routing.allocation.require.temp": "hot" } } } ``` ## 创建索引 创建一个 ilm_test 开头的索引,应用上一步创建的索引模板。 ```plain POST ilm_test_1/_doc { "test":"test" } ``` 查看索引分片分配情况。 {{% load-img "/img/blog/2025/easysearch-hot-warm-arch/4.png" "" %}} 目前索引存储在 node-1 节点,按计划 3 分钟后将会移动到 node-2 上。 {{% load-img "/img/blog/2025/easysearch-hot-warm-arch/5.png" "" %}} {{% load-img "/img/blog/2025/easysearch-hot-warm-arch/6.png" "" %}} 至此我们已通过索引生命周期策略实现了索引分片的移动,其实支持的操作还有很多,比如: rollover、close、snapshot等,详情请参阅官方[文档](https://docs.infinilabs.com/easysearch/main/docs/references/management/ilm_api/#%E6%93%8D%E4%BD%9C)。 有任何问题,欢迎加我微信沟通。 {{% load-img "/img/blog/banner/about_yangf.png" "" %}}