在大数据项目中我们每天需要存储大量的数据到 ElasticSearch( 以下简称 ES )中,但是存储空间毕竟是有限的,所以常常遇到 ES 存储不够的时候,怎么办呢?
有两种解决方案:
1、扩容 2、删除索引
第一种方案实现起来最简单,但是成本比较高,最后还是会要删除索引。
所以我们还是采用第二种方案吧,删除过期索引,但是每天去删除太麻烦了,所以这里用一个定时任务脚本来实现,具体实现如下:
创建 ES 定时删除脚本:
vim ES-index-clear.sh
脚本内容:
#/bin/bash
ES_IP=<替换为实际IP或域名>
ES_PORT=<替换为实际端口>
#如果配置的有账号密码 就需要修改如下配置
ES_USER=<替换为实际用户>
ES_PASSWORD=<替换为实际密码>
#指定日期(7天前)
DATA=`date -d "1 week ago" +%Y.%m.%d`
echo "$(date "+%Y%m%d-%H:%M:%S") 开始清理 $DATA 索引"
#删除7天前的日志
curl --user $ES_USER:$ES_USER -XGET "http://$ES_IP:$ES_PORT/_cat/indices/?v"|grep $DATA
if [ $? == 0 ];then
curl --user $ES_USER:$ES_USER -XDELETE "http://$ES_IP:$ES_PORT/*-${DATA}"
echo "$(date "+%Y%m%d-%H:%M:%S") 完成清理 $DATA 索引!"
else
echo "$(date "+%Y%m%d-%H:%M:%S") 无 $DATA 索引!"
fi
脚本说明:
1、第一句是脚本的开头 2、首先确定你需要删除哪个时间以前的索引,我这里是删除的一周也就是7天前的,所以我这里DATA取的是当前时间一周以前的时间。 3、查询匹配一周前的这个索引是否存在,这里需要注意添上你es的账号,密码,和部署es的机器ip,如果你没有设置es的账号和密码可以不加。 4、如果这个索引存在,那么就执行删除这个索引的操作,并进行打印,最后输出删除结果
修改脚本权限:
chmod 777 ES-index-clear.sh
设置定时任务:
crontab -e
定时任务如下:
# 每天1点执行定时任务
0 1 * * * sh /sxapp/shscript/ES-index-clear.sh > /sxapp/shscript/log/es-index-clear.log 1
这里是每天早上1点执行这个删除脚本,然后将执行的输出结果输出到日志文件中,即可完成。