数据量增长,当前存在的问题:

  • 查询与写入越来越慢,聚合的速度慢的离谱,聚合的数据量大一些的话,可能出现超时失败,甚至OOM
  • 磁盘和内存资源以肉眼可见的速度快速消耗,甚至出现满载的情况
  • JVM频繁GC,fullGC的频率逐渐变高,甚至由于GC卡顿导致系统不可用的情况发生

阶段一方案:


  • 将索引按照某些条件由一个拆分成多个,配合模板和别名机制按条件生成索引
  • 在这种操作下,按照时间段的search就会被限制在一个或者几个index中,减少了数据扫描范围,查询以及聚合的效率都会提升,消耗的资源也变少了
  • 根据数据的特点,将数据分为冷热温数据,进行分级管理:热数据配备较好的硬件资源,如较大的内存和性能更好的CPU,SSD硬盘等;温数据和冷数据使用相对较差的硬件,这样在整个硬件消耗可控的情况下,尽量充分利用硬件资源
  • 对部分温冷数据执行 shrink 以及 forcemerge 操作,暂时不用的数据可以close甚至delete掉(delete的时候尽量使用delete index,不用使用delete_by_query,delete_by_query的效率以及资源占用实在太感人了)
  • 对数据定期做snapshot,保证数据的安全性

随着业务需求的推进以及集群数据的演进,index 越来越多,模板越来越多,各种 elasticsearch 的需求也越来越多,随之而来的就是维护的脚本越来越多,运维压力增大

操作解释:

1、Open / Close Index API

  • 索引关闭后,对集群的相关开销基本降低为 0
  • 但是无法被读取和搜索
  • 当需要的时候,可以重新打开

  2、Shrink Index:可以将索引的主分片数收缩到较小的值

  • ES 5.x 后推出的一个新功能,使用场景

    • 索引保存的数据量比较小,需要重新设定主分片数
    • 索引从 Hot 移动到 Warm 后,需要降低主分片数
  • 会使用和源索引相同的配置创建一个新的索引,仅仅降低主分片数
    • 源分片数必须是目标分片数的倍数。如果源分片数是素数,目标分片数只能为 1
    • 如果文件系统支持硬链接,会将 Segments 硬连接到目标索引,所以性能好
  • 完成后,可以删除源索引

  3、forcemerge: 对于历史不变的数据,通过对小的segment文件进行 merge ,提升性能

阶段二方案: curator + rollover


在这套方案中,rollover 负责索引的迭代管理,别名的管理;curator负责在上层对rollover command以及其他支持的command进行管理:

rollover:

  • 上面的按时间创建索引的方法虽然能够通过索引名称判断数据的新旧,能通过索引名称来过滤search数据的索引范围,提高search效率。
  • 但是如果数据不是按照时间均匀分布,出现数据波动的话,数据过大则可能导致索引数据量超过设计标准,导致性能受到影响;
  • 数据过小则会造成资源浪费。为了弥补和解决这个问题,引入了rollover api。

Rollover 的原理:是使用一个别名指向真正的索引(要求索引的后缀必须是可以递增的数值类型,默认是000001这6位数字),当指向的索引满足一定条件(文档数时间索引大小),会新创建一个前缀相同,后缀递增的新索引,并将别名更新到实际指向的索引。

使用步骤

  • 1、创建一个模板方便后续管理
  • 2、创建索引:设置允许写入 "is_write_index": true ,否则无法写入数据,集群只能规定一个写入的索引
  • 3、插入测试数据(3条)
  • 4、执行rollover,如下图:rollover命令指定了三个规则,即时间最长1天 ,数据最多3条,容量最大20GB,这三个条件是or的关系,有一条满足即触发rollover操作
    • 查看执行结果:创建了新的索引taochy-000002,原因是最大数据条数已经达到3条了("[max_docs: 3]" : true),这里还有另外一个操作,就是rollover将别名指向了新生成的taochy-000002了,后续数据会写入taochy-000002中

curator:参见 ES Monitoring 整理笔记

curator + rollover 方案在功能上基本上能满足大部分场景的要求了,但是使用起来还是有些复杂,且不够自动化

阶段三方案:ILM


在elasticsearch6.6版本开始,elasticsearch把这两个组件(curator + rollover )进行了融合,搞出了个 ILM(Index Lifecycle Management ,简称 ILM),所谓 Lifecycle(生命周期)是把索引定义了四个阶段:

  • Hot:索引可写入,也可查询,也就是我们通常说的热数据,为保证性能数据通常都是在内存中或者SSD上;
  • Warm:索引不可写入,但可查询,介于热和冷之间,数据来源于hot层,可以进行数据周期设置,shrink,forcemerge,reduce replica 等操作,数据可以根据需求存在内存以及硬盘上;如果土豪玩家或者有特殊需求的场景,数据也可以按照需求放在内存以及SSD上;
  • Cold:索引不可写入,但很少被查询,数据来源于warm层,可以进行数据周期设置,freeze 等操作,数据查询的慢点也可接受,基本不再使用的数据,数据通常存储在大容量的磁盘上;
  • Delete:索引按照设置的数据时间规则可被安全的删除。

这 4 个阶段是 ES 定义的一个索引从生到死的过程, Hot -> Warm -> Cold -> Delete 4 个阶段只有 Hot 阶段是必须的,其他 3 个阶段根据业务的需求可选。

使用步骤:

  • 1、创建ilm的policy,kibana上有图形界面可以操作,也可以通过脚本或代码进行预制,kibana操作界面如下:
  • 上面规约了Hot阶段重新生成索引的规则,这部分功能其实就是对于rollover api的封装

  • 2、建立索引模板,和上面rollover的时候大体一样,有两点不同:
    • 在模板加上了全局查询别名 taochy_read_alias,方面后续数据跨索引查询
    • 在setting里面关联了lifecycle相关的配置,配置成刚才创建的policy,以及rollover需要的写别名taochy_write_alias
  • 3、创建索引:这个和阶段二的rollover一致
    • 查看结果:可以看到刚才配置的lifecycle属性以及两个别名的配置

  • 4、写入数据(3条)
  • 注意:elasticsearch加载ilm周期的全局配置,默认是10分钟,可以改成3秒,否则没10分钟才会检查一次,在这十分钟之内所有数据都会写入到taochy-000001,配置项修改如下:
  • 再查看索引结果如下:taochy-000001只剩下读索引,所以通过写别名写入的数据不会再写入到该索引;而taochy-000002既有读索引也有些索引,新数据会写入到该索引,符合上面 rollover api的特性。

小结:


随着elasticsearch版本的迭代以及功能场景的扩展,索引生命周期的管理变得重要且必须,所以在6.6版本之后推出了ilm的功能,这个功能在之前curator+rollover的基础上进行了功能的封装,方便了大家的使用,可以说是一个相当成熟且完善的功能,但是大家在使用的时候也要注意评估使用场景以及使用方法,目前在我看来ilm使用起码有两点需要注意:

  • 由于写别名只能指向最新的index,所以有数据修改需求的场景该需求可能不合适,或者说不能直接使用,需要通过方案级别进行设计来达到目标。

Flag:

  • 关注 ILM (完全可以在日志集上试点)
  • 将历史订单插入到当前Hot 索引的影响?(业务无影响、性能?)
  • 历史不变的索引,保用尽量小的分片数

参考资料


从 Rollover+curator 到 ILM的更多相关文章

  1. Elasticsearch 索引生命周期管理 ILM 实战指南

    文章转载自:https://mp.weixin.qq.com/s/7VQd5sKt_PH56PFnCrUOHQ 1.什么是索引生命周期 在基于日志.指标.实时时间序列的大型系统中,集群的索引也具备类似 ...

  2. 大数据篇:ElasticSearch

    ElasticSearch ElasticSearch是什么 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口. ...

  3. ES:PB级别的大索引如何设计

    一.单个大索引的缺陷 如果每天亿万+的实时增量数据呢,基于以下几点原因,单个索引是无法满足要求的: 1.存储大小限制维度 单个分片(Shard)实际是 Lucene 的索引,单分片能存储的最大文档数是 ...

  4. es索引管理工具-curator

    elasticsearch-curator  是官方收购的开源社区周边产品,用来管理es的索引和快照. 官方文档:https://www.elastic.co/guide/en/elasticsear ...

  5. elasticsearch 基于 rollover 管理按时间递增的索引 合并 删除

    https://www.elastic.co/cn/blog/managing-time-based-indices-efficiently Anybody who uses Elasticsearc ...

  6. ElasticSearch——Curator索引管理

    简介 curator 是一个官方的,可以管理elasticsearch索引的工具,可以实现创建,删除,段合并等等操作.详见官方文档 功能 curator允许对索引和快照执行许多不同的操作,包括: 从别 ...

  7. Elasticsearch7.X ILM索引生命周期管理(冷热分离)

    Elasticsearch7.X ILM索引生命周期管理(冷热分离) 一.“索引生命周期管理”概述 Elasticsearch索引生命周期管理指:Elasticsearch从设置.创建.打开.关闭.删 ...

  8. Logstash & 索引生命周期管理(ILM)

    Grok语法 Grok是通过模式匹配的方式来识别日志中的数据,可以把Grok插件简单理解为升级版本的正则表达式.它拥有更多的模式,默认,Logstash拥有120个模式.如果这些模式不满足我们解析日志 ...

  9. Curator框架的使用

    Curator框架的目的是减少用户的复杂度,毕竟原生的Zookeeper难以使用. 这里举一个使用例子. 第一步:建立连接 // 以下代码与192.168.1.101:2181建立了连接Curator ...

  10. Apache Curator: Zookeeper客户端

    Apache Curator Framework url: http://curator.apache.org/curator-framework/ The Curator Framework is ...

随机推荐

  1. 【Java面试题】SpringBoot

    十.SpringBoot (66)SpringBoot 简介 Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,它的产⽣简化了框架的使⽤,所谓简化,是 ...

  2. .Net接入AzureOpenAI、OpenAI、通义千问、智谱AI、讯飞星火、文心一言大语言模型。

    前言 现在在网上搜索.NET接入大模型的帖子很少,有些官方案例只提供java和python的SDK,所以有了这篇.Net的接入大模型文章,目前仅实现对话模型的调用. 这里仅举例通义千问,其他模型实现可 ...

  3. #原根,BSGS,扩欧,矩阵乘法#CF1106F Lunar New Year and a Recursive Sequence

    题目 已知数列 \(f\) 满足 \(f_{1\sim k-1}=1\) 且 \(f_n=m\), 并且知道 \(f_i=(\prod_{j=1}^kf_{i-j}b_j)\bmod{99824435 ...

  4. #CDQ分治,单调栈,双指针#BZOJ 4237 稻草人 AT1225 かかし

    洛谷传送门 BZOJ 4237 稻草人 题意 在一个平面直角坐标系上给出\(n\)个点, 问有多少个点对\((i,j)\)满足\(x_i<x_j,y_i<y_j\), 而且对于\(n\)个 ...

  5. 使用OHOS SDK构建zlib

    参照OHOS IDE和SDK的安装方法配置好开发环境. 从gitee下载源码,当前最新的提交记录ID为04f42ceca40f73e2978b50e93806c2a18c1281fc. 执行如下命令: ...

  6. Python 集合(Sets)3

    Python - 合并集合 在 Python 中,有几种方法可以合并两个或多个集合.您可以使用union()方法,该方法返回一个包含两个集合中所有项的新集合,或使用update()方法,将一个集合中的 ...

  7. 快速加入Health Kit,一文了解审核流程

    HUAWEI Health Kit是为华为生态应用打造的基于华为帐号和用户授权的运动健康数据开放平台. 在获取用户授权后,开发者可以使用Health Kit提供的开放能力获取运动健康数据,基于多种类型 ...

  8. Python设计模式----2.工厂模式

    工厂方法模式是简单工厂模式的衍生,解决了许多简单工厂模式的问题 首先完全实现'开-闭 原则',实现了可扩展.其次更复杂的层次结构,可以应用于产品结果复杂的场合. 工厂方法模式的对简单工厂模式进行了抽象 ...

  9. 阿里开源的32B大模型到底强在哪里?

    阿里巴巴最近开源了一个320亿参数的大语言模型Qwen1.5-32B,网上都说很强很强,那么它到底强在哪里呢? 更高的性价比 Qwen1.5-32B中的B是billion的意思,也就是10亿,32B就 ...

  10. MogDB/openGauss关于PL/SQL匿名块调用测试

    MogDB/openGauss 关于 PL/SQL 匿名块调用测试 一.原理介绍 PL/SQL(Procedure Language/Structure Query Language)是标准 SQL ...