elasticsearch定期删除索引ELK清理索引脚本

搭建ELK有一段时间了,但是发现elastic中的索引越来越多 内存不够用,每次清理的时候都要一个一个的清除,觉得很麻烦,所以写了个简单的脚本直接一次性全部清理多于的索引

实现要求
可以自动化 也可以定制化
自动化: 可以直接写一个定时任务,让脚本在多少天之内运行一次进行自动删除
定制化:输入对应的天数,即删除对应的天数之外的所有索引

自动化的比较简单,这里我说一下定制化的脚本

1 手动查询所有索引

在ELK 中加入了x-pack的
$ curl -XGET -u elastic:admins-1 'http://127.0.0.1:9200/_cat/indices?v'
没有加入x-pack的
$ curl -XGET  'http://127.0.0.1:9200/_cat/indices?v'

2 手动删除索引

在ELK 中加入了x-pack的
$ curl -XDELETE -u elastic:admins-1 'http://1127.0.0.1:9200/logstash-2019.04.01'
或
$ curl -XDELETE -u elastic:admins-1 'http://1127.0.0.1:9200/logstash-*'

没有加入x-pack的
$ curl -XDELETE  'http://1127.0.0.1:9200/logstash-2019.04.01'
或
$ curl -XDELETE  'http://1127.0.0.1:9200/logstash-*'

由此可以看出 一旦索引多了 就很不方便了

所有开始定制化脚本

#创建文件名字为 index-clear.sh
$ touch index-clear.sh
#编辑 将下面的脚本复制到index-clear.sh中 保存
$ vim index-clear.sh
#授权
$  chmod u+x index-clear.sh

此脚本为加入了x-pack的 也就是说带有账号和密码的
如果你的没有账号密码 那么需要修改一下查询和删除的参数即可
上面已经列出没有加入x-pack的完整连接 直接复制到脚本中即可

#!/bin/bash
######################################################
# $Name:        clean_es_index.sh
# $Version:     v1.0
# $Function:    clean es log index
# $Author:      cailu
# $Create Date: 2019-04-02
# $Description: shell
######################################################
#本文未加文件锁,需要的可以加

#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 执行脚本.sh [start 自然数]"
    exit 1
}

#获取输入的天数
DELTIME=$2

#方法主体
start(){

#脚本的日志文件路径
CLEAN_LOG="/usr/local/nlp/clean_es_index.log"
#索引前缀
INDEX_LOGST="logstash-*"
#elasticsearch 的主机ip及端口
SERVER_PORT="127.0.0.1:9200"
#elasticsearch 账号
USER_NAME="elastic"
#elasticsearch 密码
PASSWORD="admins-1"
#取出已有的索引信息
#INDEXS_ALL=$(curl -XGET -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/_cat/indices?v" | awk '{print $3}')
#查询logstash-*的索引
INDEXS_KEY_LOGST=$(curl -XGET -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/_cat/indices?v"| grep "$INDEX_LOGST" | awk '{print $3}')
#删除多少天以前的日志,假设输入10,意味着10天前的日志都将会被删除
DELTIME=$DELTIME
echo "-------现在查询【 $DELTIME 】天之前的所有索引 -------" >>${CLEAN_LOG}

# seconds since 1970-01-01 00:00:00 seconds
SECONDS=$(date -d  "$(date  +%F) -${DELTIME} days" +%s)
#判断日志文件是否存在,不存在需要创建。
if [ ! -f  "${CLEAN_LOG}" ]
then
touch "${CLEAN_LOG}"
fi
#echo "$(date  +%F)" >> ${CLEAN_LOG}
#删除指定日期索引
echo "----------------------------clean time is $(date +%Y.%m.%d) ------------------------------" >>${CLEAN_LOG}
for del_index_logst in ${INDEXS_KEY_LOGST}
do
    indexDate=$( echo ${del_index_logst} |cut -d "-" -f 2 )
    format_date=$(echo ${indexDate}| sed 's/\.//g')
    #format_date=$(echo ${indexDate}| sed 's/-//g') 
    #根据索引的名称的长度进行切割,不同长度的索引在这里需要进行对应的修改 日志格式为yyyy.mm.dd的或yyyy-mm-dd的
    indexSecond=$( date -d ${format_date} +%s )
    if [ $(( $SECONDS - $indexSecond )) -gt 0 ]
	then
	echo "-------del---${del_index_logst}" >> ${CLEAN_LOG}
        #取出删除索引的返回结果
 	delResult=`curl -XDELETE -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/${del_index_logst}?pretty" |sed -n '2p'`
	echo "delResult is ${delResult}" >>${CLEAN_LOG}       
    fi
done

echo "----------------------------end time is $(date +%Y.%m.%d) ------------------------------" >>${CLEAN_LOG}
}


#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
   case "$#" in
        "2")
  if [ -n "$(echo $2| sed -n "/^[0-9]\+$/p")" ];
       then 
           read -p "Do you want to continue [Y/n]?" BOOLEAN
            case "$BOOLEAN" in
               [yY][eE][sS])
                   echo 'Thanks' $BOOLEAN
               ;;
               [yY])
                    start
                ;;
                *)
                 echo '结束'
                exit 1
                ;;
             esac
        else 
            echo "[$2] 不是自然数,请输入自然数"
   fi
     ;;
   *)
   usage       
    ;;
   esac             
    ;;
  *)
    usage
    ;;
esac

测试脚本
注意这里的这个脚本是只正对一个索引的定制化
也就是在运行index-clear.sh脚本的时候 会要求输入两个参数
./index-clear.sh start 0 第一个参数 start 为启动 后面一个0 为天数
例如 你想删除10以后的索引 那么你这个就要输入9 因为默认查询的时候 会重0看开始查询
所以为:./index-clear.sh start 9
需要注意的地方是 正则表达式没有验证输入为 01,02,03 这种数字时的验证 所以输入自然数就可以了
单个索引的说完了 下面说一些多个索引的

$ ./index-clear.sh 
Usage: sh 执行脚本.sh [start 自然数]
$ ./index-clear.sh start
Usage: sh 执行脚本.sh [start 自然数]
$ ./index-clear.sh start qqq
[qqq] 不是自然数,请输入自然数
$ ./index-clear.sh start 0
Do you want to continue [Y/n]?y
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
102  1230  102  1230    0     0  31125      0 --:--:-- --:--:-- --:--:-- 31538

查看日志文件
-------现在查询【 0 】天之前的所有索引 -------
----------------------------clean time is 2019.04.02 ------------------------------
-------del---logstash-2019.04.01
delResult is   "acknowledged" : true
----------------------------end time is 2019.04.02 ------------------------------

多个索引删除
多个索引和上面一样
加入多个变量

#!/bin/bash
######################################################
# $Name:        clean_es_index.sh
# $Version:     v1.0
# $Function:    clean es log index
# $Author:      cailu
# $Create Date: 2019-04-02
# $Description: shell
######################################################
#本文未加文件锁,需要的可以加

#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 执行脚本.sh [start 自然数]"
    exit 1
}

#获取输入的天数
DELTIME=$2

#方法主体
start(){

#脚本的日志文件路径
CLEAN_LOG="/usr/local/nlp/clean_es_index.log"
#索引前缀
INDEX_LOGST="logstash-*"
INDEX_METRI="metricbeat-*"
INDEX_REDIS="redis-*"
INDEX_NGINX="nginx-*"
INDEX_MONIT=".monitoring-*"
#elasticsearch 的主机ip及端口
SERVER_PORT="127.0.0.1:9200"
#elasticsearch 账号
USER_NAME="elastic"
#elasticsearch 密码
PASSWORD="admins-1"
#取出已有的索引信息
#INDEXS=$(curl -XGET -u ${USER_NAME}:${PASSWORD} "${SERVER_PORT}/_cat/indices?v"  |grep "${INDEX_PRFIX}"|awk '{print $3}' )

#INDEXS_ALL=$(curl -XGET -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/_cat/indices?v" | awk '{print $3}')
#查询logstash-*的索引
INDEXS_KEY_LOGST=$(curl -XGET -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/_cat/indices?v"| grep "$INDEX_LOGST" | awk '{print $3}')
#查询metricbeat-*的索引
INDEXS_KEY_METRI=$(curl -XGET -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/_cat/indices?v"| grep "$INDEX_METRI" | awk '{print $3}')
#查询redis-*的索引
INDEXS_KEY_REDIS=$(curl -XGET -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/_cat/indices?v"| grep "$INDEX_REDIS" | awk '{print $3}')
#查询nginx-*的索引
INDEXS_KEY_NGINX=$(curl -XGET -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/_cat/indices?v"| grep "$INDEX_NGINX" | awk '{print $3}')
#删除多少天以前的日志,假设输入10,意味着10天前的日志都将会被删除
DELTIME=$DELTIME
echo "-------现在查询【 $DELTIME 】天之前的所有索引 -------" >>${CLEAN_LOG}

# seconds since 1970-01-01 00:00:00 seconds
SECONDS=$(date -d  "$(date  +%F) -${DELTIME} days" +%s)
#判断日志文件是否存在,不存在需要创建。
if [ ! -f  "${CLEAN_LOG}" ]
then
touch "${CLEAN_LOG}"
fi
#echo "$(date  +%F)" >> ${CLEAN_LOG}
#删除指定日期索引
echo "----------------------------clean time is $(date +%Y.%m.%d) ------------------------------" >>${CLEAN_LOG}
#echo "-------现在查询的索引前缀【 $INDEX_LOGST 】 -------" >>${CLEAN_LOG}
#echo "-------所有的索引名字 $INDEXS_ALL----------" >>${CLEAN_LOG}
#echo "-------需要删除的索引名字【 $INDEXS_KEY_LOGST 】-------" >>${CLEAN_LOG}
for del_index_logst in ${INDEXS_KEY_LOGST}
do
    indexDate=$( echo ${del_index_logst} |cut -d "-" -f 2 )
    format_date=$(echo ${indexDate}| sed 's/\.//g')
    #format_date=$(echo ${indexDate}| sed 's/-//g')
    #根据索引的名称的长度进行切割,不同长度的索引在这里需要进行对应的修改 
    indexSecond=$( date -d ${format_date} +%s )

    if [ $(( $SECONDS - $indexSecond )) -gt 0 ]
	then
	echo "-------del---${del_index_logst}" >> ${CLEAN_LOG}
        #取出删除索引的返回结果
 	delResult=`curl -XDELETE -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/${del_index_logst}?pretty" |sed -n '2p'`
	echo "delResult is ${delResult}" >>${CLEAN_LOG}       
    fi
done

for del_index_metri in ${INDEXS_KEY_METRI}
do
    indexDate=$( echo ${del_index_metri} |cut -d "-" -f 2 )
    format_date=$(echo ${indexDate}| sed 's/\.//g')
    #format_date=$(echo ${indexDate}| sed 's/-//g')
    #根据索引的名称的长度进行切割,不同长度的索引在这里需要进行对应的修改 
    indexSecond=$( date -d ${format_date} +%s )

    if [ $(( $SECONDS - $indexSecond )) -gt 0 ]
        then
           echo "-------del---${del_index_metri}" >> ${CLEAN_LOG}
           delResult=`curl -XDELETE -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/${del_index_metri}?pretty" |sed -n '2p'`
           echo "delResult is ${delResult}" >>${CLEAN_LOG}
    fi
done

for del_index_redis in ${INDEXS_KEY_REDIS}
do
    indexDate=$( echo ${del_index_redis} |cut -d "-" -f 2 )
    format_date=$(echo ${indexDate}| sed 's/\.//g')
    #format_date=$(echo ${indexDate}| sed 's/-//g')
    #根据索引的名称的长度进行切割,不同长度的索引在这里需要进行对应的修改 
    indexSecond=$( date -d ${format_date} +%s )

    if [ $(( $SECONDS - $indexSecond )) -gt 0 ]
        then
           echo "-------del---${del_index_redis}" >> ${CLEAN_LOG}
           delResult=`curl -XDELETE -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/${del_index_redis}?pretty" |sed -n '2p'`
           echo "delResult is ${delResult}" >>${CLEAN_LOG}
    fi
done

for del_index_nginx in ${INDEXS_KEY_NGINX}
do
    indexDate=$( echo ${del_index_nginx} |cut -d "-" -f 2 )
    format_date=$(echo ${indexDate}| sed 's/\.//g')
    #format_date=$(echo ${indexDate}| sed 's/-//g')
    #根据索引的名称的长度进行切割,不同长度的索引在这里需要进行对应的修改 
    indexSecond=$( date -d ${format_date} +%s )

    if [ $(( $SECONDS - $indexSecond )) -gt 0 ]
        then
           echo "-------del---${del_index_nginx}" >> ${CLEAN_LOG}
           delResult=`curl -XDELETE -u $USER_NAME:$PASSWORD "http://${SERVER_PORT}/${del_index_nginx}?pretty" |sed -n '2p'`
           echo "delResult is ${delResult}" >>${CLEAN_LOG}
    fi
done

echo "----------------------------end time is $(date +%Y.%m.%d) ------------------------------" >>${CLEAN_LOG}
}


#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
   case "$#" in
        "2")
  if [ -n "$(echo $2| sed -n "/^[0-9]\+$/p")" ];
       then 
           read -p "Do you want to continue [Y/n]?" BOOLEAN
            case "$BOOLEAN" in
               [yY][eE][sS])
                   echo 'Thanks' $BOOLEAN
               ;;
               [yY])
                    start
                ;;
                *)
                 echo '结束'
                exit 1
                ;;
             esac
        else 
            echo "[$2] 不是自然数,请输入自然数"
   fi
     ;;
   *)
   usage       
    ;;
   esac             
    ;;
  *)
    usage
    ;;
esac

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值