这几天频繁看到 ES 负载、存储容量相关的报警,检查发现是 ES 中创建的索引没有清理,时间久了导致负荷太重。而我这里的 ES 只是存储了一些不重要的日志数据,故写了以下脚本通过 ES 本身的 API 来定时清理。脚本很简单,就不做说明啦。。
#!/bin/bash
#
# desc: 清理 es 中指定天数以前创建的索引
# set -e
#if [ $# != 2 ];then
# echo "Usage:
# scorll_del_es_index.sh <es_url> <save_days>
# es_url: es 实例地址, 例: http://127.0.0.1:9200;
# save_days: 保存天数, 例: 3;
#"
# exit 1
#fi
# 要清理索引的 es 实例地址
#es_url=$1
# 保存时间(天)
#save_days=$2
echo "删除 $save_days 天以前的索引"
index_list_lines=`curl -s "$es_url/_cat/indices?h=i,creation.date.string"`
[ $? -ne 0 ] && echo "获取索引列表失败" && exit 1
week_ago_time=`date -d "$save_days days ago" "+%Y-%m-%d %H:%M:%S"`
week_ago_timestamp=`date -d "$week_ago_time" "+%s"`
delete_index(){
echo "删除索引: $1, 创建时间: $2"
curl -s -XDELETE $es_url/$1 > /dev/null && echo "删除成功"
}
IFS=$'\n'
for line in $index_list_lines;do
index_name=`echo $line | awk '{print $1}'`
# .kibana 索引不清理
[ $index_name == ".kibana" ] && continue
index_create_time=`echo $line | awk '{print $2}'`
index_create_time=${index_create_time%.*}
index_create_time=${index_create_time//T/" "}
index_create_timestamp=`date -d "$index_create_time" "+%s"`
if [ $index_create_timestamp -lt $week_ago_timestamp ];then
delete_index $index_name $index_create_time
fi
done
由于我们的 ES 只有 Kubernetes 集群内部或节点才可以访问到,而节点我又没有权限登录上去部署定时任务,所以我就把上述脚本打包到镜像去了,就利用 Kubernetes 本身的 Cronjob 资源来调度执行这个任务,资源文件内容如下:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: scorll-es-index
spec:
# 每天凌晨一点执行一次
schedule: "0 1 * * *"
jobTemplate:
spec:
template:
spec:
imagePullSecrets:
- name: longsee-registry
containers:
- name: scorll-es-index
image: zze326/scorll_es_index:1.1
env:
- name: es_url
value: "http://10.0.1.2:9200"
- name: save_days
value: "20"
imagePullPolicy: IfNotPresent
restartPolicy: OnFailure
评论区