更新时间:2026-04-24 GMT+08:00
分享

通过ISM实现存算分离

在日志分析或运维监控场景中,历史数据的存储成本会随着时间推移而增加,但大部分冷数据仅需应对偶尔的审计或回溯,长期占用昂贵的本地SSD资源会造成极大的成本浪费。为了解决高昂存储成本与长期留存需求之间的矛盾,CSS服务为Elasticsearch集群提供了存算分离功能。通过配置索引生命周期管理(ISM)策略,配合冻结索引动作,系统可自动将满足条件的索引从本地盘迁移至低成本的对象存储服务(OBS)中进行“冻结”,在保持数据可查询的同时,降低存储开销。

方案介绍

本案例通过给集群索引配置生命周期管理策略实现存算分离:

  • Hot阶段:数据存储在高性能本地磁盘,支持高并发读写。
  • Warm阶段:通过冻结索引操作,将索引数据转储至OBS。此时本地磁盘仅保留必要的元数据,查询请求会直接访问OBS(首查稍有延迟,后续会有缓存加速),实现物理上的存算分离。
  • Delete阶段:当数据超过保留期限,自动删除索引,释放存储资源。

本案例通过索引生命周期管理策略,定义索引在创建3天后,自动被冻结,数据转储到OBS中;当索引创建7天后,删除该索引。

图1 存算分离

约束限制

Elasticsearch集群仅7.6.2和7.10.2版本支持配置存算分离。

配置索引生命周期管理策略

  1. 登录Kibana进入命令执行页面。
    1. 登录云搜索服务管理控制台
    2. 在左侧导航栏,选择“集群管理 > Elasticsearch”
    3. 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
    4. 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。

      控制台左侧是命令输入框,其右侧的三角形图标为执行按钮,右侧区域则显示执行结果。

  2. 定义生命周期策略,以便自动管理索引的存算分离。

    例如,创建策略“hot_warm_policy”,定义索引在3天后自动执行存算分离将数据转储至OBS,7天后彻底删除。

    PUT _opendistro/_ism/policies/hot_warm_policy
    {
      "policy": {
        "description": "hot warm archive delete workflow",
        "error_notification": null,
        "default_state": "hot",
        "states": [
          {
            "name": "hot",
            "actions": [],
            "transitions": [
              {
                "state_name": "warm",
                "conditions": {
                  "min_index_age": "3d"
                }
              }
            ]
          },
          {
            "name": "warm",
            "actions": [
              {
                "freeze_low_cost": {}  // 冻结索引
              }
            ],
            "transitions": [
              {
                "state_name": "delete",
                "conditions": {
                  "min_index_age": "7d"
                }
              }
            ]
          },
          {
            "name": "delete",
            "actions": [
              {
                "delete": {}
              }
            ],
            "transitions": []
          }
        ]
      }
    }
  3. 绑定索引模板,确保所有新生成的满足条件的索引都能自动应用生命周期策略。

    例如,创建索引模板“template_hot_warm”,定义所有新生成的“data”开头的索引会动关联上生命周期策略“hot_warm_policy”。

    PUT _template/template_hot_warm
    {
      "index_patterns": "data*",
      "settings": {
        "number_of_replicas": 5, // 索引副本数
        "number_of_shards": 1,   // 索引分片数
        "opendistro.index_state_management.policy_id": "hot_warm_policy"   // 生命周期策略名称
      },
      "mappings": {
        "properties": {
          "name": {
            "type": "text"
          }
        }
      }
    }
  4. 写入数据。

    例如,新建索引“data-2022-06-06”并批量导入数据。

    POST data-2022-06-06/_bulk
    {"index":{}}
    {"name":"name1"}
    {"index":{}}
    {"name":"name2"}
    {"index":{}}
    {"name":"name3"}
    {"index":{}}
    {"name":"name4"}
    {"index":{}}
    {"name":"name5"}
    {"index":{}}
    {"name":"name6"}

    该索引会自动应用索引模板“template_hot_warm”,并通过索引模板关联生命周期策略“hot_warm_policy”。

  5. 查询数据,确认数据是否自动实现存算分离。
    1. 在索引创建3天后,查询冻结状态的索引列表,确认3天前的索引是否已经被冻结。
      GET _cat/freeze_indices?s=i&v

      如下所示,返回结果中包含data-2022-06-06,则说明该索引已成功从本地磁盘转储至OBS。

      health status index                  uuid                   pri rep docs.count docs.deleted store.size pri.store.size
      green  open   data-2022-06-06  x8ab5NX6T3Ox_xoGUanogQ    1   1          6            0      7.6kb          3.8kb
    2. 在索引创建7天后,查询索引列表,确认7天前的索引是否已经被删除。
      GET /_cat/indices?expand_wildcards=open,closed

      返回结果中不存在data-2022-06-06,则说明该索引已成功删除。

相关文档