Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python或将取代VBA,成为Excel官方脚本语言
程序员头条(ID:CoderTop) 报道 微软正考虑添加 Python 为官方的 Excel 脚本语言‍ 据外媒报道,微软正考虑添加 Python 为官方的一种 Excel 脚本语言,如果获得批准,Excel 用户将能够像目前使用 VBA 脚本一样,使用 Python 脚本与 Excel 文档、数据以及一些 Excel 核心函数进行交互。 目前为止,超过 3883 人赞同将 Python 集成到 Excel 中,成为 VBA 替代品,甚至像单元格函数 functions (=SUM(A1:A2)) 也
企鹅号小编
2018/02/08
1.5K0
Python或将取代VBA,成为Excel官方脚本语言
微软将要用Python取代VBA,成为Excel官方脚本语言!
据外媒报道,微软正考虑添加 Python 为官方的一种 Excel 脚本语言,如果获得批准,Excel 用户将能够像目前使用 VBA 脚本一样,使用 Python 脚本与 Excel 文档、数据以及一些 Excel 核心函数进行交互。 微软在上个月开启了一个针对 Excel 功能的话题,用以收集用户的反馈。随后有用户提议让 Python 成为 Excel 的一种脚本语言,不仅可以作为 VBA 的替代品,而且也可以作为字段函数(= SUM(A1:A2))的替代方案。该提议得到了众多用户的支持,得票支持率高
企鹅号小编
2018/02/08
3.9K0
微软将要用Python取代VBA,成为Excel官方脚本语言!
没有 Python,微软宣布 Excel 新增 JavaScript 支持
去年年底曾有外媒报道,由于社区用户的强烈要求,微软正考虑添加 Python 作为官方的一种 Excel 脚本语言。不过在昨天的 Build 2018 开发者大会上,微软没有透露有关 Python 支持的消息,而是宣布 Excel 新增 JavaScript 支持,这意味着开发者现在可以在 Excel 中运行本地的 JavaScript 自定义函数。
IT派
2018/08/10
7160
没有 Python,微软宣布 Excel 新增 JavaScript 支持
微软计划于2024年下半年逐步弃用VBScript
近日微软宣布将于 2024 年下半年开始弃用 VBScript,可能会先把该功能列为按需功能,后面会逐步删除。
FB客服
2024/05/28
3680
微软计划于2024年下半年逐步弃用VBScript
码农的瑞士军刀-脚本语言
首先声明,这里关于语言间的比较仅仅是为了说明问题。世界上没有一个开发语言有绝对的好坏,只有是否适合你当前的环境。 很多码农工作的非常辛苦,每天加班。一般情况,团队中成长最快的不是工作最辛苦的那一部分人,而是经常在思考怎么样可以“偷懒”的人。举个身边的例子,很多IDE环境都会有一个向导来生成新的project,工作多年只看到过一个人按照公司的常见项目类型定制过这个向导,多数人每个新project都会重复一遍同样的工作,生成一个标准的project,然后手工进行一系列的修改,而且觉得自然而然。 为什么会这样
叶锦鲤
2018/03/15
1.3K0
码农的瑞士军刀-脚本语言
Excel最新版官方支持Python,打工人的工具又强化了
如果要进行大规模数据处理,很多人都会告诉你可以使用 Python,它是当今最流行的编程语言之一。但在专用于处理数据的 Excel 上我们却一直只能用 VBA。这么多年,为什么官方还不出来改进一下?
机器之心
2023/09/08
5510
Excel最新版官方支持Python,打工人的工具又强化了
官方支持, Excel与Python终于真在一起了!
如果要进行大规模数据处理,很多人都会告诉你可以使用 Python,它是当今最流行的编程语言之一。但在专用于处理数据的 Excel 上我们却一直只能用 VBA。这么多年,为什么官方还不出来改进一下?
数据STUDIO
2023/09/04
8360
官方支持, Excel与Python终于真在一起了!
微软将在Windows中弃用VBScript,组态软件大军的VBS脚本该何去何从?
微软宣布弃用 VBScript并计划在未来的 Windows 版本中逐步淘汰该脚本语言。“VBScript 在从操作系统中移除之前,将作为按需功能提供。”默认情况下不会安装,但可以在必要时随时添加。
剑指工控
2023/10/25
6170
微软将在Windows中弃用VBScript,组态软件大军的VBS脚本该何去何从?
VBA
https://insights.stackoverflow.com/survey/2020#community-visiting-stack-overflow
量化投资与机器学习微信公众号
2020/06/21
2.6K0
Excel变天!微软把Python「塞」进去了,直接可搞机器学习
还和Anaconda达成了合作。各种常见Python库都能直接用,如Matplotlib、Seaborn等。
量子位
2023/09/08
2320
Excel变天!微软把Python「塞」进去了,直接可搞机器学习
Python之父加入3年,微软终于对Python下手:直接放进Excel!
Excel 中也可以用 Python 了! 就在昨晚,微软团队宣布了 Excel 的 Python 原生集成公测版。这意味着 Python 里的库、数据分析和可视化的能力都在桌面版的 Excel 中使用。
可以叫我才哥
2023/08/28
5800
Python之父加入3年,微软终于对Python下手:直接放进Excel!
《Python for Excel》读书笔记连载1:为什么为Excel选择Python?
本节为《Chapter 1:Why Python for Excel?》的第一部分,简单地讲解了Excel的历史,Excel编程的最佳实践,以及Excel为适应发展而作出的变化。 当你每天花费很多时间
fanjy
2021/11/26
6.1K0
Excel是世界上最危险的软件?
事情是这样的。摩根大通位于伦敦的首席投资办公室(Chief Investment Office)曾指派量化专家为其合成信贷组合构建一个新的在险价值模型。这种模型常用于市场风险测量和管理。2012年1月,这个新模型被摩根大通正式采用。
Ai学习的老章
2022/05/26
8180
Excel是世界上最危险的软件?
在Excel中调用Python脚本,实现数据自动化处理
说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5亿忠实用户,而作为网红语言的Python,也仅仅只有700万的开发人员。
天道Vax的时间宝藏
2022/05/11
4.5K0
在Excel中调用Python脚本,实现数据自动化处理
如何在Excel中调用Python脚本,实现数据自动化处理
这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作。
派大星的数据屋
2022/04/03
4.4K0
如何在Excel中调用Python脚本,实现数据自动化处理
《Python for Excel》读书笔记连载2:为什么为Excel选择Python?(续)
昨天发布第1篇连载后,受到了大家的热烈响应和鼓励。在此特别说明,这里发布的文章仅仅为学习笔记,略去了书中一些我认为无关紧要的文字,或者稍作修改,并且有些地方加上了我自己学习感悟,有兴趣的朋友可以对照原书研读。此外,如有侵权,留言告知,我会删除。
fanjy
2021/11/26
2.9K0
震惊!当Python遇到Excel后,将开启你的认知虫洞
本文主要讲Python与Excel的关系以及集成方案,Office家族的其他成员,如Word、PowerPoint与Excel拥有类似的功能,Python同样可以与Word、PowerPoint等Office成员结合,这些内容我以后会写文章讲解。
蒙娜丽宁
2020/06/03
3.9K0
ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史
在行文之前,反手就安利一下《浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战》。
周陆军
2020/03/14
8070
代替VBA!用Python轻松实现Excel编程(文末赠书)
面向Excel数据处理自动化的脚本编程,目前主要有VBA和Python两种语言可供选择。
小F
2023/01/03
6.5K0
代替VBA!用Python轻松实现Excel编程(文末赠书)
Python3和Go成最大赢家?一张主流编程语言变迁图讲清程序员迁移模式
导读:本文作者以自己作为程序员的角度出发,绘制了一个主流编程语言的变迁图,用以表示程序员在不同语言之间的切换路径。也就是当程序员开始使用编程语言 A,下一个最有可能切换过去的是哪一种编程语言。
IT阅读排行榜
2019/05/21
1.3K0
Python3和Go成最大赢家?一张主流编程语言变迁图讲清程序员迁移模式
推荐阅读
相关推荐
Python或将取代VBA,成为Excel官方脚本语言
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档