Supprimer les anciens indices dans elasticsearch

j'ai la plupart de mes journaux indexés dans le format logstash-Year-Week. C'est-à-dire si je veux supprimer des indices plus vieux que quelques semaines, Comment puis-je atteindre cela dans elasticsearch. Est-il facile, sans couture façon de le faire?

20
demandé sur steven johns 2015-10-30 09:33:53

6 réponses

conservateur serait une correspondance idéale ici. Vous pouvez trouver le lien ici - https://github.com/elastic/curator

Une commande comme ci-dessous devrait fonctionner parfaitement -

curator --host <IP> delete indices --older-than 30 --prefix "twitter-" --time-unit days  --timestring '%Y-%m-%d'

Vous pouvez garder cela dans le CRON pour enlever les indices de temps en temps.

Vous pouvez trouver quelques exemples et docs ici - https://www.elastic.co/guide/en/elasticsearch/client/curator/current/examples.html

22
répondu Vineeth Mohan 2015-11-02 12:12:41

si vous utilisez elasticsearch version 5.x ensuite, vous devez installer la version 4 du conservateur.x. Vous pouvez voir la compatibilité de la version et les étapes d'installation à partir du documentation

une Fois installé. Ensuite, il suffit d'exécuter la commande

curator --config path/config_file.yml [--dry-run] path/action_file.yml

Le Conservateur fournit un indicateur d'exécution à sec pour juste afficher ce que le conservateur aurait exécuté. La sortie sera dans votre fichier log que vous avez défini dans config.fichier yml. Si l'exploitation forestière clé définie dans config_file.yml alors currator va sortir à la console. Pour supprimer les indices, lancez la commande ci-dessus sans drapeau --dry-run

Le fichier de configuration 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']

le fichier d'action 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:

Si vous souhaitez supprimer les indices hebdomadaire, mensuel, etc automatiquement. Alors écrivez le script de bash comme

#!/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

mettez un script shell dans l'un de ces dossiers: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly et votre travail est faire.

NOTE: assurez-vous d'utiliser la bonne indentation dans vos fichiers de configuration et d'action. Sinon il ne fonctionnera pas.

16
répondu Sachchit Bansal 2017-02-16 08:20:13

j'utilise un script bash, il suffit de changer le 30 avec le nombre de jours que vous souhaitez conserver

#!/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  }' | awk -F'-' '{ print  }' | sed 's/\.//g' ` 
  if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
  then
    TODELETE=`echo $LINE | awk '{ print  }'`
    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  }' | awk -F'-' '{ print  }' | sed 's/\.//g' `
    if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
    then
      TODELETE=`echo $LINE | awk '{ print  }'`
      /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
10
répondu Alejandro Teijeiro 2016-10-06 19:09:37

regardez Conservateur, un outil développé spécialement pour ce genre de cas d'utilisation.

une commande Exemple, pour la documentation:

curator --host 10.0.0.2 delete indices --older-than 30 --time-unit days \
   --timestring '%Y.%m.%d'
6
répondu Andrei Stefan 2015-10-30 06:39:41

yanb (encore un bash)

#!/bin/bash
searchIndex=logstash-monitor
elastic_url=logging.core.k94.kvk.nl
elastic_port=9200

date2stamp () {
    date --utc --date "" +%s
}

dateDiff (){
    case  in
        -s)   sec=1;      shift;;
        -m)   sec=60;     shift;;
        -h)   sec=3600;   shift;;
        -d)   sec=86400;  shift;;
        *)    sec=86400;;
    esac
    dte1=$(date2stamp )
    dte2=$(date2stamp )
    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  }'); 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    
0
répondu Bob 2016-09-28 11:53:23
curator_cli delete_indices --filter_list '{"filtertype":"none"}' 

supprimera tout ou filtrera:

 --filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]'
0
répondu Vlad Cenan 2017-11-29 12:20:32