日志生命周期处理

脚本方式

查出 30 天以前的索引并删除:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
curl -H'Content-Type:application/json' -d'{
"query": {
"range": {
"pt": {
"lt": "now-30d",
"format": "epoch_millis"
}
}
}
}
' -XPOST -H "Authorization:Basic ZWxhc3RpYzpTb3BlaU1HcjA5M0AkJV5FTEs=" "https://ip:9200/dev02-*/_delete_by_query?conflicts=proceed"

利用 Elasticsearch 生命周期策略方式(在 Kibana 面板中可以对索引冷热分离管理)

ES 自带一个默认的 logstash-* 的索引模板,ES 内部维护了 template,template 定义好了 mapping,只要 index 的名称被 template 匹配到,那么该 index 的 mapping 就按照 template 中定义的 mapping 自动创建。而且 template 中定义了 index 的 shard 分片数量、replica 副本数量等等属性。

所以我们每次新建一个索引的时候,不需要手动创建 mapping 映射,也不需要手动设置副本和分片数量。

在 Kibana 的图形化界面中可以看到 ES 默认的索引模板:

如果使用默认模板,记得索引要以 logstash- 开头。

点击进入 logstash 索引模板,还能对模板进行编辑。比如设置以下重要 3 个参数:

  • refresh_interval — 索引刷新间隔,一般在 5-10 秒范围内,周期可以设置长一点,有助于提高 ES 性能,减少不必要的刷新
  • number_of_shards — 索引分片数量,在 ES7 版本中默认为 1,在以前的版本默认为 5。一般情况下设置为等同于 ES data 节点的数量
  • number_of_replicas — 默认副本数量为 1,如果有特殊需要,可以在下方设置

这里我克隆了一个模板 template,然后使其关联的索引模式命中到我需要的上面,然后创建一个策略,删除 15 天前的日志:

这里是测试图,所以是一天(注意:如果没有其他快照策略,不要填写快照策略名称):

仅启动热阶段,也未启动滚动更新。然后点操作,将该策略添加到刚才克隆的模板上,再看下索引中是否有被应用上:

正常可能被删除的索引则会这样显示(当前操作和阶段为 delete):

关于索引冷热分离管理

参考:Kibana 索引及索引冷热分离管理

在生产环境部署 ELK + 冷热数据分离笔记中提到,当前业务每天大概 1.5T 左右的日志,规划了 20T 的 SSD 磁盘,刚好可以保留 7 天的日志(副本数为 1)。

开发人员需要将日志保留更久(例如一个月),以便有些故障未能及时发现,可能数周后才去追踪日志,排查故障。

但是,将一个月的日志都存储在 SSD 的磁盘中成本较高。在这种场景中,可以使用冷热分离,将索引数据分开。

例如,7 天内的日志为热数据,该日志查询频率非常高,可以作为热数据,存储在 ES 的热节点;7 天后的日志查询频率就非常低,几乎很少查询,此时可以做为冷数据,存储在 ES 的冷节点。

ES 冷节点通常硬件资源较低,CPU 和内存配置相对热节点较低,磁盘通常采用机械磁盘,一方面冷节点无需太高配置,另一方面节省服务器成本费用。

在生产环境部署 ELK + 冷热数据分离笔记中的 ES 集群截图中,可以看到每个 ES 的 data 节点都有 hot 或者 cold 属性。该属性定义了 ES 的冷热节点角色。

还是在上面的 Kibana 索引生命周期中配置冷热分离。只需开启冷阶段配置即可。配置参考如下: