ES 专题 - 索引生命周期管理(ILM)

197 阅读5分钟

1 介绍

es在7.x版本上新增索引生命周期管理的特性,这也将会是es维护管理中重要的一环,其主要功能是自动对es的索引进行管理,比较常用的就是对于es过期索引进行删除,这省去了写脚本管理索引的复杂流程。

2 索引生命周期

ILM 对于索引的生命周期进行了非常详细的划分,主要包括Hot、Warm、Cold、Delete四个阶段,但它并不强制要求必须有这个4个阶段,用户可以根据自己的需求组合成自己的生命周期。

2.1 Hot 阶段

Hot 阶段可类比为人类婴儿到青年的阶段,在这个阶段,它会不断地进行知识的输入与输出(数据读写) ,不断地长高长大(数据量增加)成有用的青年。

2.2 Warm 阶段

Warm 阶段可类比为人类青年到中年的阶段,在这个阶段,它基本不会再进行知识的输入(数据写入) ,主要进行知识输出(数据读取),为社会贡献价值。

2.3 Cold 阶段

Cold 阶段可类别比为人类中年到老年的阶段,在这个阶段,它退休了,在社会有需要的时候才出来输出下知识(数据读取) ,大部分情况都是静静地待着。

2.4 Delete 阶段

Delete 阶段可类比为人类寿终正寝的阶段,在发光发热之后,静静地逝去,Rest in Peace~

3 管理索引生命周期

所谓生命周期的管理就是控制 4 个生命阶段转换,何时由 Hot 转为 Warm,何时由 Warm 转为 Cold,何时 Delete 等。

阶段的转换必然是需要时机的,而对于时序数据来说,时间必然是最好的维度,而 ILM 也是以时间为转换的衡量单位。即默认是 Hot 阶段,在索引创建 3 天后转为 Warm 阶段,7 天后转为 Cold 阶段,30 天后删除。

ILM 将不同的生命周期管理策略称为 Policy,而所谓的 Policy 是由不同阶段(Phase)的不同动作(Action)组成的。

Action是一系列操作索引的动作,比如 Rollover、Shrink、Force Merge等,不同阶段可用的 Action 不同,详情如下:

  • Hot Phase

    • Rollover 滚动索引操作,可用在索引大小或者文档数达到某设定值时,创建新的索引用于数据读写,从而控制单个索引的大小。这里要注意的一点是,如果启用了 Rollover,那么所有阶段的时间不再以索引创建时间为准,而是以该索引 Rollover 的时间为准。
  • Warm Phase

    • Allocate 设定副本数、修改分片分配规则(如将分片迁移到中等配置的节点上)等
  • Read-Onlly 设定当前索引为只读状态

  • Force Merge 合并 segment 操作

  • Shrink 缩小 shard 分片数

  • Cold Phase

    • Allocate 同上
  • Delete Phase

    • Delete 删除
PUT /_ilm/policy/test_ilm2

{

    "policy": {

        "phases": {

            "hot": {

                "actions": {

                    "rollover": {

                        "max_age": "30d",

                        "max_size": "50gb"

                    }

                }

            },

            "warm": {

                "min_age": "3d",

                "actions": {

                    "allocate": {

                        "require": {

                            "box_type": "warm"

                        },

                        "number_of_replicas": 0

                    },

                    "forcemerge": {

                        "max_num_segments": 1

                    },

                    "shrink": {

                        "number_of_shards": 1

                    }

                }

            },

            "cold": {

                "min_age": "7d",

                "actions": {

                    "allocate": {

                        "require": {

                            "box_type": "cold"

                        }

                    }

                }

            },

            "delete": {

                "min_age": "30d",

                "actions": {

                    "delete": {}

                }

            }

        }

    }

}

现在管理策略(Policy)已经有了,那么如何应用到索引(Index)上面呢?

方法为设定如下的索引配置:

  • index.lifecycle.name 设定 Policy 名称,比如上面的 test_ilm2
  • index.lifecycle.rollover_alias 如果使用了 Rollover,那么还需要指定该别名

在开始之前,还需要最后一步重要的操作,那就是激活你的策略,创建一个以000001结尾的索引,之后回滚的索引会在这个数字上递增;由于别名操作索引时,同一时刻只能有一个索引被写,所以还需要设置 is_write_index = true 。

PUT /datastream-000001 // 索引名

{

  "aliases": {

    "datastream": {

      "is_write_index": true

    }

  }

}

4 实战 (仅供参考)

4.1 目标

现在需要收集 nginx 日志,只需保留最近30天的日志,但要保证最近7天的日志有良好的查询性能,搜索响应时间在 100ms 以内。

为了让大家可以快速看到效果,下面实际操作的时候会将 30天、7天 替换为 40秒、20秒。

4.2 ES 集群架构

这里我们简单介绍下这次实战所用 ES 集群的构成。该 ES 集群一共有 3个节点组成,每个节点都有名为 box_type 的属性,如下所示:

GET _cat/nodeattrs?s=attr

es01_hot  172.24.0.5 172.24.0.5 box_type          hot

es02_warm 172.24.0.4 172.24.0.4 box_type          warm

es03_cold 172.24.0.3 172.24.0.3 box_type          cold

由上可见我们有 1 个 hot 节点、1 个 warm 节点、1 个 cold 节点,分别用于对应 ILM 的阶段,即 Hot 阶段的索引都位于 hot 上,Warm 阶段的索引都位于 warm 上,Cold 阶段的索引都位于 cold 上。

4.3 创建 ILM Policy

根据要求,我们的 Policy 设定如下:

  • 索引名以 nginx_logs 为前缀,且以每10个文档做一次 Rollover
  • Rollover 后 5 秒转为 Warm 阶段
  • Rollover 后 20 秒转为 Cold 阶段
  • Rollover 后 40 秒删除

API 请求如下:

PUT /_ilm/policy/nginx_ilm_policy

{

  "policy": {

    "phases": {

      "hot": {

        "actions": {

          "rollover": {

            "max_docs": "10"

          }

        }

      },

      "warm": {

        "min_age": "5s",

        "actions": {

          "allocate": {

            "include": {

              "box_type": "warm"

            }

          }

        }

      },

      "cold": {

        "min_age": "20s",

        "actions": {

          "allocate": {

            "include": {

              "box_type": "cold"

            }

          }

        }

      },

      "delete": {

        "min_age": "40s",

        "actions": {

          "delete": {}

        }

      }

    }

  }

}

4.4 创建 Index Template

我们基于索引模板来创建所需的索引,如下所示:

PUT /_template/nginx_ilm_template

{

  "index_patterns": ["nginx_logs-*"],                 

  "settings": {

    "number_of_shards": 1,

    "number_of_replicas": 0,

    "index.lifecycle.name": "nginx_ilm_policy",      

    "index.lifecycle.rollover_alias": "nginx_logs",

    "index.routing.allocation.include.box_type": "hot"

  }

}

上述配置解释如下:

  • index.lifecycle.name 指明该索引应用的 ILM Policy
  • index.lifecycle.rollover_alias 指明在 Rollover 的时候使用的 alias
  • index.routing.allocation.include.box_type 指明新建的索引都分配在 hot 节点上

4.5 创建初始索引 Index

ILM 的第一个索引需要我们手动来创建,另外启动 Rollover 必须以数值类型结尾,比如 nginx_logs-000001。索引创建的 api 如下:

PUT nginx_logs-000001

{

  "aliases": {

    "nginx_logs": {

      "is_write_index":true

    }

  }

}

修改 ILM Polling Interval

ILM Service 会在后台轮询执行 Policy,默认间隔时间为 10 分钟,为了更快地看到效果,我们将其修改为 1 秒。

PUT _cluster/settings

{

  "persistent": {

    "indices.lifecycle.poll_interval":"1s"

  }

}

4.6 开始吧

一切准备就绪,我们开始吧!

首先执行下面的新建文档操作 10 次。

POST nginx_logs/_doc

{

  "name":"abbc"

}

5 kibana配置

可在kibana上点击"management"=>"index_lifecycle_management"=>"create policy"进行配置