前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一步一步理解ES中的索引管理逻辑,从手动_rollover到ILM

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

原创
作者头像
周银辉
发布2024-07-19 18:13:59
550
发布2024-07-19 18:13:59
举报
文章被收录于专栏:ElasticSearch

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

在早期的版本中,索引中的数据增长到一定量之后,如何实现无感切换,答案是通过定时任务和_rollover api

实验如下:

代码语言:txt
复制
###创建索引和别名,主分片为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": {}
    }
  }
}
可以通过写一个定时器,定时的去调用_rollover api实现日志索引的管理,满足条件手动切换。

二、索引主分片的合并

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

代码语言:txt
复制
PUT my_log-000001/_settings
{
  "index.blocks.write":"true"
}
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
复制
##如何实现索引的force_merge
POST my_log_00001_shrink/_forcemerge
##如何实现索引的副本数为0
PUT my_log_00001_shrink/_settings
{
  "number_of_replicas": 0
}

总结:

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

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

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

实验一下:

1、清理旧索引,创建ilm

代码语言:txt
复制
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
复制
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
复制
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
复制
我们可以通过索引模板,每次生成新的索引时,自动关联相关字段,别名,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
两个索引已经合并了。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、如何解决ES中索引数据不断增长的问题?
  • 二、索引主分片的合并
  • 三、索引segment的合并,清除副本
  • 总结:
  • 四、ILM索引生命周期的引入
    • 1、清理旧索引,创建ilm
      • 2、创建索引,关联ilm
        • 3、测试索引自动切换
          • 4、索引模板闪亮登场
          相关产品与服务
          Elasticsearch Service
          腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档