首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一步一步理解ES中的索引管理逻辑,从手动_rollover到ILM

一步一步理解ES中的索引管理逻辑,从手动_rollover到ILM

原创
作者头像
周银辉
修改于 2025-02-12 23:57:30
修改于 2025-02-12 23:57:30
4800
举报
文章被收录于专栏:ElasticSearchElasticSearch

一、如何解决ES中索引数据不断增长的问题?

在早期的版本中,索引中的数据增长到一定量之后,如何实现无感切换,答案是通过定时任务和_rollover api,注意_rollover api只能应用于别名,并且应用切换条件。

实验如下:

代码语言:txt
AI代码解释
复制
###创建索引和别名,主分片为5
PUT my_log-000001
{
  "settings": {
    "number_of_shards": 5
  }, 
  "aliases": {
    "my_log": {}
  }
}
###连续插入4条件数据
POST my_log/_doc
{
  "msg":"hello4"
}
###查看下数据和别名指向的索引
GET my_log/_search
GET _alias/my_log
数据会一直存在my_log-000001中
###通过调用_rollover api进行数据切换
POST my_log/_rollover
{
  "conditions": {
    "max_docs": 3,
    "max_age": "7d",
    "max_size": "5gb"
  }
}

GET _alias/my_log
输出结果
{
  "my_log-000002": {
    "aliases": {
      "my_log": {}
    }
  }
}
至此可以通过写一个定时器,定时的去调用my_log/_rollover api实现日志索引的管理,满足条件手动切换。

二、索引主分片的合并

接着上面的话题,别名my_log已经指向新的索引了my_log-000002,那旧的索引my_log-000001,该如何处理呢,可以把多个主分片合并以节省资源,因为他已经成为历史索引了,合并索引前,有几个需要注意的点:

  • 将副本设置为0
  • 将主分片集中一个节点上(如果没有上面设置为0的话,会不成功)
  • 将索引设置为只读

进行以上设置,最好按顺序来,或一起设置

代码语言:txt
AI代码解释
复制
PUT my_log-000001/_settings
{
  "number_of_replicas": 0,
  "index.routing.allocation.require._ip":"10.189.138.22",
  "index.blocks.write":"true"
}

进行索引shrink

代码语言:txt
AI代码解释
复制
POST my_log-000001/_shrink/my_log_00001_shrink
#原先是5个主分片,现在变成了1个主分片,通过以下方式查看
GET  my_log_00001_shrink
GET  my_log_00001_shrink/_search

三、索引segment的合并,清除副本

现在主分片已经合并了,还可以进一步优化:合并segment

代码语言:txt
AI代码解释
复制
##如何实现索引的force_merge
POST my_log_00001_shrink/_forcemerge?max_num_segments=1
max_num_segments只能作为api参数传递,不能做为body使用

总结:

经过以上手动一步步的处理,我们可以写成定时任务,通过程序脚本去调用,实现当前索引,单个索引不会太大,历史索引通过主分片合并,segment合并,副本清理,一步一步减少历史索引对集群资源的使用情况,有没有更好的办法呢。

四、ILM索引生命周期的引入

以上一系列手动的操作,我们可以通过定义一个ilm来解决,ES自动帮我们处理。

实验一下:

1、清理旧索引,创建ilm

代码语言:txt
AI代码解释
复制
DELETE my_log-000001
DELETE my_log-000002
PUT _ilm/policy/my_log_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0",
        "actions": {
          "set_priority": {
            "priority": 100
          },
          "rollover": {
            "max_age": "1m",
            "max_docs": 3,
            "max_size": "5gb"
          }
        }
      },
      "warm": {
        "min_age": "1m",
        "actions": {
          "set_priority": {
            "priority": 50
          },
          "allocate": {
            "number_of_replicas": 0
          },
          "forcemerge": {
            "max_num_segments": 1
          },
          "shrink": {
            "number_of_shards": 1
          }
        }
      }
    }
  }
}

2、创建索引,关联ilm

代码语言:txt
AI代码解释
复制
PUT my_log-000001
{
  "settings": {  
    "index.lifecycle.name":"my_log_policy",
    "index.lifecycle.rollover_alias":"my_log"
  }, 
  "aliases": {
    "my_log": {}
  }
}

查看索引是否已经关联到ilm
GET my_log-000001/_ilm/explain

3、测试索引自动切换

代码语言:txt
AI代码解释
复制
POST my_log/_doc
{
  "msg":"hello4"
}
连续4次插入数据,当插入第4条数据的时候,理论上索引会发生自动切换。
但是通过GET /_alias/my_log查看的时候,并没有指向my_log-000002索引。
原因是ilm在检查索引是否符合切换条件时,是10分钟检测一次,我们调整一下成5秒。
PUT _cluster/settings
{
  "transient": {
    "indices.lifecycle.poll_interval":"5s"
  }
}
过一分就会发现已经切换。

继续往里面插入数据5条
POST my_log/_doc
{
  "msg":"hello5"
}
等多久都不会再次切换,原因是什么呢?
通过查看新索引的ilm策略,根本没应用上,第一次我们创建索引时,是手动指定的,新索引没有关联到ilm,
所以不会发生切换,要如何解决呢?

4、索引模板闪亮登场

代码语言:txt
AI代码解释
复制
我们可以通过索引模板,每次生成新的索引时,自动关联相关字段,别名,ilm策略等,在新的8.X以上的版本,
同时引入了组件模板,使索引模板使用更灵活。
删除以上索引重来一遍
DELETE my_log-000001
DELETE my_log-000002
创建组件模板
PUT _component_template/componet_log_setting
{
  "template": {
    "settings": {
      "number_of_shards": 5
    }
  }
}

PUT _component_template/componet_log_mapping
{
  "template": {
    "mappings": {
      "properties": {
        "@timestamp":{
          "type": "date"
        },
        "msg":{
          "type": "text"
        }
      }
    }
  }
}

创建索引模板
PUT _index_template/log_template
{
  "index_patterns": [
    "my_log*"
  ],
  "template": {
    "settings": {
      "index.lifecycle.name": "my_log_policy",
      "index.lifecycle.rollover_alias": "my_log"
    }
  },
  "composed_of": [
    "componet_log_setting",
    "componet_log_mapping"
  ]
}

PUT my_log-000001
{
  "settings": {
   
    "index.lifecycle.name":"my_log_policy",
    "index.lifecycle.rollover_alias":"my_log"
  }, 
  "aliases": {
    "my_log": {}
  }
}

POST my_log/_doc
{
  "msg":"hello3"
}
连续插入10条记录,发现已经切换到3了
GET /_alias/my_log
返回结果
{
  "my_log-000003": {
    "aliases": {
      "my_log": {}
    }
  }
}

GET my_log-000001
GET my_log-000002
两个索引已经合并了。

五、实际操作案例

在现实的实际生产环境中,会存在的情况是,已经有索引很大了,对历史数据要清理,对新产生的数据应用索引策略,具体如何操作呢?

代码语言:txt
AI代码解释
复制
GET /_cat/nodeattrs
PUT my_index_test/_doc/1
{
  "message":"zhouyinhui1"
}

PUT my_index_test/_doc/2
{
  "message":"zhouyinhui2"
}
PUT my_index_test/_doc/3
{
  "message":"zhouyinhui3"
}
PUT my_index_test/_doc/4
{
  "message":"zhouyinhui4"
}

 
PUT /_ilm/policy/my_policy_test
{
  "policy": {
    "phases": {
      "warm": {
        "min_age": "1m",
        "actions": {
          "set_priority": {
            "priority": 50
          },
          "allocate": {
            "number_of_replicas": 0,
            "require": {
              "_ip": "10.189.138.33"
            }
          },
          "forcemerge": {
            "max_num_segments": 1
          }
        }
      }
    }
  }
}

GET /_cat/shards/my_index_test
GET /_cat/segments/my_index_test?v


PUT my_index_test/_settings
{
  "index.lifecycle.name":"my_policy_test"
}


PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.node_concurrent_recoveries": "2",
    "cluster.routing.allocation.cluster_concurrent_rebalance": "2",
    "indices.recovery.max_bytes_per_sec": "80mb"
  }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Elasticsearch ILM 索引生命周期管理 - ES 必备技能
假设有三个索引,my-index-001, my-index-002, my-index-003, 全部绑定到别名 my-alias, 并且 my-index-003 设置了 "is_write_index": true。这意味着对 my-alias 查询可以查询到以上所有三个索引的数据,而对 my-alias 写入数据只会写入到 my-index-003。
sir5kong
2023/07/20
1.1K0
Elasticsearch ILM实现索引全生命周期自动管理,解放双手
Elasticsearch Index Lifecycle Management(ILM)是Elasticsearch的一个功能,用于管理索引的生命周期,优化索引的性能和减少存储成本。ILM可以自动执行索引的各种操作,如创建、删除、滚动、缩小等,从而帮助用户轻松地管理索引的生命周期。ILM可以帮助用户减少手动干预的工作量,使其可以更好地专注于数据分析。
MCNU云原生
2023/03/17
1.2K0
Elasticsearch ILM实现索引全生命周期自动管理,解放双手
Elasticsearch——Rollover的正确使用姿势
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/ilm-rollover.html
WeldonWang
2023/03/09
3.2K0
干货 | Elasticsearch 索引生命周期管理 ILM 实战指南
关于人生,有人这么说:“人,生来一个人,死去一个人,所以,人生就是一个人生老病死的简称。”
铭毅天下
2021/06/25
7.5K1
干货 | Elasticsearch 索引生命周期管理 ILM 实战指南
腾讯云Elasticsearch索引生命周期管理原理及实践
本文将从三个方面介绍Elasticsearch索引生命周期管理的特性,首先会介绍ES索引生命周期管理的基本原理,其次会通过一个常见的日志场景来一步步配置索引生命周期管理,最后向大家介绍在日常的ES运维工作中遇到的关于索引生命周期管理常见的问题及解决方法。
吴容
2021/12/04
4.6K0
腾讯云Elasticsearch索引生命周期管理原理及实践
基于reindex并对索引进行rollover的两种方式
在Elasticsearch中,在针对一些大索引拆分成若干小索引,或者使用reindex迁移原有索引至扩展主分片后的索引时,我们想对目标索引进行rollover滚动切分时,可以使用以下两种方式。
空洞的盒子
2025/05/27
1440
Elasticsearch ILM 索引生命周期管理常见坑及避坑指南
之前的博文和视频都讲过 ILM 索引生命周期管理。但从近期的反馈和我自己的实战经验看,依然会有很多坑。
铭毅天下
2022/02/09
2.4K0
Elasticsearch ILM 索引生命周期管理常见坑及避坑指南
elasticsearch的ILM(Index Lifecycle Management)操作详解
Index lifecycle management(索引生命周期管理)是elasticsearch提供的一种用于自动管理索引的生命周期的功能。允许使用者定义索引的各个阶段,从创建至删除。并允许使用者在每个阶段定义索引需要执行的特定动作。这些动作包含索引创建,rollover滚动规则, shrink收缩索引,索引降冷,删除索引等动作。极大程度的降低了elasticsearch索引管理的成本。
空洞的盒子
2023/11/10
2.7K1
Elasticsearch 索引生命周期管理
在 Elasticsearch的日常管理中,有很多如系统日志,行为数据等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长索引的数量也会持续增长,然而这些场景基本上只有最近一段时间的数据有使用价值或者会被经常使用(热数据),而历史数据几乎没有作用或者很少会被使用(冷数据),这个时候就需要对索引进行一定策略的维护管理甚至是删除清理,否则随着数据量越来越多除了浪费磁盘与内存空间之外,还会严重影响 Elasticsearch 的性能。
Se7en258
2021/05/18
8610
Elasticsearch 索引生命周期管理
【ES三周年】结合ilm的方式实现滚动索引
ilm: 索引生命周期管理,把索引分为了Hot、Warm、Cold、delete阶段。
勤奋树苗
2023/02/07
1.4K0
Elastic Stack 实战教程 2:ILM 索引生命周期管理
索引生命周期管理 (Index Lifecycle Management, ILM) 是在 Elasticsearch 在 6.6(公测版)首次引入并在 6.7 版正式推出的一项功能。ILM 旨在帮助用户更方便地管理时序数据(例如日志,指标等)。时序数据有如下几个典型的特点:
Se7en258
2023/02/26
7230
Elastic Stack 实战教程 2:ILM 索引生命周期管理
深入了解Elasticsearch索引生命周期管理
ILM是Elasticsearch提供的一种机制,允许用户自动化地管理索引在其整个生命周期内的各个阶段。这些阶段通常包括Hot、Warm、Cold和Delete。每个阶段都有其特定的优化目标和操作,如存储类型、副本数、段合并等。
公众号:码到三十五
2024/03/19
3680
深入了解Elasticsearch索引生命周期管理
Elasticsearch 可搜索快照技术原理及最佳实践
作者:吴容——腾讯云 Elasticsearch 高级开发工程师 Elasticsearch于7.10版本推出可搜索快照功能,但是7.10版本的可搜索快照技术还不够成熟,随着7.14版本的发布,可搜索快照技术才真正能够大规模用于生产实践中。本文将基于ES 7.14.2版本,继续从原理和实践两个角度向大家介绍可搜索快照技术。 可搜索快照特性向我们展现一种能够直接搜索快照中数据的魔力,通常我们会将快照备份到非常廉价的存储介质中,如腾讯云对象存储COS中。这样我们就可以将集群的使用成本降到最低。 一、可搜索快照
腾讯云大数据
2021/12/28
7290
ElasticSearch ILM实践
在ES没有提供ILM功能以前,我们的索引生命周期管理一般是自己写脚本或者curator工具来管理的。
保持热爱奔赴山海
2022/05/15
6460
ElasticSearch ILM实践
这么简单的ES索引生命周期管理,不了解一下吗~
对于日志或指标(metric)类时序性强的ES索引,因为数据量大,并且写入和查询大多都是近期时间内的数据。我们可以采用hot-warm-cold架构将索引数据切分成hot/warm/cold的索引。hot索引负责最新数据的读写,可使用内存存储;warm索引负责较旧数据的读取,可使用内存或SSD存储;cold索引很少被读取,可使用大容量磁盘存储。随着时间的推移,数据不断从hot索引->warm索引->cold索引迁移。针对不同阶段的索引我们还可以调整索引的主分片数,副本数,单分片的segment数等等,更好的利用机器资源。
Jared.Tan
2020/06/17
2.1K0
这么简单的ES索引生命周期管理,不了解一下吗~
datastream操作步骤
周银辉
2024/09/26
1510
Elasticsearch索引生命周期管理方案
在 Elasticsearch 的日常中,有很多如存储 「系统日志」、「行为数据」等方面的应用场景,这些场景的特点是数据量非常大,并且随着时间的增长 索引 的数量也会持续增长,然而这些场景基本上只有最近一段时间的数据有使用价值或者会被经常使用(热数据),而历史数据几乎没有作用或者很少会被使用(冷数据),这个时候就需要对 索引 进行一定策略的维护管理甚至是删除清理,否则随着数据量越来越多除了浪费磁盘与内存空间之外,还会严重影响 Elasticsearch 的性能;
陶陶技术笔记
2021/01/12
1K0
Elasticsearch索引生命周期管理方案
Elastic ILM 索引生命周期管理最佳实践
引入索引生命周期管理的一个最重要的目的就是对大量时序数据在es读写操作的性能优化,对于日志或指标(metric)类时序性强的ES索引,因为数据量大,并且写入和查询大多都是近期时间内的数据。可以采用hot-warm-cold架构将索引数据切分成hot/warm/cold的索引。hot阶段索引负责最新数据的读写,可使用SSD存储;warm阶段索引负责较旧数据的读取,可使用高性能磁盘存储;cold阶段索引很少被读取,可使用大容量磁盘存储。delete阶段索引将被被删除。随着时间的推移,索引数据不断从hot阶段->warm阶段->cold阶段>delete阶段迁移。针对不同阶段的索引我们还可以调整索引的主分片数,副本数,单分片的segment数等等,更好的利用机器资源。
Kevin song
2021/08/23
5.4K0
Elastic  ILM  索引生命周期管理最佳实践
Elasticsearch 索引容量管理实践
Elasticsearch是目前大数据领域最热门的技术栈之一,腾讯云 Elasticsearch Service(ES)是基于开源搜索引擎 Elasticsearch 打造的高可用、可伸缩的云端全托管 Elasticsearch 服务,完善的高可用解决方案,让业务可以放心的把重要数据存储到腾讯云 ES 中。
腾讯云大数据
2021/01/07
1.1K0
Elasticsearch 索引容量管理实践
Elasticsearch探索:Index lifecycle policy
如果你要处理时间序列数据,则不想将所有内容连续转储到单个索引中。 取而代之的是,您可以定期将数据滚动到新索引,以防止数据过大而又缓慢又昂贵。 随着索引的老化和查询频率的降低,您可能会将其转移到价格较低的硬件上,并减少分片和副本的数量。
HLee
2021/01/12
4.4K0
Elasticsearch探索:Index lifecycle policy
推荐阅读
相关推荐
Elasticsearch ILM 索引生命周期管理 - ES 必备技能
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档