源起
日志是排查问题的根源
第一个问题:你公司对服务端日志你有多重视,包括web日志、应用程序日志、网络设备日志等等?
1)有日志,但基本不去控制需要输出的内容;
2)经常微调日志,只输出我们想看和有用的;
3)经常监控日志,一方面帮助日志微调,一方面及早发现程序的问题;
4)高度依赖日志,做服务可用性监控,故障排查,程序性能监控等等;
只做到第1点的,你可以洗洗去睡了。很多公司都有做到第2点和第3点,这些公司的服务端程序基本已经跑了很长时间了且规模较小,已比较稳定,确实无需花太多时间去关注。对于稍微规模大一点的公司,就有必要做到第4点了,甚至更好。
第二个问题:日志怎么看?
1)线上日志逐个tail+grep
2)编写脚本,下载某个时间范围内的全部日志到本地再搜索
3)tail+grep或者把日志下载下来再搜索,可以应付不多的主机和不多的应用部署场景。但对于多机多应用部署就不合适了。这里的多机多应用指的是同一种应用被部署到几台服务器上,每台服务器上又部署着不同的多个用。可以想象,这种场景下,为了监控或者搜索某段日志,需要登陆多台服务器,执行多个tail -F和grep命令。一方面这很被动。另一方面,效率非常低。
4)日志统一管理,所有日志集中到一起,能够提供可视化查看日志,然后能够对日志做实时分析;比如web访问状态码统计,当有很多5xx的状态码时,所以服务已经出现有不可用现象,数据库慢查询日志统计,应用程序执行慢的日志统计等等。
除了上述问题之外,其实日志的分析和监控在运维工作中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有:
- 根据关键字查询日志详情
- 监控系统的运行状况
- 统计分析,比如接口的调用次数、执行时间、成功率等
- 异常数据自动触发消息通知
- 基于日志的数据挖掘
很多团队在日志方面可能遇到的一些问题有:
- 开发人员不能登录线上服务器查看详细日志,经过运维周转费时费力
- 日志数据分散在多个系统,难以查找
- 日志数据量大,查询速度慢
- 一个调用会涉及多个系统,难以在这些系统的日志中快速定位数据
- 数据不够实时
什么是ELK?
Elasticsearch、Logstash、Kibana组合工作原理如下所示:
1)处理方式灵活。Elasticsearch是实时全文索引,不需要像storm那样预先编程才能使用;
2)配置简易上手。Elasticsearch全部采用JSON接口,Logstash是Ruby DSL设计,都是目前业界最通用的配置语法设计;
3)检索性能高效。虽然每次查询都是实时计算,但是优秀的设计和实现基本可以达到全天数据查询的秒级响应;
4)集群线性扩展。不管是Elasticsearch集群还是Logstash集群都是可以线性扩展的;
5)前端操作炫丽。Kibana界面上,只需要点击鼠标,就可以完成搜索、聚合功能,生成炫丽的仪表板;
当然,ELK Stack 也并不是实时数据分析界的灵丹妙药。在不恰当的场景,反而会事倍功半。
而在5.0版本以后(从2.x版本直接全部升级为5.x版本),Elastic公司将原来的ELK Stack称之为Elastic Stack,原因是引入了Beats套件。
Elastic Products全家福:
这些说一个小小的通过ELK解决问题的案例:有一次半夜接收到CDN的短信报警,某个域名出现大量的504,504是Web服务器端返回的超时错误,说明Web服务器到后端的应用程序服务器请求资源超时了(设置有阀值)。后来就到Kibana(ELK中的可视化组件)查看;由于我们对web日志、php日志、数据库慢查询日志都收集到了ELK中,所以最先看了504所报的web日志,基本都是超过了设定的阀值,说明是后端php处理用户请求时间太久。然后就看了php的慢查询日志,也是有大量的超时日志,同时发现php返回的慢查询日志接口基本都是相同的,后来开发说这是一个需要写数据库的接口。然后我们就看了一下数据库慢查询日志,也有一些超时日志,但是量不是很大,主要集中在某一张表上。最后就针对这个表查找问题,最后发现表的存储为Myisam,这个表有大量的写入操作,而Myisam存储引擎的特点就是读性能好,写入性能很差,且是表级锁。后来就把Myisam存储引擎换成了InnoDB,不到10s钟,所有的慢日志都没有了,问题也得到了解决。
所以重点来了,下面就开始进行ELK Stack学习之旅。首先介绍介绍ELK三剑客:Logstash、Elasticsearch、Kibana。
第一剑:Logstash
Logstash是一个完全开源的工具,他可以对你的日志进行收集、分析处理,然后输出存储系统,如Elasticsearch中存储,使用JRuby编写,开源,主流,免费,使用简单。
Logstash从1.5版本开始,将核心代码和插件代码完全剥离,并重构了插件架构逻辑,所有插件都以标准的Ruby Gem包形式发布。Logstash的理念很简单,它只做3件事情:
Collect:数据输入
Enrich:数据加工,如过滤,改写等
Transport:数据输出
别看它只做3件事,但通过组合输入和输出,可以变幻出多种架构实现多种需求。这里只抛出用以解决日志汇总需求的部署架构图:
解释术语
Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,输出到Redis暂存。
Indexer:日志存储者。负责从Redis接收日志,写入到本地文件。
Broker:日志Hub,用来连接多个Shipper和多个Indexer。
无论是Shipper还是Indexer,Logstash始终只做前面提到的3件事:Shipper从日志文件读取最新的行文本,经过处理(这里我们会改写部分元数据),输出到Redis,
Indexer从Redis读取文本,经过处理(这里我们会format文本),输出到文件。
一个Logstash进程可以有多个输入源,所以一个Logstash进程可以应付一台服务器上的所有日志。Redis是Logstash官方推荐的Broker角色“人选”,支持订阅发布和队列两种数据传输模式,推荐使用。输入输出支持过滤
改写。Logstash支持多种输出源,可以配置多个输出实现数据的多份复制,也可以输出到Email,File,Tcp,传递给其他程序作为输入,或者安装插件实现和其他系统的对接,如搜索引擎Elasticsearch。总结:Logstash概念简单,通过组合可以满足多种需求。
第二剑:Elasticsearch
ElasticSearch是一个基于Lucene(Apache基金会的开源搜索引擎)的搜索服务器,是一个高扩展的、开源的、全文检索的搜索引擎,它提供了近实时的索引、搜索、分析功能、它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
应用场景
1.它提供了强大的搜索功能,可以实现类似百度、谷歌等搜索。
2.可以搜索日志或者交易数据,用来分析商业趋势、搜集日志、分析系统瓶颈或者运行发展等等。
3.可以提供预警功能(持续的查询分析某个数据,如果超过一定的值,就进行警告)。
4.分析商业信息,在百万级的大数据中轻松的定位关键信息。
第三剑:Kibana
Kibana是Elasticsearch的分析和搜索仪表板。已经历经了v1, v2, v3, v4 个版本,分别采用了 PHP,Ruby,AngularJS,JRuby,NodeJS等不同语言编写。主要关注v3和v4两个版本,其区别很大。原有Kibana V3上的操作经验,几乎无法自然带入到Kibana V4中,所以实际项目中尽量用v4,我也没有使用过V3版本,一直使用的是V4版本。
Kibana V4是Elastic.co一次崭新的重构产品,在操作界面上,有一定程度的对Splunk的模仿(Splunk是商业日志分析系统,很强大)。Kibana非常容易安装和使用,虽然V4项目不在像V3那样都是使用HTML和Javascript写的,但V4安装方式依然简单,几分钟内就可以安装好Kibana,然后开始探索你的Elasticsearch索引数据,需要提前预备好一个Elasticsearch集群,第一次访问Kibana时就会进行检测这些必要条件,如果不满足条件是进不去Kibana操作界面的,默认是检查本地,如果你的Elasticsearch不在本地,那么就需要修改kibana.yml里的elasticsearch URL,然后重启Kibana即可。
第一次进入Kibana界面后,你会被要求定义一个index pattern用来匹配一个或者多个索引名称。而这个索引名称就是来自于Elasticsearch中的索引数据。如下图:
如果能够正确地从elasticsearch中匹配到索引,接下来就可以创建索引,然后开始你的Kibana之旅。
ELK Stack平台搭建方式
1)Redis:接收用户日志的消息队列。
2)Logstash:做日志解析,统一成JSON输出给Elasticsearch。
3)Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能。
4)Kibana:基于Elasticsearch的数据可视化组件,超强的数据可视化能力是众多公司选择ELK stack的重要原因。
这一套部署可以看这里:CentOS7部署ELK
除了上面这种模式之外,也有可能会看见这种ELK架构。
其中Kibana、ElasticSearch、Logstash作用就不用说了。另外多了一个Filebeat组件,Filebeat组件是一个轻量级的日志收集工具(当然也可以使用Logstash),收集到日志后传送到Logstash中。这一套部署可以看这里:CentOS7部署ELK
现在很多公司使用ELK技术栈做日志分析,比如新浪使用ELK处理每天32亿条记录,详细的介绍可以查看这里