38-系统日志架构设计八(日志收集)
xiangliheart
xiangliheart
发布于 2022-07-10 / 8 阅读 / 0 评论 / 0 点赞

38-系统日志架构设计八(日志收集)

日志收集架构

将程序日志存储到文件中并不能很好地解决查看问题,尤其对于互联网应用,开发运维人员需要打开巨大的日志文件,在海量的日志中寻找他们需要的那一点点内容,犹如大海捞针。因为在日志文件中有需要关注的内容,也有大量并不需要关注的内容,怎样以可视化的方式,简单快速地查找到关注的内容,这就是日志收集设计需要解决的问题。

系统希望实现以下4个目标。

(1)     具有海量存储能力:能够存储海量数据,并且保证数据可靠性(不丢失)和检索能力。

(2)     具有全文检索能力:能够像百度一样搜索某个关键词就找到对应的内容。

(3)     具有链路追踪能力:能够一次性查询到单笔交易中的所有日志。

(4)     具有统计分析能力:可以根据各种指标进行汇总查询。

海量存储能力和全文检索能力很容易实现,只要选用支持海量存储,并且具有全文检索能力的数据库引擎即可,目前主流采用的就是

Elasticsearch数据库。

链路追踪能力可以参见3.10节,只需要在日志中记录TraceID和SpanID就可以达到目的。统计分析能力是最难的,因为这是关系型数据库的特长,并不是搜索引擎数据库做不到,但前提是必须先将数据结构化。下面将详细阐述日志收集的设计思路。

6.8.1 日志收集架构的设计

日志收集流程如图6-23所示,几乎所有的日志收集架构都可以抽象为4个步骤:日志采集、日志清洗、日志存储和日志分析。

(1)     日志采集:可以从不同的数据源采集日志,可以是应用程序、数据库、中间件、网络、操作系统等。

(2)     日志清洗:将采集到的日志进行清洗、过滤、分析,转化为结构化的数据形式。

(3)     日志存储:将清洗后已经结构化的数据存储到存储引擎中。

(4)     日志分析:通过存储引擎对日志进行可视化的查询和统计分析。

图6-23 日志收集流程

日志收集架构设计如图6-24所示,日志采集程序要能够从不同的软件、设备、操作系统中主动采集日志,而不是由各个程序主动上送日志。例如,可以收集MySQL、Oracle等不同数据库的日志, Nginx、

Tomcat等不同Web服务器的日志,等等。

图6-24 日志收集架构设计

由于采集的日志来源不同,因此日志输出的格式也各不相同,大多数只是纯文本内容的流式输出。因此,这些日志需要输入日志清洗程序中进行解析和转换。日志清洗程序按照过滤器进行设计,一条日志经过层层清洗和转化,最终得到便于查询和分析的结构化数据。例如,将日志转化为JSON结构、XML结构等。

例如,有“name yinhongliang age 20 sex man”这样一行日志,处理过程如下。

第一层过滤先按照空格切割为长度为6的数组,即

[name,yinhongliang,age,20,sex,man]。

第二层过滤对数组中的元素进行两两组合,就可以将其解析为

{"name":"yinhongliang", "age":20,"birthday":"", sex:"man"} 这样一条结构化的JSON数据。

经过清洗后的结构化数据就可以输出到存储引擎中存储了。例

如,输出到MongoDB、MySQL、Elasticsearch中,甚至可以输出到控制台、磁盘文件、网络监听服务等地方。其中最常用的就是输出到数据库中。这样就可以开发程序来查询数据库中的数据,从而完成对于日志的查询和统计分析能力。由于所有的日志都会经过日志清洗程序,所以可以通过监测是否存在指定的错误日志,来达到监控预警的目的。

以下是3个经常使用的场景案例,如图6-25所示。

(1)     对于MySQL可以监控它的慢日志(默认为slow.log),当发现慢SQL时,发送邮件通知开发人员,存在SQL语句需要优化,不需要开发人员自己去排查问题。

(2)     对于Nginx可以监控它的错误日志(默认为error.log),当发现被代理的Upstream节点(上游节点)不通时,可以立即通知运维人员,服务可能存在宕机。

(3)     对于Tomcat服务可以监控它的控制台日志(默认为

catalina.out),当发现Out of memory这样的关键词时,就发送通知给运维人员,提醒程序内存溢出。

同理,可以监控各种设备和软件,对比日志中的关键词,从而达到个性化的监控预警目的。

图6-25 日志监控预警案例

6.8.2 Elastic Stack架构组件介绍

当前主流的开源日志收集与分析架构之一就是ELastic Stack架构。

ELastic Stack以前称为ELK Stack,其中E是指Elasticsearch,L是指

Logstash,K是指Kibana,使用这3个组件可以构建一套完整的日志采集、清洗、存储和分析的平台。

(1)     Elasticsearch:分布式搜索和分析引擎,主要用于结构化的日志存储和查询分析。

(2)     Logstash:用户日志清洗,将非结构化的流式日志转化为结构化日志。

(3)     Kibana:提供可视化的日志查询和统计分析、权限管理等。

ELK Stack日志收集架构如图6-26所示。Elasticsearch的作用是进行结构化的日志存储。Logstash的作用是日志采集和清洗,将非结构化的流式日志转化为结构化日志。Kibana提供可视化的日志查询和统计分析。开发人员直接使用Kibana进行日志查询,而不再需要接触服务器日志文件,只需要分配Kibana的系统账号即可,从而还可以控制不同的人员可查看的日志范围。

随着ELK的发展,又有新成员Beats的加入,所以就形成了ELastic Stack。

图6-26 ELK Stack日志收集架构

1. Elasticsear ch Elasticsearch在日志收集中的作用是存储结构化的日志数据,用于查询和分析,以下内容引用自百度百科。

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful Web接口。Elasticsearch

是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在

Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎。

2. Logstash

Logstash是一个开源实时的管道式日志收集引擎,可以动态地将不同来源的数据进行归一,并且将格式化的数据存储到所选择的位置。

Logstash流水线原理如图6-27所示。Logstash包含3个组件,分别是输入组件(INPUTS)、输出组件(OUTPUTS)和过滤器组件

(FILTERS)。其中输入组件和输出组件是必选组件。输入组件的目的

是从不同的数据源接收日志数据,经过过滤器组件进行过滤清洗和结构转换,最后经过输出组件进行输出,可以直接输出到Elasticsearch数据库中。如果不使用过滤器组件,则接收数据后直接输出到存储引擎中。

图6-27 Logstash流水线原理

Logstash输入输出设计如图6-28所示。Logstash提供了50多种输入组件、50多种输出组件、40多种过滤器组件,可以从诸如文件、数据库、Web应用、操作系统、网络、防火墙、消息队列等多种数据源输入数据;也可以将数据输出到文件、数据库、控制台、操作系统、网络、消息队列等终端中,几乎涵盖了所有需要的业务场景。

图6-28 Logstash输入输出设计

3.  Kibana

Kibana是一个十分强大的可视化工具,可以使用柱状图、线状图、饼图、热力图等形式按照不同维度统计日志信息,也可以自己定制化各种仪表盘,如图6-29所示。

图6-29 Kibana界面

开发人员不需要再去各个服务器、各个文件中查看日志文件,而是直接通过Kibana查询Elasticsearch中的数据即可,可视化的界面操

作,统一的权限管理,能够极大地提高开发和运维的效率,Kibana查询界面如图6-30所示。

图6-30 Kibana查询界面

4.  Beats

Beats是一个日志采集工具,可以将采集的日志直接输出到

Elasticsearch中,也可以输出到Logstash中,可以极大地简化日志采集的过程(否则每个数据源都要主动推送数据到Logstash中),如图6-31所示。

图6-31 Beats使用

Beats包含6种工具,具体如下。

(1)     Filebeat:轻量型日志采集器,可以从安全设备、云、容器、主机进行数据收集。采集的来源为文件,可以通过tail -f实时读取日志变化,将其输出到Logstash或Elasticsearch中。

(2)     Packetbeat:轻量型网络数据采集器,可用于监测HTTP 等网络协议,随时掌握应用程序延迟和错误、响应时间、流量、SLA性能、用户访问量和趋势等。

(3)     Metricbeat:轻量型指标采集器,用于从系统和服务中收集指标。将Metricbeat部署到Linux、Windows和Mac主机,Metricbeat 就能够以一种轻量型的方式输送各种统计数据,如系统级的CPU使用率、内存、文件系统、磁盘 I/O和网络I/O统计数据等。

(4)     Winlogbeat:轻量型Windows事件日志采集器,用于密切监控基于Windows的基础设施上发生的事件。可以将Windows事件日志流式传输至Elasticsearch和Logstash。

(5)     Auditbeat:轻量型审计日志采集器,可以收集Linux审计框架的数据,监控文件完整性。可监控用户的行为和系统进程,分析用户事件数据。Auditbeat与Linux审计框架直接通信,收集与Auditd相同的数据,并实时发送这些事件消息到Elastic Stack。

(6)     Heartbeat:面向运行状态监测的轻量型采集器,通过主动探测来监测服务的可用性。通过给定URL列表,通过心跳机制询问系统是否运行正常。

6.8.3 Elastic Stack架构模式

对于不同的应用场景,可以采用不同的Elastic Stack架构模式进行日志收集。

1. 3种无Filebeat 架构

如图6-32所示,如果应用日志可以结构化为JSON结构,则可以直接将结构化数据存储到Elasticsearch中,借助Kibana从Elasticsearch中进行查询。这样的架构模式最简单,节省了Logstash的过滤和传输流程,可以极大地提高日志采集的性能,适用于日志量较小的小型项目。

图6-32 Elastic Stack架构模式(1)

如图6-33所示,如果日志数据无法结构化,则可以将非结构化的日志直接输入Logstash中,在Logstash中进行格式化处理,形成JSON结构,再存储到Elasticsearch中,最后借助Kibana进行查询。这样的架构模式适用于大多数的中型项目。

图6-33 Elastic Stack架构模式(2)

如图6-34所示,为了防止Logstash的压力过大,可以借助Kafka这种高吞吐量的消息队列,将日志直接输出到Kafka中,再输入Logstash 中,在Logstash中进行格式化处理,形成JSON结构,再存储到

Elasticsearch中,最后借助Kibana进行查询。这样的架构模式适用于日志量较大的集群和分布式项目。

图6-34 Elastic Stack架构模式(3)

2. 3种有Filebeat 架构

以上3种架构对程序都具有一定的侵入性,应用程序必须主动输出日志。如果只是想上线一套日志收集系统,而不想改变任何原有程序,就可以如图6-35所示,使用Filebeat主动监控应用程序的日志文件。Filebeat可以将日志文件中的内容直接输出到Elasticsearch、

Logstash或Kafka中,因此在前3种架构之前加入Filebeat,就可以形成3 种新的架构模式。

图6-35 Elastic Stack架构模式(4)

Filebeat有以下两种部署方式。

第一种部署方式如图6-36所示,将Filebeat应用与每个应用部署在一起,作为一个代理服务去采集日志,然后再输出到Logstash中。这种部署方式的优点是多个Filebeat服务之间互不影响,采集性能较好,但是部署相对麻烦;缺点是由于Filebeat需要实时监控和采集日志,对资源也会有一定的损耗,尤其是当日志量变化较快时,这样就会抢占服务器资源,影响应用程序运行。

第二种部署方式如图6-37所示,将所有的日志通过NFS共享存储在一起,然后部署一台或多台独立的Filebeat服务器。这种部署方式的优点是可以独立部署Filebeat服务,与应用程序分离,即使Filebeat对资源消耗较大,也不会影响到业务应用的运行。

图6-36 Filebeat部署方式(1)

图6-37 Filebeat部署方式(2)


评论