关于使用ELK的记录

最近因为公司系统项目统计压力大 。mysql集群查询进入瓶颈,索引优化也不能快速响应统计结果,于是接入 Elasticsearch、Logstash、Kibana 三大开源套餐。

https://www.elastic.co/cn/

关于  Logstash 其实还可以使用ali DataX 也是可以的 功能比 Logstash 还要更上一层楼。我采用的还是Logstash,因为ali DataX 我是后面才知道的,所以就没有去替换掉了。

通过 Logstash抓取过滤mysql统计数据,增量同步到Elasticsearch中。

再通过项目java api 调用 Elasticsearch查询;

Kibana 可以web可视化集群,索引具体情况。

Elasticsearch查询语句挺简单,但是感觉官网的例子不是很多,很多比较复杂的聚合需要自己摸索。

整个学习难度不是很高。入手很快

java api jar 使用的是 elasticsearch-rest-high-level-client

之后再根据业务场景自己封装了一下工厂,抽象了几层代码给开发人员使用。

api的查询和得到结果集方法可能是操作起来有点麻烦,但其实只要对着查询语句写的话。其实还是很好理解的

总的感觉还是比较友善。所有的软件都是安装即可用,不过还是需要改一下配置,这个就不多说了。ip 端口,中文英文,密码等等。

公司主要是做统计,于是通过 Logstash 抓取关键统计数据,公司几百万数据抓取关键统计数据只有100m不到。这也可以大大提升es 聚合统计的速度,所以不建议把整张表都抓取进来,只拿最主要的统计字段。

所有流程如图:

这也是我给我们公司员工写的流程图。

其实如果抓取数据量极大,可以在中间使用kafaka进行缓存再次筛选。由于我们公司数据量并没有这么高,也就不用过分去开销其他服务器资源。

Kibana 现在已经很完善了,写官方的Query DSL 语句也可以,写SQL语句也可以,但官方还是推荐使用 Query DSL 语句进行聚合与查询

关于增量同步,更新同步数据,我采用的方案是在抓取的数据表上设置data_version字段(乐观锁原理,数据版本号),一旦某条数据进行了修改或者是新增的数据,data_version这个值将会设置,我设置的是时间戳(公司业务原因),建议给此字段设置bigint类型,timestamp只能使用到2028年。

这样就给了数据一个版本,在同步增量与更新数据时,只会抓取data_version 改变过的数据。大大降低mysql服务器,Logstash,Elasticsearch的压力。

Logstash 可以记录上次抓取数据最后一条数据的 data_version 值。这样在下一次抓取数据时,带上 上一次的data_version 值,就可以通过where条件过滤出来有效数据。当然sql里面是要对data_version 进行排序的,因为Logstash 只会记录上次抓取时最后一条数据的data_version 值。

不然每一次同步数据都要全表同步吗?那压力可想而知。应该没人会采用,全表同步只是第一次同步时会全表同步。之后都是增量与更新数据同步。