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

  • 查询与写入越来越慢,聚合的速度慢的离谱,聚合的数据量大一些的话,可能出现超时失败,甚至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. 实现一个简单的echarts词云图PythonFlask

    cloud.html 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta char ...

  2. 电科院密码保密与信息安全竞赛网络攻防宣传赛 Writeup

    一. 战队信息 战队名称:20221214 战队排名:1 二. 解题过程 ctf1 用Winhex打开,最后有一串编码字符,拿去一把梭即可. ctf2 目录穿越 GET /icons/.%2e/%2e ...

  3. #线段树,约数#洛谷 3889 [GDOI2014]吃

    题目 有一个长度为\(n\)的数列,现在有\(m\)组询问每次给出区间\([l,r]\),查询 \[\max_{i,j=1}^n\{gcd(a_i,a_j)[(i<l或i>r)且l\leq ...

  4. PriorityQueue和PriorityBlockingQueue

    目录 简介 PriorityQueue PriorityBlockingQueue PriorityQueue和PriorityBlockingQueue 简介 Queue一般来说都是FIFO的,当然 ...

  5. JDK10的新特性:本地变量类型var

    目录 简介 为什么我们需要var var使用在什么地方 var不能用在什么地方 其他var的特点 总结 简介 java以面向对象的特性显著于世并得到了蓬勃的发展.在语言的发展过程中,为了让java语言 ...

  6. Pandas选择与索引

    Series和DataFrame对象与Numpy数组和标准Python字典的数据索引和选择模式一样. 字典形式选择和索引 Series In [1]: import pandas as pd In [ ...

  7. Windows 杀毒简单有效的方式

    Windows 电脑杀毒通常会选择杀毒软件,这样太笨重,且容易占内存和存在流氓软件侵入. 推荐使用 Windows 自带的恶意软件删除工具 按住 Win + R 键,弹出运行窗口,输入 mrt. 系统 ...

  8. 报名启动丨HMS Core. Sparkle应用创新论坛

    图形领域将迎来哪些技术新进展?时下热门的3D.AR/VR和数字人等创新技术又会给应用开发带来哪些新的启发?以上问题,将在7月15日HMS Core. Sparkle应用创新论坛揭晓,赶快点击链接报名参 ...

  9. oracle database recover database (下篇)

    1. recover database 恢复级别一共三个:recover database > recover tablespace > recover datafile ,最高级别 da ...

  10. 【Python3.10.4】Centos7 ,centos8,centos9源码安装 python3.10.4 解释器

    1.检查是否安装wget如果没有安装则: 终端执行: yum -y install wget 2.下载python3源码包 终端执行: wget https://www.python.org/ftp/ ...