Elasticsearch-curator自动清理索引数据

继续接着上一篇文章进行聊,在上一期构建了一个ELK的集群并且中间使用了redis作为中间件。不过这样会产生一个问题,只要一个应用进行启动运行并且打开了日志就会产生日志数据logstash会不停的将数据交给elasticsearch随着时间的推移elasticsearch收集到的数据越来越多势必会造成将磁盘空间全部塞满并不再填写数据的后果。尤其在测试环境中程序员喜欢将自己开发的应用的日志级别调制为DEBUG那么这样每天的日志数量会非常巨大并且这些日志也不是什么重要的东西,可能保存一周最多一个月就没啥用了。当然在测试环境中可以使用简单粗暴的方法直接去elasticsearch存放日志的位置直接使用rm -rf 将里面的东西清空让elasticsearch重新产生索引和数据,当然在测试环境中这样做只要程序员同意基本没问题,那么生产环境中如果这样做如果产线出事要调取前两天的日志该咋办?所以这种简单粗暴的方法是绝对不可以的。

接下来第二种办法使用curl来调取elasticsearch的接口并且删除对应的索引,使用这样的一条简单的curl命令:curl -XDELETE ‘http://172.16.1.40:9200/logstash-2017.11.*’ 这样表示删除logstash-2017.11后面任意字符的索引,以及索引中的所有数据!记住是删除一个索引而不是删除索引下的数据!不过下载分析一下第二种办法,总的来说比第一种高级而且可以写到cron任务里面去每月删除上个月的数据,不过还是会带来和第一种问题一样的问题,如果我十二月一日删除了整个十一月的数据那么恰好十二月一号晚上生产环境出现了问题需要查看十一月29号的日志咋办?所以这个办法只是多了一命令和可直观删除数据的感觉。

不过如果要删除前7天的数据那么还得写个脚本使用date打出除了当天前7天的时间,随后使用循环命令来删除该7天的索引,当然这样的条件是一个写一个精巧的脚本。不过初学者建议这么干可以增加对shell的理解,不过如果是在工作中可能不会给你这么多时间去写脚本、测脚本和最后使用脚本的时间的。不过这种脚本还带来了一个弊端那就是对于日志的命名,通常对索引名字的命名可不是使用logstash-%{+YYYY.MM.dd}这样命名的这样你是无法看到那个项目的哪个应用。通常的命名方式其实是:项目名-应用名-[是否是支杆应用]-当前时间。如果对logstash的output的index选项不是非常了解查看官网的解释!如果还是使用脚本方式清除日志那么脚本的容量会大大提高(因为命名方式很多!),况且接下里介绍一款更加”如日中天”的工具!

关于Elasticsearch-curator:

接下来登场的是一款由python研发的非常轻量级的工具:Elasticsearch-curator虽然在官网中没有放在非常显眼的位置不过大家使用搜索框可以搜索到对应的相关文档的。官方文档点我

其实使用curator不仅仅可以删除多余的索引其实还有其他功能也能使用比如:添加别名、创建快照、删除快照、添加索引、删除索引、索引设置等等内容。并且可以将这些设置定义在YAML风格的配置文件中,看到了是YAML风格的配置文件而不是该死的XML…

所以根据综上所述选择”如日中天”的curator肯定比前两个“笨办法”要好的多。不过吹了这么多首先看看安装与具体实战运用!

关于下载与安装Elasticsearch-curator:

下载可以使用python的pip工具自动下载和安装,如果不懂python的同学可以直接下载官网的rpm或者deb包进行安装。这个链接是使用rpm包安装或者添加yum repo使用yum进行安装。

安装Elasticsearch-curator也非常简单如果下载好了rpm包直接使用yum local install elasticsearch-curator-*安装即可,非常简单。安装完毕以后使用rpm -ql查看生成的文件。

关于使用Elasticsearch-curator:

根据上一篇博客的拓扑我来进行如下改进:

  • 改进索引名称,在索引的后面添加时间
  • 更改tomcat的索引前缀不使用logstash
  • 更改nginx的索引前缀不适用logstash

首先下载rpm包并且安装Elasticsearch-curator:

#首先进入172.16.1.40主机来安装curator:
[root@localhost ~] wget https://packages.elastic.co/curator/5/centos/7/Packages/elasticsearch-curator-5.3.0-1.x86_64.rpm
#随后安装:
[root@localhost ~] yum install -y elasticsearch-curator-5.2.0-1.x86_64.rpm #安装会安装在/opt目录下

使用curator_cli命令行接口来查看当前elasticsearch的索引:

[root@localhost ~] curator_cli --host 172.16.1.40 --port 9200 show_indices
.kibana
logstash_nginx
logstash_tomcat
#不过上面的命令不能查看到该索引的大小创建时间等详细信息可是使用--verbos来查看:
[root@localhost ~] curator_cli --host 172.16.1.40 --port 9200 show_indices --verbose
.kibana open 20.2KB 4 1 1 2017-09-22T08:50:32Z
logstash_nginx open 239.0KB 88 5 1 2017-09-25T05:57:26Z
logstash_tomcat open 165.0KB 134 5 1 2017-09-25T05:57:28Z

接下来创建yaml文件,首先是config文件:

[root@localhost ~] vim config.yml</pre>
# Remember, leave a key empty if there is no value. None will be a string,
# not a Python "NoneType"
client:
hosts: #添加elasticsearch节点如果由多台按照下面格式添加
- 172.16.1.40
port: 9200 #设置端口
url_prefix:
use_ssl: False
certificate:
client_cert:
client_key:
ssl_no_validate: False
http_auth:
timeout: 30
master_only: False

logging:
loglevel: DEBUG #日志级别默认为INFO建议测试调整为DEBUG
logfile: /var/log/elasticsearch/elasticsearch-curator.log #日志存放位置
logformat: default
blacklist: ['elasticsearch', 'urllib3']

其实上述的config中logging无需定义默认会输出到标准输出并且以INFO级别显示。接下来创建这次的核心内容清理指定索引:

[root@localhost ~] vim delete_index.yml
# Remember, leave a key empty if there is no value. None will be a string,
# not a Python "NoneType"
#
# Also remember that all examples have 'disable_action' set to True. If you
# want to use this action as a template, be sure to set this to False after
# copying it.
actions:
 1: #这里的1表示第一个执行那么如果有多个执行顺序那么表示1 2 3表示
   action: delete_indices #选择的选项
   description: "Delete nginx- index" #信息显示,最后只是打在日志上
   options: #选项相关
     ignore_empty_list: True #将空表出现的内容放到日志中,默认是False显示在前台
     disable_action: False #建议设为FLase否则有些关键Debug信息不会打在日志上
   filters: #管道
   - filtertype: pattern #筛选索引名称
     kind: prefix #匹配索引前半段内容,除此之外还可以使用suffix(删选后半段内容)、
#timestring(通过筛选时间只有index值为*%{+YYYY.MM.dd}*的时候可以使用)、regex(使用自由风格的正则表达式)
     value: nginx- #选好匹配的选项后填写匹配信息详细看<a href="https://www.elastic.co/guide/en/elasticsearch/client/curator/5.3/filtertype_pattern.html">这里</a>
   - filtertype: age #筛选时间选项
     source: name #通过指定的时间格式名字来筛选,其实还有下面的creation_date(索引创建时间)
#和field_stats(通过字段中的域:就是在kibana看到的Available Fields中的字段来匹配)详细看<a href="https://www.elastic.co/guide/en/elasticsearch/client/curator/5.3/filtertype_age.html#_literal_field_stats_literal_based_ages">这里</a>
     direction: older #从现在往后算,一般都这么选除非你要保留历史数据删除现在数据
     timestring: '%Y.%m.%d' #时间格式
     unit: days #时间单位从年到小时随意选择
     unit_count: 7 #时间间隔,现在是从当前时间小于7天的
 2:
   action: delete_indices
   description: "Delect tomcat- index"
   options:
     ignore_empty_list: True
     disable_action: False
   filters:
   - filtertype: pattern
   kind: regex
   value: tomcat-
   - filtertype: age
     source: creation_date
     direction: older
     unit: days
     unit_count: 7

注意:一个索引进行匹配只能定义在一个任务中,千万别自作聪明的这样写:

filters:
– filtertype: pattern
kind: prefix
value: nginx-
– filtertype: pattern
kind: regex
value: tomcat-
– filtertype: age
source: name
direction: older
timestring: ‘%Y.%m.%d’
unit: days
unit_count: 7

这样表示为首先过滤nginx-的索引头部然后从nginx-字段中再匹配tomcat-的索引头部,而不是达到及匹配nginx-和tomcat-的索引首部。这样就算把curator应用配置完毕,接下来配置logstash.

修改172.16.1.30主机的logstash的output:
[root@localhost ~] vim /etc/logstash/conf.d/logstash_index.conf
output {
  if "_grokparsefailure" in [tags] {
  }else{
    if [type] == "nginx"{
     elasticsearch {
      hosts => ["172.16.1.40:9200"]
      index => "nginx-%{+YYYY.MM.dd}" #就改一下索引就行其他的看<a href="https://www.cookiesinn.org/build_elasticsearch_logstash_kibana_2/">上一篇</a>
     }
    }
    if [type] == "tomcat"{
     elasticsearch {
      hosts => ["172.16.1.40:9200"]
      index => "tomcat-%{+YYYY.MM.dd}"
     }
    }
  }
}

这样就算好了,随后重启172.16.1.30的logstash即可。

查看效果:

在查看效果之前首先我们得多调整记得时间的状态让其形成多个索引,通过修改时间的办法进行,nginx通过网页多刷新几次,tomcat多重启几次就有日志了!我这边已经做好了索引,大家可以看一下:

#首先修改时间,这里直接我用了ansible就不想一个一个手动执行了。不知道ansible?看<a href="https://www.cookiesinn.org/how_to_use_ansible/">这里</a>
[root@localhost logs] ansible elasticsearch -m command -a 'date -s "2017-11-3 17:00:00"'
#随后查看索引
[root@localhost yum.repos.d] curator_cli --host 172.16.1.40 --port 9200 show_indices --verbose
.kibana open 20.2KB 4 1 1 2017-09-22T08:50:32Z
logstash_nginx open 239.0KB 88 5 1 2017-09-25T05:57:26Z
logstash_tomcat open 165.0KB 134 5 1 2017-09-25T05:57:28Z
nginx-2017.09.26 open 140.1KB 38 5 1 2017-09-26T02:58:56Z
nginx-2017.11.02 open 288.1KB 113 5 1 2017-11-02T01:16:01Z
nginx-2017.11.03 open 141.0KB 45 5 1 2017-11-03T09:00:11Z
tomcat-2017.09.26 open 166.1KB 47 5 1 2017-09-26T03:01:09Z
tomcat-2017.11.02 open 272.2KB 94 5 1 2017-11-02T01:16:48Z
tomcat-2017.11.03 open 324.0B 47 5 1 2017-11-03T09:00:31Z

看来日期的索引已经够够了,接下来实验测试一下删除7天前的索引!

[root@localhost ~] curator --config config.yml delete_index.yml --dry-run
#这边表示只干跑一遍不会修改任何东西接下来看看日志:
cat /var/log/elasticsearch/elasticsearch-curator.log | grep "INFO"
2017-11-03 17:31:09,513 INFO curator.cli run:144 Preparing Action ID: 1, "delete_indices"
2017-11-03 17:31:09,522 INFO curator.cli run:165 Trying Action ID: 1, "delete_indices": Delete nginx- index
2017-11-03 17:31:09,548 INFO curator.utils show_dry_run:811 DRY-RUN MODE. No changes will be made.
2017-11-03 17:31:09,548 INFO curator.utils show_dry_run:814 (CLOSED) indices may be shown that may not be acted on by action "delete_indices".
2017-11-03 17:31:09,548 INFO curator.utils show_dry_run:821 DRY-RUN: delete_indices: nginx-2017.09.26 with arguments: {}
2017-11-03 17:31:09,548 INFO curator.cli run:194 Action ID: 1, "delete_indices" completed.
2017-11-03 17:31:09,549 INFO curator.cli run:144 Preparing Action ID: 2, "delete_indices"
2017-11-03 17:31:09,554 INFO curator.cli run:165 Trying Action ID: 2, "delete_indices": Delect tomcat- index
2017-11-03 17:31:09,577 INFO curator.utils show_dry_run:811 DRY-RUN MODE. No changes will be made.
2017-11-03 17:31:09,577 INFO curator.utils show_dry_run:814 (CLOSED) indices may be shown that may not be acted on by action "delete_indices".
2017-11-03 17:31:09,577 INFO curator.utils show_dry_run:821 DRY-RUN: delete_indices: tomcat-2017.09.26 with arguments: {}
2017-11-03 17:31:09,577 INFO curator.cli run:194 Action ID: 2, "delete_indices" completed.
2017-11-03 17:31:09,577 INFO curator.cli run:195 Job completed.
#由于debug日志太多了,所以我筛选出INFO日志给大家看看!

分析日志:

一共删除两个索引nginx-2017-09月份的还有一个就是tomcat-09月份的,在show_dry_run:811这里显示DRY-RUN MODE. No changes will be made.这边大家肯定感觉到非常奇怪,所以我还是建议打开DEBUG日志看看在进行过滤之前curator会便利所有的elasticsearch索引随后在进行筛选所以之前有的logstash_*不匹配所以就没做变动!

直接执行看看执行结果:

[root@localhost ~] curator --config config.yml delete_index.yml
[root@localhost ~] curator_cli --host 172.16.1.40 --port 9200 show_indices --verbose
.kibana open 20.2KB 4 1 1 2017-09-22T08:50:32Z
logstash_nginx open 239.0KB 88 5 1 2017-09-25T05:57:26Z
logstash_tomcat open 165.0KB 134 5 1 2017-09-25T05:57:28Z
nginx-2017.11.02 open 289.5KB 113 5 1 2017-11-02T01:16:01Z
nginx-2017.11.03 open 142.2KB 45 5 1 2017-11-03T09:00:11Z
tomcat-2017.11.02 open 273.0KB 94 5 1 2017-11-02T01:16:48Z
tomcat-2017.11.03 open 160.4KB 47 5 1 2017-11-03T09:00:31Z

那么结果就是2017年9月26号以nginx- & tomcat-开头的索引全被删除了!接下来可以去kibana去看看这里我就不展示图片了,如果不了解kibana可以看这里

接下来将命令直接卸载crontab任务中以后就能自动执行了!你看多方便!

结语:

这次带来的是一个小工具,并且举了一个运维中非常实用的例子:就是删除过期的索引给宝贵的磁盘腾出空间/除此之外还纠正了大家给索引取名的习惯:项目名-应用名-是否支杆代码-当前日期 这样以后对删除索引来说可是非常方便的,比如项目1的日志保留30天,项目2的体制保留90天。如果没有项目名匹配起来会非常麻烦得使用regex进行自由风格的匹配…那不是自己给自己找麻烦吗?所以起好索引名,对其进行规划也是非常重要滴!

Comments

Leave a Reply

Your email address will not be published. Name and email are required