es 集群精准统计(如何定期去清理ES集群的数据)

文|洪生鹏

作为一名程序员,求职面试时,不知道你有没有遇到过这样的面试题。

如何定期去清理ES集群的数据?

张工是一名java程序员,有两年大数据开发经验,最近到某知名互联网公司面试,面试官就问了他这样的一个问题:

如何定期去清理ES集群的数据以保证集群处在一个最佳负载状态?

张工:编写shell脚本定时删除索引就好了。

面试官:如果是删除具体某个索引的数据,又该怎么操作?

由于张工平时没有做到这块,这个问题就答不出个所以然来。

一般需要定期删除ES集群某个索引的历史数据,很有可能是前期设计时考虑不够全面。

随着业务的不断发展,单个索引的数据量将越来越大,索引又不能变更,如果没有定期清理数据,会导致查询速度越来越慢,严重影响用户体验。

如何定期去清理ES集群的数据?

对于这个问题,如果是删除这个索引这个比较好办,直接删除索引(Delete Index)就可以了 ,但要是遇到是删除具体某个索引的部分数据,又该怎么操作。

我们今天来介绍一种比较常见的做法。通过Delete By Query的方式去删除索引中的数据。

这个API的功能是根据特定的查询条件对ES相关索引中某些特定的文档进行批量删除。

es 集群精准统计(如何定期去清理ES集群的数据)(1)

下面我们来看看这个API的基本用法。

_delete_by_query会删除所有query语句匹配上的文档,用法如下:

POST index_name/_delete_by_query { "query": { "match": { "name": " 爱开发" } } }

看到这个应该不陌生,这参数就不是和Search API的用法一样的。确实,在Search API中query的参数和上面效果是一样的。

表示index_name 这个索引下 字段name等于“爱开发”记录都会被删除。

执行后,它会返回数据格式,告诉我们用时和删除多少记录。

响应体:

{ "took" : 3686, "timed_out" : false, "total" : 117666, "deleted" : 117666, "batches" : 118, "version_conflicts" : 0, "noops" : 0, "retries" : { "bulk" : 0, "search" : 0 }, "throttled_millis" : 0, "requests_per_second" : -1.0, "throttled_until_millis" : 0, "failures" : [ ] }

下面我们来看看每个字段具体含义

took: 表示整个操作的开始到结束的毫秒数。

timed_out: 请求处理过程中是否超时

total: 成功处理的doc数量

deleted: 成功删除的文档数。

batches: 通过查询删除的scroll响应数量。

version_conflicts: 根据查询删除时,版本冲突的数量。

noops: 暂没发现有什么作用,据悉是为了保持跟其他api结构一致

retries: search 操作和bulk操作的重试次数

throttled_millis: 因为requests_per_second而产生的睡眠时间

requests_per_second: 每秒处理的请求数

throttled_until_millis: 暂没发现有什么作用,据悉是为了保持跟其他api结构一致failures: 失败的情况,会终止操作的失败

通过delete_by_query API这样就可以解决需求定期去清理ES集群索引的数据了。

不过光知道怎么使用还不够,我们有必要了解下它的基本原理。

Delete By Query 删除原理:

delete_by_query并不是真正意义上的物理删除,它只是版本变化并且对文档增加了删除标记。

es 集群精准统计(如何定期去清理ES集群的数据)(2)

当再次搜索的时候,就会搜索全部然后再过滤掉有删除标记的文档。

因此,该索引所占的空间并不会随着该API的操作磁盘空间会马上释放掉,只有等到下一次段合并的时候才真正被物理删除,这个时候磁盘空间才会释放。

相反,在被查询到的文档标记删除过程需要占用磁盘空间,这个时候,你会发现触发该API操作的时候磁盘不但没有被释放,反而磁盘使用率上升了。

es 集群精准统计(如何定期去清理ES集群的数据)(3)

总结:

在生产环境使用Delete By Query 删除API时有两个事项需要注意。

一般使用该API,意味着要操作的索引数据量都不小,文档都是千万甚至数亿级别。这是因为大数据量情况下删除数据需要消耗较多的I/O CPU 资源,容易对生产集群造成影响。因此,使用这个操作建议在业务低峰期或者晚上进行操作。

前面我们有提到过,delete_by_query并不是真正意义上的物理删除,它只是版本变化并且对文档增加了删除标记。因为标记删除需要占用磁盘空间,所以在删除过程中要确定集群磁盘有一定的余量,如果磁盘空间不够,这个操作的失败概率会增大。

关于_delete_by_query这个API的基本用法就简单分享到这,本文只是简单讲述Delete By Query的基础用法,这个API还有其他配置参数,具体有需要的可以到官网文档查看。

由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,欢迎交流。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页