elasticsearch(es)定时删除7天前索引

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch(es)定时删除7天前索引相关的知识,希望对你有一定的参考价值。

es作为日志分析工具,采集nginx访问日志,项目log日志,心跳检测日志,服务器度量日志等,每天产生大量索引(Index),占用磁盘空间。对于过期数据不一定有用,需要进行删除来释放磁盘空间。

官网有_delete_by_query这个api进行删除,链接:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete-by-query.html

curl -u 用户名:密码  -HContent-Type:application/json -d
    "query": 
        "range": 
            "@timestamp": 
                "lt": "now-7d",
                "format": "epoch_millis"
            
        
    

 -XPOST "http://127.0.0.1:9200/*-*/_delete_by_query?pretty"

-u是格式为userName:password,使用Basic Auth进行登录。如果elasticsearch没有使用类似x-pack进行安全登录,则不需要加-u参数

-H是指定文档类型是json格式

-XPOST是指定用POST方式请求

-d是指定body内容 *-*应该是指定了所有索引名称,可以专门指定一个例如 filebeat-1,或者是filebeat开头的如filebeat-*。


    "query": 
        "range":  //范围
            "@timestamp": //时间字段
                "lt": "now-7d",//lt是小于(<),lte是小于等于(<=),gt是大于(>),gte是大于等于(>=),now-7d是当前时间减7天
                "format": "epoch_millis"//不清楚,但是这个参数所有文章都带了,建议带上
            
        
    

可以使用linux自带的定时器执行每天删除 $ crontab -e

  • 0 * * * /usr/bin/curl -u username:password -HContent-Type:application/json -d"query":"range":"@timestamp":"lt":"now-7d","format":"epoch_millis" -XPOST "http://127.0.0.1:9200/-/_delete_by_query?pretty" > /tmp/clean.txt

也可以使用自己的定时执行平台。

转载来自:https://anjia0532.github.io/2017/04/06/elasticsearch-delete-indices-by-date/ 上面有另外一个针对大量数据的清理方法,如有需要自己上去获取,这里我暂时用不到,仅做记录。

删除elasticsearch 30天前的所有索引

我的索引格式为

xxx-xxx-xxx-2019.06.27
xxx-xxxx-2019.06.27

脚本思路:

 获取目前 es上所有索引,以日期进行拆分,然后用索引时间对比一个月前的日期,日期小于一个月的直接删除

#!/bin/bash
# Remove the index of one month old in elasticserch
CMD_ECHO=echo
SCRIPT_NAME=`basename $0`
LOG_PRINT="eval $CMD_ECHO \"[$SCRIPT_NAME]\" @$(date +"%Y%m%d %T") [INFO] :"
time_ago=30
es_cluster_ip=127.0.0.1
function delete_index()
   comp_date=`date -d "$time_ago day ago" +"%Y-%m-%d"`
   date1="$1 00:00:00"
   date2="$comp_date 00:00:00"
   index_date=`date -d "$date1" +%s`
   limit_date=`date -d "$date2" +%s`
    
   if [ $index_date -le $limit_date ];then
        $LOG_PRINT  "$1 will perform the delete task earlier than  $time_ago days ago" >> tmp.txt
        del_date=`echo $1 | awk -F  "-" print $1"."$2"."$3`
        curl -XDELETE http://$es_cluster_ip:9200/*$del_date >> tmp.txt
   fi         



# get the date in all index
curl -XGET http://$es_cluster_ip:9200/_cat/indices|awk -F " " ‘print $3‘  | egrep "[0-9]*\.[0-9]*\.[0-9]*" |awk -F  "-" ‘print $NF‘ | awk -F  "." ‘print $((NF-2))"-"$((NF-1))"-"$NF‘ | sort | uniq | while read LINE   

do
  delete_index  $LINE
done

 

以上是关于elasticsearch(es)定时删除7天前索引的主要内容,如果未能解决你的问题,请参考以下文章

【es】es清空index中数据的方法

删除elasticsearch大于7天前的索引

删除elasticsearch 30天前的所有索引

elasticsearch索引量大怎么定时删除

centos定时删除log文件

elasticsearch 索引备份恢复