我们有一台ES服务器,设置了每天02:00执行一次清理索引数据的定时任务,但这两天总是出现磁盘空间抖动,一线一看见超了阈值,就打电话报警,可能整晚要被叫几次,ES作为日志平台的一部分,只是为了方便我们检索日志,不影响实际业务,这就比较烦了。
除了挂起报警,一种暴力的方法,就是再设置一些定时作业时间点,简单是简单,但弊端就是有可能到点儿了,空间还有,不需要删除,但仍执行了删除,可见的数据就少了,而且如果间隔时间设置不合理,很有可能还会超阈值。
今儿单位值班,就简单思考一下,既然报警是有阈值的,那么执行删除的操作,是不是可以参考执行?
以下实现采用了shell脚本,简单的方式,当然你用python,甚至重一些的java,都可以实现类似的功能,实现原理相同,实现方式不同,无伤大雅。我们一步一步拆解来看,如何实现这一个功能。
如下是执行df -h回显,
这里我要监控的是/opt/app路径,要做的判断就是如果此路径空间使用率超过90%,则执行删除ES索引数据的操作。
首先需要获取/opt/app的空间使用率,df -h中第四列,已经给出了使用率百分比,为了获取这个值,可以使用awk命令,来截取这个值。awk接收df -h的输出,作为输入,$4表示打印第四列(空格或者TAB隔开),
我其实只是需要/opt/app对应的信息,df -h指定/opt/app路径,
再进一步,我只需要百分比数据,只检索包含/opt/app这行,
这里是百分比,我需要数字进行阈值比较,因此需要删除%,用了sed做值替换,即将%换为空,
现在我们得到了当前使用率,要和阈值进行比较了,其中CURRENT是当前使用率,THRESHOLD是阈值,如果CURRENT>=THRESHOLD,则执行curl -XDELETE $URL操作,进行ES索引数据的清理工作,
可以将其中的变量,设为参数,便于统一管理,还可以log一些信息,
以上脚本加入crontab中,定时10分钟执行一次,就可以实现,根据磁盘空间阈值,来做索引数据删除的操作。一个比较简单的功能需求,涉及了awk、管道、sed这些常用的指令,用起来就可以慢慢理解了。
完整的shell脚本可以从GitHub上来下载,
https://github.com/bisal-liu/oracle/blob/master/crontab_es_del.sh
如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)