Удаление старых индексов в elasticsearch
У меня есть множество моих журналов, индексированных в формате logstash-Year-Week. То есть, если я хочу удалить индексы старше нескольких недель, как я могу достичь этого в elasticsearch. Есть ли простой, простой способ сделать это?
Ответы
Ответ 1
Куратор будет идеальным сочетанием здесь.
Вы можете найти ссылку здесь - https://github.com/elastic/curator
Команда вроде ниже должна работать нормально -
curator --host <IP> delete indices --older-than 30 --prefix "twitter-" --time-unit days --timestring '%Y-%m-%d'
Вы можете сохранить это в CRON для временного удаления индексов.
Здесь вы можете найти несколько примеров и документов - https://www.elastic.co/guide/en/elasticsearch/client/curator/current/examples.html
Ответ 2
Если вы используете elasticsearch версии 5.x, вам необходимо установить куратора версии 4.x.
Вы можете увидеть шаги совместимости версий и установки из документации
После установки. Затем просто запустите команду
curator --config path/config_file.yml [--dry-run] path/action_file.yml
Куратор предоставляет флаг сухого пробела, чтобы просто выводить то, что куратор выполнил. Вывод будет в вашем файле журнала, который вы определили в файле config.yml. Если не зарегистрирован ключ, определенный в файле config_file.yml, то кассир выведет на консоль. Чтобы удалить индексы, выполните приведенную выше команду без флага -dry-run
Конфигурационный файл config_file.yml
---
client:
hosts:
- 127.0.0.1
port: 9200
logging:
loglevel: INFO
logfile: "/root/curator/logs/actions.log"
logformat: default
blacklist: ['elasticsearch', 'urllib3']
Файл действия action_file.yml
---
actions:
1:
action: delete_indices
description: >-
Delete indices older than 7 days (based on index name), for logstash-
prefixed indices. Ignore the error if the filter does not result in an
actionable list of indices (ignore_empty_list) and exit cleanly.
options:
ignore_empty_list: True
timeout_override:
continue_if_exception: False
disable_action: False
filters:
- filtertype: pattern
kind: prefix
value: logstash-
exclude:
- filtertype: age
source: name
direction: older
timestring: '%Y.%m.%d'
unit: days
unit_count: 7
exclude:
Если вы хотите удалить индексы еженедельно, ежемесячно и т.д. автоматически. Затем просто напишите bash script как
#!/bin/bash
# Script to delete the log event indices of the elasticsearch weekly
#This will delete the indices of the last 7 days
curator --config /path/config_file.yml /path/action_file.yml
Поместите оболочку script в одну из следующих папок: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly
и ваша работа выполнена.
ПРИМЕЧАНИЕ. Обязательно используйте правильный отступ в конфигурационных файлах и файлах действий. В противном случае это не сработает.
Ответ 3
Я использую bash script, просто измените 30 С# днями, которые вы хотите сохранить
#!/bin/bash
# Zero padded days using %d instead of %e
DAYSAGO=`date --date="30 days ago" +%Y%m%d`
ALLLINES=`/usr/bin/curl -s -XGET http://127.0.0.1:9200/_cat/indices?v | egrep logstash`
echo
echo "THIS IS WHAT SHOULD BE DELETED FOR ELK:"
echo
echo "$ALLLINES" | while read LINE
do
FORMATEDLINE=`echo $LINE | awk '{ print $3 }' | awk -F'-' '{ print $2 }' | sed 's/\.//g' `
if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
then
TODELETE=`echo $LINE | awk '{ print $3 }'`
echo "http://127.0.0.1:9200/$TODELETE"
fi
done
echo
echo -n "if this make sence, Y to continue N to exit [Y/N]:"
read INPUT
if [ "$INPUT" == "Y" ] || [ "$INPUT" == "y" ] || [ "$INPUT" == "yes" ] || [ "$INPUT" == "YES" ]
then
echo "$ALLLINES" | while read LINE
do
FORMATEDLINE=`echo $LINE | awk '{ print $3 }' | awk -F'-' '{ print $2 }' | sed 's/\.//g' `
if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
then
TODELETE=`echo $LINE | awk '{ print $3 }'`
/usr/bin/curl -XDELETE http://127.0.0.1:9200/$TODELETE
sleep 1
fi
done
else
echo SCRIPT CLOSED BY USER, BYE ...
echo
exit
fi
Ответ 4
Взгляните на Curator - инструмент, разработанный специально для такого типа использования.
Примерная команда для документации:
curator --host 10.0.0.2 delete indices --older-than 30 --time-unit days \
--timestring '%Y.%m.%d'
Ответ 5
yanb (еще один bash)
#!/bin/bash
searchIndex=logstash-monitor
elastic_url=logging.core.k94.kvk.nl
elastic_port=9200
date2stamp () {
date --utc --date "$1" +%s
}
dateDiff (){
case $1 in
-s) sec=1; shift;;
-m) sec=60; shift;;
-h) sec=3600; shift;;
-d) sec=86400; shift;;
*) sec=86400;;
esac
dte1=$(date2stamp $1)
dte2=$(date2stamp $2)
diffSec=$((dte2-dte1))
if ((diffSec < 0)); then abs=-1; else abs=1; fi
echo $((diffSec/sec*abs))
}
for index in $(curl -s "${elastic_url}:${elastic_port}/_cat/indices?v" | grep -E " ${searchIndex}-20[0-9][0-9]\.[0-1][0-9]\.[0-3][0-9]" | awk '{ print $3 }'); do
date=$(echo ${index: -10} | sed 's/\./-/g')
cond=$(date +%Y-%m-%d)
diff=$(dateDiff -d $date $cond)
echo -n "${index} (${diff})"
if [ $diff -gt 1 ]; then
echo " / DELETE"
# curl -XDELETE "${elastic_url}:${elastic_port}/${index}?pretty"
else
echo ""
fi
done
Ответ 6
curator_cli delete_indices --filter_list '{"filtertype":"none"}'
удалит все или фильтрует:
--filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]'