Elasticsearch索引生命周期管理

本文介绍了Elasticsearch的索引生命周期管理ILM,包括其四个阶段(hot、warm、cold、delete),如何配置策略以管理不同阶段的索引操作,如滚动更新、删除等。还展示了如何在实际环境中应用和管理ILM以优化资源利用和性能。

前言

在ELK架构中,使用Elasticsearch来存储系统日志时,有如下典型的特点:

  • 数据量非常大
  • 经常访问新增的数据,随着时间的推移,数据的价值也在逐渐降低

随着数据量的增大,Elasticsearch创建索引的数量也在不断增长,这个时候就需要对 索引 进行一定策略的维护管理甚至是删除清理,否则随着数据量越来越多除了浪费磁盘与内存空间之外,还会严重影响 Elasticsearch 的性能。

为了对Elasticsearch中的索引进行更好的管理,Elasticsearch在6.6版本中引入了Index Lifecycle Management(索引生命周期管理),简称ILM,并在 6.7 版正式推出该功能。

本篇示例使用的环境:

  • Elasticsearch版本7.2.0
  • Kibana版本7.2.0
  • Elasticsearch节点个数:2

一、概述

索引生命周期管理ILM是指Elasticsearch对索引进行设置、创建、打开、关闭、删除的全生命周期管理的过程。

1.1 阶段介绍

将索引生命周期分为4个阶段:hot、warm、cold、delete。

其中hot阶段主要负责对索引进行滚动更新操作,warm、cold、delete阶段主要负责进一步处理滚动更新后的数据。

19.Elasticsearch索引生命周期管理01.png

具体介绍

阶段介绍
hot热数据阶段,主要处理时序数据的实时写入。可根据索引的文档数、大小、时长决定是否调用rollover API来滚动更新索引。
warm冷数据阶段,索引不再写入,主要用来提供查询。
cold冷数据阶段,索引不再更新,查询很少,查询速度会变慢。
delete删除数据阶段,索引将被删除。
添加生命周期管理方式
  • 通过索引模板添加生命周期管理策略

    将策略应用到整个别名覆盖的索引下

  • 为单个索引添加生命周期管理策略

    只能覆盖当前索引,新滚动的索引不再受策略影响。

阶段动作
阶段/action优先级设置取消跟随滚动索引分片分配只读强制段合并收缩索引冻结索引删除
hot××××××
warm×××
cold×××××
delete××××××××
1.2 常用Action
参数说明
rollover当写入索引达到了一定的大小,文档数量或创建时间时,rollover可创建一个新的写入索引,将旧的写入索引的别名去掉,并把别名赋给新的写入索引。所以便可以通过切换别名控制写入的索引是谁。它可用于Hot阶段。
shrink减少一个索引的主分片数,可用于Warm阶段。需要注意的是当shink完成后索引名会由原来的<origin-index-name>变为shrink-<origin-index-name>.
force merge可触发一个索引分片的segment merge,同时释放掉被删除文档的占用空间。用于Warm阶段。
allocate可指定一个索引的副本数,用于warm, cold阶段。
delete删除索引,用户delete阶段

二、配置生命周期管理

2.1 需求

索引策略如下:

  • 初始创建索引包含一个主分片和一个副本分片
  • 刚创建的索引默认在hot阶段
  • 当文档数量达到5个进行滚动更新,旧索引从hot阶段进入到warm阶段
  • 在warm阶段,删除掉索引副本分片,只留下主分片
  • 在10秒后索引从warm阶段进入到delete阶段,并在20秒后将索引删除。
2.2 步骤
  • 第一步:配置lifecycle检测时间;
  • 第二步:创建一个索引策略;
  • 第三步:创建一个索引模版,指定使用的索引策略;
  • 第四步:创建一个符合上述索引模版的索引;
  • 第五步:向索引中写入数据,使索引触发滚动更新策略;
  • 第六步:查看索引所处阶段
2.3 实现

(1)配置lifecycle检测时间



PUT /_cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval": "1s" 
  }
}

默认为十分钟,为了测试看效果,改为1秒钟,如果在生产环境中则不需要进行修改。

(2)创建一个索引策略

# /_ilm/policy为固定格式,leefs_ilm_policy为创建索引策略名称
PUT /_ilm/policy/leefs_ilm_policy
{
  # policy:配置策略
  "policy": {
    # phases:阶段配置
    "phases": {
      "hot": {
        "actions": {
    	  # rollover:滚动更新
          "rollover": {
    		# max_docs:文档数量最大为5执行操作
            "max_docs": "5"
          }
        }
      },
      "warm": {
        # min_age:该阶段最小停留时长
        "min_age": "10s",
        "actions": {
          # allocate:指定一个索引的副本数
          "allocate": {
          	# number_of_replicas:进行索引副本数量设置
            "number_of_replicas": 0
          }
        }
      },
      "delete": {
        "min_age": "20s",
        "actions": {
          # delete:删除索引,如果没有该方法即使到删除阶段也不执行删除操作
          "delete": {}
        }
      }
    }
  }
}

说明

在创建索引策略时,不是每个阶段都是必须的,除了hot阶段,其他阶段都可以根据需求进行省略。

包括滚动更新(rollover)在内的所有actions中的方法都可以根据需求进行省略。

(3)创建一个索引模版,指定使用的索引策略

# leefs_ilm_template:索引模版名称
PUT _template/leefs_ilm_template
{
  # 模版匹配的索引名以"leefs_logs-"开头
  "index_patterns": ["leefs_logs-*"],                 
  "settings": {
    # number_of_shard:设置主分片数量
    "number_of_shards": 1,
    # number_of_replicas:设置副本分片数量
    "number_of_replicas": 1,
    # 通过索引策略名称指定模版所匹配的索引策略
    "index.lifecycle.name": "leefs_ilm_policy", 
    # 索引rollover后切换的索引别名为leefs_logs
    "index.lifecycle.rollover_alias": "leefs_logs"
  }
}

(4)创建一个符合上述索引模版的索引

# 清空之前索引
DELETE leefs_logs*

# 创建第一个索引
PUT leefs_logs-000001
{
  "aliases": {
    //设置索引别名为leefs_logs的索引
    "leefs_logs": {
      //允许索引被写入数据
      "is_write_index":true
    }
  }
}

(5)向索引中写入数据,使索引触发滚动更新策略

# refresh写入后更新
POST leefs_logs/_doc?refresh
{
  "name":"llc"
}

上方命名执行5次,使其触发滚动更新策略。

(6)查看索引所处阶段

# 查询索引名称以leefs_logs-开头的索引信息
GET leefs_logs-*/_ilm/explain

查询结果

19.Elasticsearch索引生命周期管理02.jpg


json

复制代码

# 查询索引别名 GET _alias/

19.Elasticsearch索引生命周期管理03.jpg

三、更新策略

  1. 如果没有index应用这份策略,那么我们可以直接更新该策略。
  2. 如果有index应用了这份策略,那么当前正在执行的阶段不会同步修改,当当前阶段结束后,会进入新版本策略的下个阶段。
  3. 如果更换了策略,当前正在执行的阶段不会变化,在结束当前阶段后,将会由新的策略管理下一个生命周期。

四、启动和停止索引生命周期管理

ILM默认是开启状态。

(1)查看ILM的当前运行状态

GET  _ilm/status

执行结果

{
  "operation_mode" : "RUNNING"
}

ILM的操作模式

阶段/action优先级设置
正在运行正常运行,所有策略均正常执行
停止ILM已收到停止请求,但仍在处理某些策略
已停止这表示没有执行任何策略的状态

(2)停止ILM

POST  _ilm/stop

停止后,所有其他政策措施都将停止。这将反映在状态API中

{
    "operation_mode": "STOPPING"
}

然后,ILM服务将异步地将所有策略运行到可以安全停止的位置。在ILM确认它是安全的之后,它将移至该STOPPED模式

{
    "operation_mode": "STOPPED"
}

(3)启动ILM

POST  _ilm/start

启动后查询状态

{
  "operation_mode": "RUNNING"
}

<think>好的,用户现在问的是关于Elasticsearch索引生命周期管理的详解。之前他们问过跨数据中心复制,现在转向了索引管理,看来他们可能是在搭建或者维护一个ES集群,需要优化数据的存储和运维。 首先,我需要回忆索引生命周期管理(ILM)的核心概念。ILM主要是帮助用户自动化管理索引生命周期阶段,比如热、温、冷、删除四个阶段。用户可能希望了解如何设置策略来自动转移索引,节省存储成本,同时保持性能。 接下来,用户可能的需求是什么?他们可能遇到了索引数量过多,手动管理麻烦的问题,或者存储成本上升,想要优化数据存储。也有可能是在设计系统时需要预先考虑数据的自动化管理,比如日志类数据的时间序列场景。 需要详细解释ILM的各个阶段,每个阶段的作用,以及如何配置策略。还要提到ILM的工作原理,比如如何基于年龄、文档数、大小等条件触发阶段转移。此外,注意事项也很重要,比如版本兼容性,权限设置,监控等。 用户可能还想知道ILM的实际应用场景,比如日志管理、指标数据、合规性归档等。需要给出具体例子,比如日志每天创建一个索引,七天后转为温阶段,降低副本数,三十天后转为冷阶段并迁移到廉价存储,六十天后删除。 另外,需要注意与之前的问题(跨数据中心复制)可能的结合点,比如在跨集群复制时如何应用ILM策略,但可能用户暂时不需要这个,所以先专注于ILM本身的详解。 要确保回答结构清晰,分步骤说明,可能包括定义、阶段详解、配置步骤、应用场景、注意事项等部分。同时,按照系统级指令,数学表达式和代码块要正确使用格式,比如JSON配置示例要用代码块,而阶段转移的条件可能需要用行内公式,比如索引大小超过$50GB$时触发滚动更新。 最后,检查是否有遗漏的重要点,比如ILM的策略API,如何测试和监控策略效果,以及常见问题解决方法,比如阶段执行顺序,条件优先级等。确保回答既全面又易懂,帮助用户实际应用ILM到他们的项目中。</think>以下是Elasticsearch(ES)**索引生命周期管理(Index Lifecycle Management, ILM)**的详细解析,分步骤说明其核心机制与实践: --- ### 一、什么是索引生命周期管理(ILM)? - **定义**:通过预定义策略(Policy),自动化管理索引从创建到删除的全生命周期。 - **核心目标**: - **资源优化**:根据数据价值动态调整存储方式(如热节点→冷节点)。 - **成本控制**:淘汰旧数据,减少冗余存储开销。 - **运维简化**:避免手动管理索引的繁琐操作。 --- ### 二、ILM的四个生命周期阶段 #### 1. **热阶段(Hot)** - **用途**:处理高频读写操作。 - **关键操作**: - **滚动更新(Rollover)**:当索引达到阈值(如文档数、时间、大小)时自动创建新索引。 - **优先级设置**:确保热索引优先分配资源。 - **示例条件**:索引年龄 < 3天 或 文档数 > $10^6$。 #### 2. **温阶段(Warm)** - **用途**:低频访问,但仍需快速查询。 - **关键操作**: - **缩减副本(Shrink)**:减少副本数(如从3副本降为1副本)。 - **强制合并(Force Merge)**:合并分段以提升查询效率。 - **节点迁移**:将索引迁移到温节点(低成本硬件)。 #### 3. **冷阶段(Cold)** - **用途**:极少访问,长期存档。 - **关键操作**: - **只读模式**:禁止写入,保留查询能力。 - **迁移到冷存储**:使用高压缩率存储(如冻结层)。 #### 4. **删除阶段(Delete)** - **用途**:清理过期数据。 - **关键操作**: - **安全删除**:永久移除索引及数据。 - **条件触发**:基于索引年龄(如保留90天后删除)。 --- ### 三、ILM的工作原理 #### 1. **策略(Policy)定义** - **阶段顺序**:必须按`Hot → Warm → Cold → Delete`顺序配置。 - **触发条件**:基于索引年龄、文档数、大小等阈值。 - **示例策略**: ```json PUT _ilm/policy/logs_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_size": "50GB", "max_age": "7d" } } }, "delete": { "min_age": "30d", "actions": { "delete": {} } } } } } ``` #### 2. **索引策略绑定** - **自动关联**:通过索引模板指定默认策略。 - **手动关联**: ```json PUT logs-2023-10-01/_settings { "index.lifecycle.name": "logs_policy" } ``` #### 3. **执行引擎** - **ILM Service**:后台服务定期(默认10分钟)检查索引状态。 - **状态机**:根据策略推进索引生命周期阶段。 --- ### 四、ILM配置步骤示例 #### 1. 创建生命周期策略 ```json PUT _ilm/policy/my_ilm_policy { "policy": { "phases": { "hot": { "actions": { "rollover": { "max_age": "7d", "max_docs": 1000000 } } }, "warm": { "min_age": "7d", "actions": { "shrink": { "number_of_shards": 1 } } }, "delete": { "min_age": "30d", "actions": { "delete": {} } } } } } ``` #### 2. 创建索引模板并关联策略 ```json PUT _index_template/logs_template { "index_patterns": ["logs-*"], "template": { "settings": { "index.lifecycle.name": "my_ilm_policy", "index.lifecycle.rollover_alias": "logs" } } } ``` --- ### 五、ILM核心应用场景 1. **日志管理**(如ELK Stack): - 按天滚动生成索引,自动归档/删除旧日志。 2. **时序数据**(如指标监控): - 热阶段存储最新数据,冷阶段存档历史数据。 3. **合规性要求**: - 确保数据保留期限符合法规(如GDPR)。 --- ### 六、注意事项 1. **版本兼容性**: - ILM功能需ES 6.6+版本,完整功能支持需7.0+。 2. **权限控制**: - 使用Kibana或API配置时,需`manage_ilm`权限。 3. **监控与调优**: - 通过`GET _ilm/status`检查服务状态。 - 通过`GET logs-*/_ilm/explain`查看索引执行详情。 4. **冷阶段依赖**: - 若使用冻结层(Frozen Tier),需配置冷节点和搜索快照(Searchable Snapshots)。 --- ### 七、ILM与跨集群复制(CCR)的协作 - **场景**:将冷数据复制到远程集群归档。 - **配置方式**: 1. 主集群使用ILM管理热/温阶段。 2. 通过CCR将冷阶段索引复制到备份集群。 --- 通过ILM,Elasticsearch实现了数据存储的智能化管理,显著降低了运维复杂度与成本。实际部署时需结合业务需求设计策略阈值,并持续监控执行效果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值