使用ELK辅助监控开发测试环境服务质量和问题定位
什么是ELK?
ELK 是 elasticsearch + logstash + kibana的缩写。这一套是现在比较流行的日志全文索引系统了。我之前的项目也有用它来做过日志分析,这次主要是拿来搭建开发测试环境的监控和分析系统,顺带记录一下部署脚本和流程。
其中 elasticsearch 是日志索引系统,我按两个master,3个数据和处理节点来部署。 logstash 和 kibana 因为是开发测试环境使用,量级不大,所以只部署了一个节点。但是在使用过程中发现 elasticsearch 在jre的GC的时候还是有较长时间的 Stop The World 的问题,而且这期间的数据会倍丢弃。所以为了缓解这个状况,又引入了 redis 作为消息队列使用。然后使用两组pipeline,一个从 client -> logstash -> redis ,另一个从 redis -> logstash -> elasticsearch 来传输。这样如果在 elasticsearch GC的 Stop The World 结束的时候会把数据补回去。 外面更大型的部署也有用 kafka 或者更进一步优化的 pulsar。不过我们目前的应用也不太需要 kafka 和 pulsar 那种数据落地和强一致性,使用 redis 也已经够了。
后面的脚本都已 6.4.2 为准,因为最后一次更新多节点部署的脚本是基于 6.4.2 的。而且这个版本 x-pack 内置进 elasticsearch 了,也能省了 x-pack 的部署和基础版的License。
节点部署
首先要准备好部署的包: jdk-8u181-linux-x64.rpm 、 elasticsearch-6.4.2.tar.gz 、 logstash-6.4.2.tar.gz 、 kibana-6.4.2-linux-x86_64.tar.gz 。
先贴整体结构图,后面的脚本和配置模板比较长。

elasticsearch 集群部署
然后是我复制出来的init.d的启动脚本模板 (init.d/elasticsearch.template)
如果是使用systemd的话就不需要上面那个,要另外写个守护服务配置模板和环境配置模板 (sysconfig/elasticsearch.template):
elasticsearch 的部署脚本分几个文件,其中配置文件(deploy-conf.sh)如下(里面也包含了一下依赖包):
然后是部署机用的脚本(deploy-remote.sh),这个脚本每个机器IP执行一次,要确保有权限:
然后是目标机上执行的脚本(deploy.sh),要注意防火墙要额外开一下:
以上,就可以比较方便地部署 elasticsearch的多节点集群了。
logstash 部署
然后需要对日志采集做部署,redis 部署就补贴了,比较简单。单节点没写部署脚本,直接贴我的配置吧:
主配置: config/logstash.yml
pipeline入口配置: config/pipelines.yml
然后是pipeline - config/app_to_redis.config :
最后是pipeline - config/app_to_redis.config :
最后加一下启动脚本就好了。
kibana 部署
kibana 是用于集群管理的,也贴一下我的配置吧。就一个文件 config/kibana.yml
也是最后加一下启动脚本就好了。
我还用了nginx做反向代理,配置如下:
日志接入
日志接入我是用的是protobuf转json。然后用上面的UDP发送到 logstash 。这个也比较简单,就是额外多做了负载均衡支持和reload支持。不过多描述了。
定期清理(elasticsearch-curator)
我们使用的方式非常的暴力,没有做太多的索引优化,elasticsearch的全文索引内存消耗爆炸高。所以用了个官方的工具 [elasticsearch-curator][7] 来定期清理掉不再需要的日志,具体使用可以见官方文档,我这里设置了清理30天以上的条目。
跪着文件: action
连接配置文件: curator.yml
这个工具需要python3,然后定时执行就行了。
最后Sample
最后贴一张我们项目内用的图吧。

上面的图是我拿来分析项目的错误码分布和监控远程调用和任务的健康情况的(失败率、延迟之类),其实更深入的使用不止于此,比如拿来查测试账号的登入时间点和登入服务器,对开发调试非常有用。我们的验证数据上报和抓取也是靠它,甚至可以加事件脚本来做告警等等。
[7]: https://www.elastic.co/guide/en/elasticsearch/client/curator/current/index.html
Last updated
Was this helpful?