Eliminando antiguos índices en elasticsearch.
logstash filter (6)
Tengo muchos de mis registros indexados en formato logstash-Year-Week. Es decir, si quiero eliminar índices más antiguos que unas pocas semanas, ¿cómo puedo lograr eso en elasticsearch? ¿Hay una manera fácil y perfecta de hacer eso?
Curador sería un partido ideal aquí. Puede encontrar el enlace aquí: https://github.com/elastic/curator
Un comando como el de abajo debería funcionar bien.
curator --host <IP> delete indices --older-than 30 --prefix "twitter-" --time-unit days --timestring ''%Y-%m-%d''
Puede mantener esto en el CRON para eliminar los índices ocasionalmente.
Puede encontrar algunos ejemplos y documentos aquí: https://www.elastic.co/guide/en/elasticsearch/client/curator/current/examples.html
Eche un vistazo a https://www.elastic.co/guide/en/elasticsearch/client/curator/current/examples.html , una herramienta desarrollada especialmente para este tipo de caso de uso.
Un comando de muestra, para la documentación:
curator --host 10.0.0.2 delete indices --older-than 30 --time-unit days /
--timestring ''%Y.%m.%d''
Si está utilizando la versión 5.x de elasticsearch, debe instalar la versión 4.x del curador. Puede ver los pasos de compatibilidad e instalación de la versión en la documentation
Una vez instalada. Luego simplemente ejecuta el comando
curator --config path/config_file.yml [--dry-run] path/action_file.yml
Curator proporciona una bandera de ejecución en seco para mostrar solo lo que Curator habría ejecutado. La salida estará en su archivo de registro que ha definido en el archivo config.yml. Si no se registra la clave definida en config_file.yml, entonces currator se enviará a la consola. Para eliminar los índices, ejecute el comando anterior sin --dry-run flag
El archivo de configuración config_file.yml es
---
client:
hosts:
- 127.0.0.1
port: 9200
logging:
loglevel: INFO
logfile: "/root/curator/logs/actions.log"
logformat: default
blacklist: [''elasticsearch'', ''urllib3'']
El archivo de acción action_file.yml es
---
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:
Si desea eliminar los índices semanalmente, mensualmente, etc. automáticamente. Entonces solo escribe el guión de bash como
#!/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
Ponga un script de shell en una de estas carpetas: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly
y su trabajo está listo.
NOTA: Asegúrese de usar la sangría correcta en sus archivos de configuración y acción. De lo contrario, no funcionará.
Uso un script de bash, solo cambio los 30 con el número de días que desea conservar
#!/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
yanb (otro golpe)
#!/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
curator_cli delete_indices --filter_list ''{"filtertype":"none"}''
borrará todo o filtrará:
--filter_list ''[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]''