【Elasticsearch】ILM(Index Lifecycle Management)策略详解

ILM(Index Lifecycle Management)策略详解

  • [1.什么是 ILM 策略?](#1.什么是 ILM 策略?)
  • [2.ILM 解决的核心业务问题](#2.ILM 解决的核心业务问题)
  • [3.ILM 生命周期阶段](#3.ILM 生命周期阶段)
    • [3.1 Hot(热阶段)](#3.1 Hot(热阶段))
    • [3.2 Warm(温阶段)](#3.2 Warm(温阶段))
    • [3.3 Cold(冷阶段)](#3.3 Cold(冷阶段))
    • [3.4 Delete(删除阶段)](#3.4 Delete(删除阶段))
  • [4.如何创建 ILM 策略](#4.如何创建 ILM 策略)
    • [4.1 基本 ILM 策略示例](#4.1 基本 ILM 策略示例)
  • [5.ILM 核心操作详解](#5.ILM 核心操作详解)
    • [5.1 Rollover(滚动更新)](#5.1 Rollover(滚动更新))
    • [5.2 Shrink(收缩索引)](#5.2 Shrink(收缩索引))
    • [5.3 Force Merge(强制合并段)](#5.3 Force Merge(强制合并段))
    • [5.4 Freeze(冻结索引)](#5.4 Freeze(冻结索引))
  • 6.实际应用案例
    • [案例 1:日志管理系统](#案例 1:日志管理系统)
    • [案例 2:电商订单数据](#案例 2:电商订单数据)
  • 7.使用注意事项
    • [7.1 节点属性配置](#7.1 节点属性配置)
    • [7.2 监控 ILM 执行](#7.2 监控 ILM 执行)
    • [7.3 常见问题处理](#7.3 常见问题处理)
    • [7.4 性能考虑](#7.4 性能考虑)
    • [7.5 与索引模板结合](#7.5 与索引模板结合)
    • [7.6 测试策略](#7.6 测试策略)
  • 8.最佳实践
    • [8.1 合理设置阶段过渡时间](#8.1 合理设置阶段过渡时间)
    • [8.2 优先级设置](#8.2 优先级设置)
    • [8.3 结合快照备份](#8.3 结合快照备份)
    • [8.4 容量规划](#8.4 容量规划)
    • [8.5 版本兼容性](#8.5 版本兼容性)

1.什么是 ILM 策略?

ILMIndex Lifecycle Management索引生命周期管理)是 Elasticsearch 提供的一种自动化管理索引生命周期的机制。它允许用户根据预先定义的策略,自动执行索引的 滚动更新rollover)、分片分配冻结和删除 等操作,无需人工干预。

2.ILM 解决的核心业务问题

  • 自动化索引管理:减少人工维护成本。
  • 存储优化:自动将旧数据迁移到成本更低的存储层。
  • 性能优化:根据数据热度自动调整资源配置。
  • 数据保留合规:自动清理过期数据。
  • 资源利用率提升:合理分配集群资源。

3.ILM 生命周期阶段

ILM 策略包含四个可配置的阶段。

3.1 Hot(热阶段)

  • 索引正在被频繁写入和查询。
  • 需要高性能资源配置。
  • 通常配置滚动更新(rollover)条件。

3.2 Warm(温阶段)

  • 索引不再被写入,但仍被频繁查询。
  • 可以降低资源配置。
  • 可执行分片合并(forcemerge)、只读设置等。

3.3 Cold(冷阶段)

  • 索引很少被查询,但需要保留。
  • 可以转移到更经济的存储。
  • 可冻结索引(freeze)以减少资源占用。

3.4 Delete(删除阶段)

  • 索引达到保留期限。
  • 自动删除释放空间。

4.如何创建 ILM 策略

4.1 基本 ILM 策略示例

bash 复制代码
PUT /_ilm/policy/logs_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "50GB",
            "max_age": "30d",
            "max_docs": 10000000
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "7d",
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          },
          "allocate": {
            "number_of_replicas": 1,
            "require": {
              "data": "warm"
            }
          },
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "30d",
        "actions": {
          "allocate": {
            "require": {
              "data": "cold"
            }
          },
          "freeze": {},
          "set_priority": {
            "priority": 0
          }
        }
      },
      "delete": {
        "min_age": "90d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

5.ILM 核心操作详解

5.1 Rollover(滚动更新)

作用:当索引达到指定条件时自动创建新索引。

常见触发条件

  • max_age:自索引创建后的最长时间。
  • max_docs:索引包含的最大文档数。
  • max_size:索引的最大主分片大小。

使用示例

bash 复制代码
PUT /_ilm/policy/my_rollover_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_age": "7d",
            "max_size": "50GB"
          }
        }
      }
    }
  }
}

5.2 Shrink(收缩索引)

作用:减少主分片数量。

适用场景

  • 索引不再写入后。
  • 减少分片数以节省资源。

示例配置

json 复制代码
"warm": {
  "actions": {
    "shrink": {
      "number_of_shards": 1
    }
  }
}

5.3 Force Merge(强制合并段)

作用:合并分段以减少资源占用和提高查询性能.

示例配置

json 复制代码
"warm": {
  "actions": {
    "forcemerge": {
      "max_num_segments": 1
    }
  }
}

5.4 Freeze(冻结索引)

作用:将索引设为只读并减少内存占用。

示例配置

json 复制代码
"cold": {
  "actions": {
    "freeze": {}
  }
}

6.实际应用案例

案例 1:日志管理系统

需求

  • 热数据保留 7 7 7 天,高性能存储。
  • 温数据保留 30 30 30 天,标准存储。
  • 冷数据保留 90 90 90 天,低成本存储。
  • 最终自动删除。

ILM 策略

bash 复制代码
PUT /_ilm/policy/logs_management_policy_v2
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",           # 明确从索引创建开始
        "actions": {
          "rollover": {
            "max_age": "7d",        # 更合理的rollover周期
            "max_size": "50GB",
            "max_docs": 10000000
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "7d",            # 从索引创建后7天进入warm
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          },
          "allocate": {
            "number_of_replicas": 1,
            "require": {
              "data": "warm"        # 明确要求warm节点
            }
          },
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "30d",           # 从创建后30天进入cold
        "actions": {
          "allocate": {
            "require": {
              "data": "cold"       # 明确要求cold节点
            }
          },
          "freeze": {},             # 冻结索引节省资源
          "set_priority": {
            "priority": 0
          }
        }
      },
      "delete": {
        "min_age": "90d",           # 从创建后90天删除
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true  # 可选:删除前检查快照
          }
        }
      }
    }
  }
}

配套的索引模板示例

bash 复制代码
PUT /_index_template/logs_template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 1,
      "index.lifecycle.name": "logs_management_policy_v2",
      "index.lifecycle.rollover_alias": "logs"
    },
    "mappings": {
      "properties": {
        "@timestamp": { "type": "date" },
        "log_level": { "type": "keyword" },
        "message": { "type": "text" }
      }
    }
  }
}

案例 2:电商订单数据

需求

  • 热阶段:处理当前订单(高优先级)。
  • 温阶段:近期订单可查询(优化存储)。
  • 冷阶段:归档订单(低成本存储)。
  • 3 3 3 年后自动删除。

ILM 策略

bash 复制代码
PUT /_ilm/policy/orders_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_age": "7d"
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "30d",
        "actions": {
          "allocate": {
            "require": {
              "data": "warm"
            }
          }
        }
      },
      "cold": {
        "min_age": "365d",
        "actions": {
          "allocate": {
            "require": {
              "data": "cold"
            }
          }
        }
      },
      "delete": {
        "min_age": "1095d",  // 3年
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

7.使用注意事项

7.1 节点属性配置

  • 需要为温冷数据节点配置属性
bash 复制代码
# 在elasticsearch.yml中
node.attr.data: warm
# 或
node.attr.data: cold

7.2 监控 ILM 执行

bash 复制代码
GET /_ilm/status
GET /_ilm/policy/logs_policy
GET logs-*/_ilm/explain

7.3 常见问题处理

  • 策略不生效:检查 min_age 设置(默认是上次 rollover 后时间)。
  • 阶段卡住:使用 GET _ilm/explain 诊断。
  • 权限问题:确保用户有足够权限。

7.4 性能考虑

  • Force merge 操作资源消耗大,应在低峰期执行。
  • 避免过于频繁的 rollover(会产生大量小索引)。

7.5 与索引模板结合

bash 复制代码
PUT /_index_template/logs_template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "index.lifecycle.name": "logs_policy",
      "index.lifecycle.rollover_alias": "logs"
    }
  }
}

7.6 测试策略

bash 复制代码
POST /_ilm/move/logs-000001
{
  "current_step": {
    "phase": "new",
    "action": "complete",
    "name": "complete"
  },
  "next_step": {
    "phase": "hot",
    "action": "rollover",
    "name": "attempt-rollover"
  }
}

8.最佳实践

8.1 合理设置阶段过渡时间

  • 根据业务访问模式设置 min_age
  • 热 → 温:通常 1 − 7 1-7 1−7 天。
  • 温 → 冷: 7 − 30 7-30 7−30天。

8.2 优先级设置

json 复制代码
"set_priority": {
  "priority": 100  // 热阶段最高
}

8.3 结合快照备份

  • 重要数据在删除前应考虑备份。
  • 可以使用 SLM(Snapshot Lifecycle Management)。

8.4 容量规划

  • 根据 rollover 条件预估索引数量。
  • 监控各阶段存储使用情况。

8.5 版本兼容性

  • ILM 在 Elasticsearch 6.6 + 6.6+ 6.6+ 可用。
    1. x 7.x 7.x 后功能更完善。

通过合理配置 ILM 策略,可以实现索引的全生命周期自动化管理,显著降低运维成本,同时优化存储和查询性能。

相关推荐
IT成长日记5 小时前
Elasticsearch集群最大分片数设置详解:从问题到解决方案
大数据·elasticsearch·最大分片数·shards
risc1234566 小时前
【Elasticsearch】search_after不支持随机到哪一页,只能用于上一页或下一页的场景
elasticsearch
我的golang之路果然有问题6 小时前
快速了解GO+ElasticSearch
开发语言·经验分享·笔记·后端·elasticsearch·golang
Elastic 中国社区官方博客7 小时前
连接关键点:使用 ES|QL 联接实现更丰富的可观测性洞察
大数据·数据库·sql·elasticsearch·搜索引擎·全文检索
weixin_3077791310 小时前
使用Redis作为缓存优化ElasticSearch读写性能
redis·分布式·elasticsearch·缓存·架构
Xiao Ling.11 小时前
Elasticsearch
elasticsearch
Elasticsearch12 小时前
Elastic:在本地电脑中部署阿里 Qwen3 大模型及连接到 Elasticsearch
elasticsearch
xrz27717 小时前
JAVA获取ES连接并查询所有数据
java·elasticsearch
赵成默17 小时前
es 的字段类型(text和keyword)
elasticsearch·es
要努力啊啊啊19 小时前
Elasticsearch + Milvus 构建高效知识库问答系统《一》
人工智能·深度学习·elasticsearch·语言模型·milvus