web-dev-qa-db-ja.com

elasticsearchで古いインデックスを削除する

ログの多くはlogstash-Year-Week形式でインデックス付けされています。それは、数週間以上前のインデックスを削除したい場合、どのようにelasticsearchでそれを達成できますか?簡単でシームレスな方法がありますか?

24
steven johns

キュレーターはここでの理想的な試合です。ここにリンクがあります- 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

27
Vineeth Mohan

Elasticsearchバージョン5.xを使用している場合は、キュレーターバージョン4.xをインストールする必要があります。 documentation からバージョンの互換性とインストール手順を確認できます。

インストールしたら。次に、コマンドを実行します

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

Curatorは、Curatorが実行した内容を出力するための予行演習フラグを提供します。出力は、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スクリプトを次のように記述します。

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

次のいずれかのフォルダーにシェルスクリプトを配置します:/etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weeklyこれで作業は完了です。

注:構成ファイルとアクションファイルで正しいインデントを使用してください。それ以外の場合は機能しません。

18
Sachchit Bansal

私はbashスクリプトを使用します、あなたが保持したい日数で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
12

キュレーター をご覧ください。この種のユースケースのために特別に開発されたツールです。

ドキュメント用のサンプルコマンド:

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

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    
0
Bob
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"}]'
0
Vlad Cenan