搭建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