wake-up-neo.com

Alte Indizes in der Elasticsearch entfernen

Ich habe viele meiner Protokolle im logstash-Year-Week-Format indexiert. Das heißt, wenn ich Indizes löschen möchte, die älter als ein paar Wochen sind, wie kann ich das in der Elasticsearch erreichen? Gibt es eine einfache, nahtlose Möglichkeit, dies zu tun?

22
steven johns

Kurator wäre hier ein ideales Gegenstück .. __ Den Link finden Sie hier - https://github.com/elastic/curator

Ein Befehl wie unten sollte gut funktionieren - 

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

Sie können dies im CRON beibehalten, um die Indizes gelegentlich zu entfernen. 

Einige Beispiele und Dokumente finden Sie hier - https://www.elastic.co/guide/de/elasticsearch/client/curator/current/examples.html

24
Vineeth Mohan

Wenn Sie Elasticsearch Version 5.x verwenden, müssen Sie die Curator-Version 4.x ..__ installieren. Die Versionskompatibilität und Installationsschritte finden Sie in der Dokumentation

Einmal installiert Dann einfach den Befehl ausführen 

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

Curator stellt ein Trockenlauf-Flag bereit, um nur das auszugeben, was Curator ausgeführt hätte. Die Ausgabe erfolgt in Ihrer Protokolldatei, die Sie in der Datei config.yml definiert haben. Wenn der in config_file.yml definierte Protokollierungsschlüssel nicht vorhanden ist, wird der Currator an die Konsole ausgegeben. Um die Indizes zu löschen, führen Sie den obigen Befehl ohne die Option --dry-run aus

Die Konfigurationsdatei config_file.yml lautet 

---
client:
  hosts:
   - 127.0.0.1
  port: 9200
logging:
  loglevel: INFO
  logfile: "/root/curator/logs/actions.log"
  logformat: default
  blacklist: ['elasticsearch', 'urllib3']

Die Aktionsdatei action_file.yml lautet 

---
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:

Wenn Sie die Indizes wöchentlich, monatlich usw. automatisch löschen möchten. Dann schreibe einfach das Bash-Skript 

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

Legen Sie ein Shell-Skript in einen der folgenden Ordner: /etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly und Ihre Aufgabe ist erledigt.

HINWEIS: Stellen Sie sicher, dass Sie in Ihren Konfigurations- und Aktionsdateien den richtigen Einzug verwenden. Sonst funktioniert es nicht.

16
Sachchit Bansal

Ich benutze ein Bash-Skript. Ändere einfach die 30 mit der Anzahl der Tage, die du behalten möchtest

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

Werfen Sie einen Blick auf Curator , ein speziell für diesen Anwendungsfall entwickeltes Werkzeug.

Ein Beispielbefehl für die Dokumentation:

curator --Host 10.0.0.2 delete indices --older-than 30 --time-unit days \
   --timestring '%Y.%m.%d'
6
Andrei Stefan

yanb (noch eine 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    
0
Bob
curator_cli delete_indices --filter_list '{"filtertype":"none"}' 

wird alles löschen oder filtern:

 --filter_list '[{"filtertype":"age","source":"creation_date","direction":"older","unit":"days","unit_count":13},{"filtertype":"pattern","kind":"prefix","value":"logstash"}]'
0
Vlad Cenan