本文介绍在阿里云Elasticsearch集群上,通过生命周期管理ILM(Index Lifecycle Management)功能,实现冷热数据分离的实践流程。通过本实践,您既可以实现在保证集群读写性能的基础上,自动维护集群上的冷热数据,又能通过优化集群架构,降低企业生产成本。

背景信息

当今大数据时代,数据时刻在更新变化。尤其是随着时间的积累,存储在阿里云Elasticsearch中的数据会越来越多,当数据达到一定量时,必然会造成服务的内存、CPU、IO等指标上涨,影响Elasticsearch的全文检索能力。为此Elasticsearch(6.6.0及以上版本)提供了索引生命周期管理ILM功能,实现索引从设置、创建、打开、关闭到删除的全生命周期管理。尤其在时序和冷热数据场景上应用ILM,可以大幅度节约存储成本。本文以冷热数据场景为例,介绍如何使用ILM功能。业务场景如下:
  1. 将索引数据实时写入Elasticsearch。当索引数据增加到一定量时,数据自动写入新索引。
  2. 新索引(滚动后的索引)在hot阶段停留30分钟,进入warm阶段。
  3. warm阶段完成Merge及Shrink操作后,索引等待1小时(从滚动更新时算起),进入cold阶段。
  4. cold阶段将热节点数据迁移到冷节点,实现冷热数据分离后,索引会在2个小时(从滚动更新时算起)后被删除。

使用建议

  • Elasticsearch索引生命周期策略需密切贴近业务模型。例如,对多个不同结构的索引进行生命周期管理,建议各个索引配置独立的别名和生命周期策略,以便于管理。
  • 使用rollover滚动索引,初始索引应以自增数字结尾(-000001),否则策略不生效,长度要求为6。例如,定义初始索引为myindex-000001,则rollover后的索引是myindex-000002,以此类推进行递增。如果集群中索引名不符合规范,建议进行索引重建。
  • hot阶段主要处理数据写入。业务中需保证数据是按照时间顺序写入的,处于warm和cold阶段的索引不建议进行数据写入。例如,在warm阶段配置actionsshrinkread only,那么索引进入warm阶段后将处于只读状态,数据无法写入。
    说明 各生命周期阶段的详细说明请参见通过索引生命周期管理Heartbeat数据
  • 在选择冷热架构节点的规格时,由于热节点提供热点数据服务,因此建议配置较高的CPU和较快的IO;而冷节点提供冷数据服务,建议配置更多的磁盘空间。对于冷节点,即使配置较少的CPU和IO,也可以提供服务。

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

  1. 登录Kibana控制台。
    具体操作步骤请参见登录Kibana控制台
  2. 在左侧导航栏,单击Dev Tools
  3. Console中,执行如下命令,查看集群冷热节点属性。
    GET _cat/nodeattrs?v&h=host,attr,value
    结果显示集群中包含3个hot节点,3个warm节点,支持冷热架构。冷热架构集群
    说明 使用阿里云Elasticsearch时,您只需在创建实例时购买冷数据节点,系统即会自动部署冷热架构,详情请参见冷热数据分离
  4. 通过API方式,定义ILM策略。
    PUT /_ilm/policy/game-policy
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_size": "1GB",
                "max_age": "1d",
                "max_docs": 1000
              }
            }
          },
          "warm": {
            "min_age": "30m",
            "actions": {
              "forcemerge": {
                    "max_num_segments":1
                  },
              "shrink": {
                    "number_of_shards":1
                  }
            }
          },
          "cold": {
            "min_age": "1h",
            "actions": {
              "allocate": {
                "require": {
                  "box_type": "warm"
                }
              }
            }
          },
          "delete": {
            "min_age": "2h",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
    说明
    • 策略名创建后将无法更改。
    • 您也可以在Kibana控制台上创建策略,但是Kibana上指定的max_age最小单位为小时,而通过API方式,可指定最小单位为秒。
  5. 创建索引模板。
    settings中指定冷热属性,数据写入后存储在hot节点上。
    PUT _template/gamestabes_template
    {
      "index_patterns" : ["gamestabes-*"],
      "settings": {
        "index.number_of_shards": 5,
        "index.number_of_replicas": 1,
        "index.routing.allocation.require.box_type":"hot",
        "index.lifecycle.name": "game-policy", 
        "index.lifecycle.rollover_alias": "gamestabes"
      }
    }
    参数 说明
    index.routing.allocation.require.box_type 指定索引新建时所分配的节点。
    index.lifecycle.name 指定生命周期策略名称。
    index.lifecycle.rollover_alias 指定rollover别名。
  6. 基于序号创建初始索引。
    PUT gamestabes-000001
    {
    "aliases": {
        "gamestabes":{
           "is_write_index": true
            }
          }
    }

    您也可以基于时间创建索引,详情请参见using date math

  7. 通过别名写入数据。
    当数据达到rollover条件,并触发ILM检测周期后,索引将进行滚动更新。
    PUT gamestabes/_doc/1
    {
        "EU_Sales" : 3.58,
        "Genre" : "Platform",
        "Global_Sales" : 40.24,
        "JP_Sales" : 6.81,
        "Name" : "Super Mario Bros.",
        "Other_Sales" : 0.77,
        "Platform" : "NES",
        "Publisher" : "Nintendo",
        "Year_of_Release" : "1985",
        "na_Sales" : 29.08
    }
    说明 ILM默认10分钟检测一次符合策略标准的索引,当达到rollover条件后,索引将滚动到下一阶段,同时配置indices.lifecycle.poll_interval参数,修改检测周期
  8. 根据生命周期阶段过滤索引,并查看索引详细配置。
    1. 在左侧导航栏,单击Management
    2. Elasticsearch区域中,单击Index Management
    3. Index management中,单击Lifecycle status右侧的Lifecycle phase,从下拉列表中选择生命周期阶段进行过滤。
      根据生命周期过滤索引
    4. 单击过滤后的索引,查看索引详细信息。
      查看索引详细信息

验证数据分布

  1. 查询进入cold阶段的索引,并查看其配置信息。
    查询进入cold阶段的索引
  2. 查询处于cold阶段索引的shard分布。
    GET _cat/shards?shrink-gamestables-000012
    返回结果如下。根据返回结果可知,cold阶段的索引数据主要分布在冷数据节点上。返回结果

更新ILM策略

  1. 更新正在运行的ILM策略。
    更新ILM策略
  2. 查看更新后的策略版本。
    1. 在左侧导航栏,单击Management
    2. Elasticsearch区域中,单击Index Lifecycle Policies
    3. Index lifecycle policies中,查看更新后的策略版本。
      更新后策略的版本号增加1,此时正在滚动写入的索引依旧使用旧策略,新策略将在下次滚动更新时生效。查看更新后的ILM策略版本

切换ILM策略

  1. 创建新策略。
    PUT /_ilm/policy/game-new
    {
      "policy": {
        "phases": {
          "hot": {
            "actions": {
              "rollover": {
                "max_size": "3GB",
                "max_age": "1d",
                "max_docs": 1000
              }
            }
          },
          "warm": {
            "min_age": "30m",
            "actions": {
              "forcemerge": {
                    "max_num_segments":1
                  },
              "shrink": {
                    "number_of_shards":1
                  }
            }
          },
          "cold": {
            "min_age": "1h",
            "actions": {
              "allocate": {
                "require": {
                  "box_type": "warm"
                }
              }
            }
          },
          "delete": {
            "min_age": "2h",
            "actions": {
              "delete": {}
            }
          }
        }
      }
    }
  2. 为模板绑定新策略。
    PUT _template/gamestabes_template
    {
      "index_patterns" : ["gamestabes-*"],
      "settings": {
        "index.number_of_shards": 5,
        "index.number_of_replicas": 1,
        "index.routing.allocation.require.box_type":"hot",
        "index.lifecycle.name": "game-new", 
        "index.lifecycle.rollover_alias": "gamestabes"
      }
    }
    注意
    • 切换策略后,新策略不会立即生效。当前正在滚动写入的索引依旧使用旧策略,直到当前索引rollover生成新索引,新策略才会生效。
    • 应用旧策略创建的索引,依旧绑定旧策略。如果您需要为这些索引绑定新策略,可执行PUT gamestabes-*/_settings命令,详情请参见switching policies for an index

总结

本文介绍了通过ILM实现冷热分离的实践流程,主要内容如下:
  • 为索引配置生命周期管理策略
    主要流程如下:
    1. 配置集群冷热属性。
    2. 根据需求设置索引模板。
    3. 根据需求配置索引生命周期管理策略,并匹配模板。
    4. 定义初始滚动索引,以-00001开始,滚动生成的索引名后会自动加1。
  • 验证数据分布

    验证cold阶段索引的shard是否分布在冷数据节点上。

  • 更新ILM策略

    更新已有策略。

  • 切换ILM策略

    在不同策略间实现滚动切换。