--- title: "Easysearch 索引生命周期管理实战" date: 2025-04-19 lastmod: 2025-04-19 description: "Easysearch 索引生命周期管理实战,自动处理时序数据索引的副本数和删除等任务。" tags: ["Easyearch"] summary: "如果你的使用场景是对时序型数据进行分析,可能你会更重视最新的数据,并且可能会定期对老旧的数据进行一些处理,比如减少副本数、forcemerge、 删除等。Easysearch 的索引生命周期管理功能,可以自动完成此类索引的管理任务。 创建策略 # 为了演示,我们定义一个简单的索引策略: 索引创建后进入 hot 阶段,此阶段的索引有 2 个副本(在索引模板中定义) 创建索引 3 分钟后,进入 warm 阶段,此阶段的索引有 1 个副本 创建索引 10 分钟后,进入 cold 阶段,此阶段的索引没有副本 PUT _ilm/policy/ilm_test { "policy": { "phases": { "hot": { "min_age": "0m" }, "warm": { "min_age": "3m", "actions": { "replica_count":{ "number_of_replicas": 1 } } }, "cold": { "min_age": "10m", "actions": { "replica_count":{ "number_of_replicas": 0 } } } } } } 当然每个阶段还支持更多的操作,比如 rollover、forcemerge、readonly、snapshot 等。更多的信息请查看官方 文档。 生命周期策略后台是定期触发的任务,为了更快的观测到效果,可以修改任务触发周期为每分钟 1 次。" --- 如果你的使用场景是对时序型数据进行分析,可能你会更重视最新的数据,并且可能会定期对老旧的数据进行一些处理,比如减少副本数、forcemerge、 删除等。Easysearch 的索引生命周期管理功能,可以自动完成此类索引的管理任务。 ## 创建策略 为了演示,我们定义一个简单的索引策略: + 索引创建后进入 hot 阶段,此阶段的索引有 2 个副本(在索引模板中定义) + 创建索引 3 分钟后,进入 warm 阶段,此阶段的索引有 1 个副本 + 创建索引 10 分钟后,进入 cold 阶段,此阶段的索引没有副本 {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/1.png" "" %}} ```plain PUT _ilm/policy/ilm_test { "policy": { "phases": { "hot": { "min_age": "0m" }, "warm": { "min_age": "3m", "actions": { "replica_count":{ "number_of_replicas": 1 } } }, "cold": { "min_age": "10m", "actions": { "replica_count":{ "number_of_replicas": 0 } } } } } } ``` 当然每个阶段还支持更多的操作,比如 rollover、forcemerge、readonly、snapshot 等。更多的信息请查看官方[文档](https://docs.infinilabs.com/easysearch/main/docs/references/management/ilm_api/#%E6%93%8D%E4%BD%9C)。 生命周期策略后台是定期触发的任务,为了更快的观测到效果,可以修改任务触发周期为每分钟 1 次。 ```plain PUT _cluster/settings { "transient": { "index_lifecycle_management.job_interval":"1" } } ``` ## 创建索引模板 创建完索引生命周期策略,还需要索引模板把索引和生命周期策略关联起来,这样只要创建相关索引就自动会被生命周期策略管理。我们创建一个模板把所有 ilm_test 开头的索引与 ilm_test 生命周期策略关联,并指定索引创建时就有 2 个副本。 ```plain PUT _template/ilm_test { "order" : 100000, "index_patterns" : [ "ilm_test*" ], "settings" : { "index" : { "lifecycle" : { "name" : "ilm_test", "rollover_alias" : "ilm_test" }, "number_of_replicas" : "2" } } } ``` ## 创建初始索引 创建一个 ilm_test 开头的索引,应用上一步创建的索引模板。 ```plain PUT ilm_test-00001 { "aliases":{ "ilm_test":{ "is_write_index":true } } } ``` 17 点 50 分 44 秒创建初始索引,索引分片情况是 1 个主分片和 2 个副本分片,每个节点一个分片。 {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/2.png" "" %}} {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/3.png" "" %}} 3 分钟后,17 点 53 分 55 秒,索引进入 warm 阶段,副本数变成 1,剩下一个 主分片和 1 个副本分片。 {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/4.png" "" %}} {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/5.png" "" %}} 又 7 分钟后(距索引创建 10 分钟),18 点 00 分 46 秒,索引进入 cold 阶段,副本数变成 0,只剩下一个主分片。 {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/6.png" "" %}} {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/7.png" "" %}} 至此索引的生命周期完成。 ## 更新策略 更新 ILM 策略需要在请求url里指定 seq_no 和 primary_term 。修改前先查看当前策略的 seq_no 和 primary_term。 {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/8.png" "" %}} 修改策略 ilm_test,使 cold 阶段保持 2 个副本。 ```plain PUT _ilm/policy/ilm_test?if_seq_no=74698&if_primary_term=22 { "policy": { "phases": { "hot": { "min_age": "0m" }, "warm": { "min_age": "3m", "actions": { "replica_count":{ "number_of_replicas": 1 } } }, "cold": { "min_age": "6m", "actions": { "replica_count":{ "number_of_replicas": 2 } } } } } } ``` {{% load-img "/img/blog/2025/easysearch-ilm-practical-guide/9.png" "" %}}更新成功。 ⚠️注意:更新索引生命周期策略不会对当前正在管理的索引造成影响(包括删除策略重建),只会影响新生成的索引。 ## 删除策略 通过指定策略命删除策略 ```plain DELETE _ilm/policy/ilm_test ``` 有任何问题,欢迎加我微信沟通。 {{% load-img "/img/blog/banner/about_yangf.png" "" %}}