需求背景
业务系统将各类的报表和统计数据存放于西文中,由于历史原因,系统每天均以全量方式进行统计,随着时间的推移,ES的数据存储空间压力巨大。同时由于没有规划好ES的索引使用,个别索引甚至出现超过最大文档数限制的问题,现实情况给运维人员带来的挑战是需要以最小的代价来解决这个问题。下面以内网开发,测试环境举例使用python脚本解决这个问题。
每个Elasticsearch碎片是一个Lucene索引。有最大数量的文件你可以在一个Lucene索引。lucene - 5843,极限是2147483519(=整数。MAX_VALUE - 128)文件。您可以监视碎片大小使用_cat/碎片API。
引用>实现思路
es本身支持“_delete_by_query”的形式对查询出来的数据进行删除。首先我们通过“_cat/指数”入口获取当前es服务上所有的索引信息。
第一列表示索引当前的健康状态
引用>
第三列表示索引的名称
第四列表示索引在服务器上的存储目录名
第五,六列表示索引的副本数和分片信息
第七列表示当前索引的文档数
最后两列分别表示当前索引的存储占用空间,倒数第二列等于倒数第一列乘以副本数其次我们通过卷形式拼接成删除命令发送给es服务端执行,其中createtime字段为数据的产生时间,单位为毫秒
<代码> curl - x发布“http://192.168.1.19:9400 fjhb-surveyor-v2/_delete_by_query ? pretty"- h & # 39; - type: application/json # 39;- d & # 39; ,,{“query": {“range": { ,,,,,“createTime":{大敌; ,,,,,,,,“lt": 1580400000000,,, ,,,,,,,,“format":“epoch_millis" ,,,,,,} ,,,,} }}& # 39;代码>具体实现
<代码> # !/usr/bin/python # - * -编码:utf - 8 - * # # #导入必须的模块 进口的要求 导入的时间 进口日期时间 进口操作系统 #定义获取西文数据字典函数,返回索引名和索引占用存储空间大小字典 def getData (env): ,,头={“Content-Type":“应用程序/x-www-form-urlencoded", ,,,,,,,“user-agent":“用户代理:Mozilla/5.0 (Windows NT 10.0;Win64;x64) AppleWebKit/537.36 (KHTML,像壁虎)Chrome/62.0.3202.94 Safari 537.36“; } ,,data=https://www.yisu.com/zixun/{} 张开(“result.txt”、“w +”) f: 要求=requests.get (url=env +/_cat/指标,头=头)。text f.write(要求) f.seek (0) 线的f.readlines (): 数据(line.split () [2]]=line.split () [1] 返回数据 #定义unix时间转换函数,以毫秒形式返回,返回值为int类型 def unixTime(天): 今天=datetime.date.today () 今天target_day=+ datetime.timedelta(天) unixtime=int (time.mktime (target_day.timetuple ())) * 1000 返回unixtime #定义删除es数据函数,调用系统curl命令进行删除,需要传入环境,需要删除数据的时间范围(即多少天之前的数据)参数,由于索引数量众多,我们只处理超过1 g的索引即可 def delData (env,天): 头=' application/json - type: ' 关键,价值getData (env) . items (): 如果“g”的值: 大?浮动(value.split (gb) [0]) 如果大? 1: url=dev + '/' +键+”/_delete_by_query ?漂亮的 命令=(“curl - x \“% s \“- h ' % s '” “- d{\“查询\”:{\“\”:{\“createTime \”: {\“lt \”: % s, \“格式\”:\“epoch_millis \}}}}”“% ( url、头、天)) 打印(命令) os.system(命令) if __name__==癬_main__”: dev=' http://192.168.1.19:9400 ' test1=' http://192.168.1.19:9200 ' test2=' http://192.168.1.19:9600 ' 一天=unixTime (-30) delData (dev) test1 delData(天) delData (test2) 代码>结果验证
删除前
注意事项
1,目前脚本采用操作系统crontab方式调度,一天运行一次
2,首次删除因为数据量庞大,需要耗费较长时间,后续每天删除一天的数据量,删除效率尚可
3,脚本未考虑服务器报错等例外情况与告警通知,实际应用场景需要进行补充
4脚本未考虑日志记录,实际应用场景需要进行补充Python脚本删除查询出来的数据进