Elasticsearch中日志rollover的详细操作

2020-05-29 00:00:00 索引 查询 建立 别名 滚动

Elasticsearch中经常会遇到有些日志增量非常快,几天就几百G,虽然ES查个10亿级别的数据也能秒出,但是“柴多米多架不住日子多”啊,时间一长,这种有大量日志的索引查询会变得很慢,实际上这种索引的查询热点分布也是满足二八定律,也就是80%查询是对近期日志的查询,20%的是查询很久之前的历史,因此为了优化对近期日志查询的速度,可以利用Elasticsearch中的rollover接口功能来滚动存储日志,从而达到优化日志查询效率的目的,也方便了对老旧日志数据的管理。rollover功能是先创建一个带别名的索引,然后设定一定的规则,当满足该设定规则(比如间隔了一段时间或者日志大小超过一定阈值后)的时候,Elasticsearch会自动建立新的索引,别名也会自动切换指向新的索引,这样相当于在物理层面自动建立了索引的分区功能,当查询数据落在一段时间内时,会到一个相对小的索引中查询,相对所有日志都在一个大索引里的情况,显然也就加快了查询的效率,下面我们来看看rollover怎么建立。

一、建立索引模板

rollover会滚动建立索引,新建立的索引默认会是indexname-000001......这样的模式,因此,要想新建立的索引具有相同的mapping,那就需要先建立索引模板,建立模板好使用cerebro插件进行(当然如果DSL熟悉的话,用DSL也是可以的),如下图:

这里我们创建了一个以kfjk-*为匹配模式的索引模板,并在模板中建立好对应的mapping,别名如下:

二、建立索引

接下来我们还是通过cerebro建立一个名字叫kfjk-20200312的索引,如下图:

这里我们只是简单设置分片和副本即可,因为前面已经有以kfjk-未匹配模式的索引模板,所以这里的kfjk-20200312索引的mapping将和kfjk-*索引模板的mapping保持一致,打开elasticsearch-head插件,可以看到索引已经创建成功:

这里之所以有两个别名kfjk-cur和kfjk-his,就是在rollover的时候将使用kfjk-cur这个别名进行切换,也就是kfjk-cur将永远指向rollover后新建立的索引,确定查询范围是近期的数据的情况下,可以直接用kfjk-cur查询很短一段时间内的数据,这样速度就很快了;如果需要查历史就可以使用kfjk-his别名;

三、使用logstash向索引写入日志数据

索引建立好了,下面是配置logstash向索引写入数据:

四、编写rollover的滚动条件脚本

现在索引建立好了,也可以写入数据了,接下来就是要让索引的大小到达一定阈值或者过了某一段固定日期之后,让ES自动建立新的索引,并将别名自动切换指向新的索引,以达到滚动索引的目的,这也是rollover名字的来源,设定滚动条件的代码如下:

脚本很简单,其实就一句话,通过索引的rollover接口向索引提交滚动的条件,其中,max_age="30d",就是过30天滚动一次;max_docs表示记录达到多少条后滚动;

五、定时执行rollover进行索引的滚动

将这上面这段执行语句保存在一个脚本里,每天执行一次,每次执行就会去检查对应的条件,如果达到条件,ES就会自动创建新的索引,完成滚动。

如上图,在定时任务里建立了rollover的脚本,每日定时执行,这样,索引就会在达到条件后自动滚动了,至此,索引的rollover就建立成功了。


欢迎关注公z号:【开心感恩】,深入讨论,如果觉得有用,别忘了关注点赞哦!

相关文章