删除弹性搜索中的旧索引

Posted

技术标签:

【中文标题】删除弹性搜索中的旧索引【英文标题】:Removing old indices in elasticsearch 【发布时间】:2016-01-30 12:41:28 【问题描述】:

我的许多日志都以 logstash-Year-Week 格式编入索引。也就是说,如果我想删除几周前的索引,我如何在弹性搜索中实现这一点。有没有一种简单、无缝的方法来做到这一点?

【问题讨论】:

【参考方案1】:

Curator 将是这里的理想搭档。 你可以在这里找到链接 - 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

【讨论】:

这就是我想要的。你有关于馆长申请的文件吗? 这不适用于 curator v4 或更高版本。它需要一个配置文件和一个动作文件,其中描述了策展人的动作。 查看@sachchit-bansal 的回答,了解工作中的馆长 4.2 示例【参考方案2】:

如果您使用的是 elasticsearch 5.x 版,那么您需要安装 curator 4.x 版。 可以从documentation看到版本兼容性和安装步骤

安装后。然后只需运行命令

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

Curator 提供了一个预运行标志来输出 Curator 将执行的操作。输出将在您在 config.yml 文件中定义的日志文件中。如果未在 config_file.yml 中定义记录键,则 currator 将输出到控制台。要删除索引,请在不带 --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

将 shell 脚本放入以下文件夹之一:/etc/cron.daily, /etc/cron.hourly, /etc/cron.monthly or /etc/cron.weekly,您的工作就完成了。

注意:确保在配置和操作文件中使用正确的缩进。否则将无法正常工作。

【讨论】:

谢谢,这是策展人 4.2 答案的当前(2017 年)工作版本 :) 策展人就是这样工作的! Vineeth Mohan 的答案在 curator 4.x 上已经过时了 - 这应该适用于现在的大多数弹性搜索安装(5.x 是当前版本)。【参考方案3】:

我使用 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

【讨论】:

它实际上运行良好,不需要安装像 Curator 这样的额外工具。【参考方案4】:

从 elasticsearch 6.6 开始,Index Lifecycle Management 包含在基本(免费)版本的 elasticsearch 中,并以更优雅的方式完成了 Curator 过去的工作。

以下步骤未经授权转载Martin Ehrnhöfer优秀简洁的blog post。

假设(注意复制粘贴):

您的 elasticsearch 服务器可通过 http://elasticsearch:9200 访问 您希望在 30 天后清除索引 (30d) 您的策略名称将创建为cleanup_policy 您的文件节拍索引名称以filebeat- 开头 您的 logstash 索引名称以 logstash- 开头

1。创建一个月后删除索引的策略

curl -X PUT "http://elasticsearch:9200/_ilm/policy/cleanup_policy?pretty" \
     -H 'Content-Type: application/json' \
     -d '
      "policy":                        
        "phases": 
          "hot":                       
            "actions": 
          ,
          "delete": 
            "min_age": "30d",           
            "actions":  "delete":  
          
        
      
    '

2。将此策略应用于所有现有的 filebeat 和 logstash 索引

curl -X PUT "http://elasticsearch:9200/logstash-*/_settings?pretty" \
     -H 'Content-Type: application/json' \
     -d ' "lifecycle.name": "cleanup_policy" '
curl -X PUT "http://elasticsearch:9200/filebeat-*/_settings?pretty" \
     -H 'Content-Type: application/json' \
     -d ' "lifecycle.name": "cleanup_policy" '

3。创建模板以将此策略应用于新的 filebeat 和 logstash 索引

curl -X PUT "http://elasticsearch:9200/_template/logging_policy_template?pretty" \
     -H 'Content-Type: application/json' \
     -d '
      "index_patterns": ["filebeat-*", "logstash-*"],                 
      "settings":  "index.lifecycle.name": "cleanup_policy" 
    '

【讨论】:

【参考方案5】:

看看Curator,一个专门为这种用例开发的工具。

一个示例命令,用于文档:

curator --host 10.0.0.2 delete indices --older-than 30 --time-unit days \
   --timestring '%Y.%m.%d'

【讨论】:

【参考方案6】:

你可以使用 curl

 curl -X DELETE http://localhost:9200/filebeat-$(date +"%Y.%m.%d" -d "last Month")

这个必须把这个命令加到xxx.sh,然后就可以创建crontab了。 crontab -e

00 00 * * * /etc/elasticsearch/xxx.sh

这个 cron 将在每天中午 12 点运行,它会删除旧日志。

【讨论】:

这就是你所需要的。【参考方案7】:
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"]'

【讨论】:

【参考方案8】:

yanb(又一个 bash)

#!/bin/bash
searchIndex=logstash-monitor
elastic_url=localhost
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    

【讨论】:

【参考方案9】:

策展人没有帮助我

现在 Curator 在使用以下命令运行它时给我一个错误:

curator --config config_file.yml action_file.yml

错误:

Error: Elasticsearch version 7.9.1 incompatible with this version of Curator (5.2.0)

找不到与 Elasticsearch 7.9.1 兼容的 curator 版本,我不能只升级或降级 elasticsearch 版本。因此,我使用了@Alejandro 的答案,并使用下面的脚本进行了操作。我稍微修改了脚本

脚本解决方案

#!/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`
# Just add -u <username>:<password> in curl statement if your elastic search is behind the credentials. Also, you can give an additional grep statement to filter out specific indexes

echo
echo "THIS IS WHAT SHOULD BE DELETED FOR ELK:"
echo

echo "$ALLLINES" | while read LINE
do
  FORMATEDLINE=`echo $LINE | awk ' print $3 ' | grep -Eo "[0-9]4.[0-9]2.[0-9]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 "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 ' | grep -Eo "[0-9]4.[0-9]2.[0-9]2" | sed 's/\.//g'`
    if [ "$FORMATEDLINE" -lt "$DAYSAGO" ]
    then
      TODELETE=`echo -n $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

【讨论】:

【参考方案10】:

在我的情况下,删除旧索引是强制性的,因为我已经从 5.X 升级到 7.5 版本,

所以我按照简单的步骤来清除索引。

rm -rf /var/lib/elasticsearch/nodes/0/indices/*

【讨论】:

但是绕过官方 API 做任何事情都是不好的。

以上是关于删除弹性搜索中的旧索引的主要内容,如果未能解决你的问题,请参考以下文章

我应该对弹性搜索中的非日志数据使用基于时间的索引吗?

我想通过在 React Js 中的旧页面下方添加新的结果页面来在我的弹性搜索结果中启用分页

SYSLOG-NG:将相同的日志发送到弹性搜索中的两个不同索引

如何使用弹性搜索索引 10 亿行 CSV 文件?

从弹性搜索中的评分中删除提升项

如何在弹性搜索中创建索引和类型?