Kafka与ELK实现一个日志系统
1.概述
客户端应用程序在运行过程中可能会产生错误,例如调用服务端接口超时、客户端处理业务逻辑发生异常、应用程序突然闪退等。这些异常信息都是会产生日志记录的,并通过上报到指定的日志服务器进行压缩存储。 本篇博客以一个应用实时日志分析平台作为案例来讲述ELK(ElasticSearch、LogStash、Kibana)在实际业务中的具体用法,让读者能够从中理解ELK适用的业务场景及实现细节。
2.内容
在传统的应用场景中,对于这些上报的异常日志信息。通常适用Linux命令去分析定位问题,如果日志数据量小,也许不会觉得有什么不适。假若面对的是海量的异常日志信息,这时还用Linux命令去逐一查看、定位,这将是灾难性的。需要花费大量的时间、精力去查阅这些异常日志,而且效率也不高。 因此,构建一个应用实时日志分析平台就显得很有必要。通过对这些异常日志进行集中管理(包括采集、存储、展示),用户可以在这样一个平台上按照自己的想法来实现对应的需求。
1.自定义需求
用户可以通过浏览器界面访问Kibana来制定不同的筛选规则,查询存储在ElasticSearch集群中的异常日志数据。返回的结果在浏览器界面通过表格或者JSON对象的形式进行展示,一目了然。
2.命令接口
对于周期较长的历史数据,如果不需要可以进行删除。在Kibana中提供了操作ElasticSearch的接口,通过执行删除命令来清理ElasticSearch中无效的数据。
3.结果导出与共享
在Kibana系统中,分析完异常日志后可以将这些结果直接导出或者共享。Kibana的浏览器界面支持一键式结果导出与数据分享,不需要额外的去编写代码来实现。
2.1 架构与剖析
搭建实时日志分析平台涉及到的组件有ElasticSearch、LogStash、Kibana、Kafka,它们各自负责的功能如下:
- ElasticSearch:负责分布式存储日志数据,给Kibana提供可视化的数据源;
- LogStash:负责消费Kafka消息队列中的原始数据,并将消费的数据上报到ElasticSearch进行存储;
- Kibana:负责可视化ElasticSearch中存储的数据,并提供查询、聚合、图表、导出等功能;
- Kafka:负责集中管理日志信息,并做数据分流。例如,Flume、LogStash、Spark Streaming等。
1.架构
将日志服务器托管的压缩日志统计收集到Kafka消息队列,有Kafka实现数据分流。通过LogStash工具消费Kafka中存储的消息数据,并将消费后的数据写入到ElasticSearch进行存储,最后通过Kibana工具来查询、分析ElasticSearch中存储的数据,整个体系架构如图10-17所示。
数据源的收集可以采用不同的方式,使用Flume Agent采集数据则省略了额外的编码工作,使用Java API读取日志信息则需要额外的编写代码来实现。
这两种方式将采集的数据均输送到Kafka集群中进行存储,这里使用Kafka主要是方便业务拓展,如果直接对接LogStash,那么后续如果需要使用Spark Streaming来进行消费日志数据,就能很方便的从Kafka集群中消费Topic来获取数据。这里Kafka起到了很好的数据分流作用。
2.模块分析
实时日志分析平台可以拆分为几个核心模块,它们分别是数据源准备、数据采集、数据分流、数据存储、数据查看与分析。在整个平台系统中,它们执行的流程需要按照固定的顺序来完成,如下图所示。
a. 数据源准备
数据源是由异常压缩日志构成的,这些日志分别由客户端执行业务逻辑、调用服务端接口这类操作产生。然后将这些日志进行压缩存储到日志服务器。
b. 数据采集
采集数据源的方式有很多,可以选择开源的日志采集工具(如Apache Flume、LogStash、Beats),使用这些现有的采集工具的好处在于省略了编码工作,通过编辑工具的配置文件即可快速使用,缺点在于针对一些特定的业务场景,可能无法满足。
另外一种方式是使用应用编程接口(API)来采集,例如使用Java API读取待采集的数据源,然后调用Kafka接口将数据写入到Kafka消息队列中进行存储。这种方式的好处在于对于需要的实现是可控的,缺点在于编码实现时需要考虑很多因素,比如程序的性能、稳定性、可扩展性等。
c. 数据分流
在一个海量数据应用场景中,数据采集的Agent是有很多个的,如果直接将采集的数据写入到ElasticSearch进行数据存储,那么ElasticSearch需要同时处理所有的Agent上报的数据,这样会给ElasticSearch集群服务端造成很大的压力。
因此需要有个缓冲区来缓解ElasticSearch集群服务端的压力。这里使用Kafka来做数据分流,将Agent上报的数据存储到消息队列。然后在通过消费Kafka中的Topic消息数据后存储到ElasticSearch集群中,这样不仅可以缓解ElasticSearch集群服务端的压力,而且还能提高整个系统的性能、稳定性、扩展性。
d. 数据存储
这里使用ElasticSearch集群来作为日志最终的存储介质。通过消费Kafka集群中的Topic数据,按照不同的索引(Index)和类型(Type)存储到ElasticSearch集群中。
e. 数据可视化
异常日志数据落地在ElasticSearch集群中,可以通过Kibana来实现可视化功能。用户可以自定义规则来查询ElasticSearch集群中的数据,并将查询的结果以表格或者JSON对象形式输出。同时,Kibana还提供了一键导出功能,将这些查询的结果从Kibana浏览器界面导出到本地。
3.实战演练
1. 数据源采集
这里通过Apache Flume工具将上报的异常日志数据采集到Kafka集群进行存储。在日志服务器部署一个Flume Agent进行数据采集,Flume配置文件所包含的内容见如下代码:
- # 设置代理别名
- agent.sources = s1
- agent.channels = c1
- agent.sinks = k1
- # 设置收集方式
- agent.sources.s1.type=exec
- agent.sources.s1.command=tail -F /data/soft/new/error/logs/apps.log
- agent.sources.s1.channels=c1
- agent.channels.c1.type=memory
- agent.channels.c1.capacity=10000
- agent.channels.c1.transactionCapacity=100
- # 设置Kafka接收器
- agent.sinks.k1.type= org.apache.flume.sink.kafka.KafkaSink
- # 设置Kafka的broker地址和端口号
- agent.sinks.k1.brokerList=dn1:9092,dn2:9092,dn3:9092
- # 设置Kafka的Topic
- agent.sinks.k1.topic=error_es_apps
- # 设置序列化方式
- agent.sinks.k1.serializer.class=kafka.serializer.StringEncoder
- # 指定管道别名
- agent.sinks.k1.channel=c1
然后在Kafka集群上使用命令创建名为“error_es_apps”的Topic,创建命令如下所示:
- # 创建Topic,3个副本,6个分区
- [hadoop@dn1 ~]$kafka-topics.sh --create –zookeeper\
- dn1:2181,dn2:2181,dn3:2181 --replication-factor 3\
- --partitions 6 --topic error_es_apps
接着启动Flume Agent代理服务,具体命令如下所示:
- # 在日志服务器上启动Agent服务
- [hadoop@dn1 ~]$ flume-ng agent -n agent -c conf -f $FLUME_HOME/conf/flume-kafka.properties\
- -Dflume.root.logger=DEBUG,CONSOLE
2. 数据分流
将采集的数据存储到Kafka消息队列后,可以供其他工具或者应用程序消费来进行数据分流。例如,通过使用LogStash来消费业务数据并将消费后的数据存储到ElasticSearch集群中。
如果LogStash没有按照X-Pack插件,这里可以提前安装该插件。具体命令如下所示:
- # 在线安装
- [hadoop@nna bin]$ ./logstash-plugin install x-pack
- # 离线安装
- [hadoop@nna bin]$ ./logstash-plugin install file:///tmp/x-pack-6.1.1.zip
安装成功后,在Linux控制台会打印日志信息,如下图所示:
然后,在logstash.yml文件中配置LogStash的用户名和密码,具体配置内容见代码:
- # 用户名
- xpack.monitoring.elasticsearch.username: "elastic"
- # 密码
- xpack.monitoring.elasticsearch.password: "123456"
最后配置LogStash的属性,连接到Kafka集群进行消费。具体实现内容见代码:
- # 配置输入源信息
- input{
- kafka{
- bootstrap_servers => "dn1:9092,dn2:9092,dn3:9092"
- group_id => "es_apps"
- topics => ["error_es_apps"]
- }
- }
- # 配置输出信息
- output{
- elasticsearch{
- hosts => ["nna:9200","nns:9200","dn1:9200"]
- index => "error_es_apps-%{+YYYY.MM.dd}"
- user => "elastic"
- password => "123456"
- }
- }
在配置输出到ElasticSearch集群信息时,索引建议以“业务名称-时间戳”来进行命名,这样做的好处在于后续删除数据的时候,可以很方便的根据索引来删除。由于配置了权限认证,索引需要设置用户名和密码。 配置完成后,在Linux控制台执行LogStash命令来消费Kafka集群中的数据。具体操作命令如下所示:
- # 启动LogStash消费命令
- [hadoop@nna ~]$ logstash -f $LOGSTASH_HOME/config/kafka2es.conf
如果配置文件内容正确,LogStash Agent将正常启动消费Kafka集群中的消息数据,并将消费后的数据存储到ElasticSearch集群中。 启动LogStash Agent之后,它会一直在Linux操作系统后台运行。如果Kafka集群中Topic有新的数据产生,LogStash Agent会立刻开始消费Kafka集群中的Topic里面新增的数据。
3. 数据可视化
当数据存储到ElasticSearch集群后,可以通过Kibana来查询、分析数据。单击“Management”模块后,在跳转后的页面中找到“Kibana-Index Patterns”来添加新创建的索引(Index)。在添加完成创建的索引后,单击“Discover”模块,然后选择不同的索引来查询、分析ElasticSearch集群中的数据
4.结束语
这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
另外,博主出书了《Kafka并不难学》和《Hadoop大数据挖掘从入门到进阶实战》,喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习,在此感谢大家的支持。关注下面公众号,根据提示,可免费获取书籍的教学视频。
Kafka与ELK实现一个日志系统的更多相关文章
- ELK +Nlog 分布式日志系统的搭建 For Windows
前言 我们为啥需要全文搜索 首先,我们来列举一下关系型数据库中的几种模糊查询 MySql : 一般情况下LIKE 模糊查询 SELECT * FROM `LhzxUsers` WHERE UserN ...
- 【ELK】5.spring boot日志集成ELK,搭建日志系统
阅读前必看: ELK在docker下搭建步骤 spring boot集成es,CRUD操作完整版 ============================================== 本章集成 ...
- 利用开源架构ELK构建分布式日志系统
问题导读 1.ELK产生的背景?2.ELK的基本组成模块以及各个模块的作用?3.ELK的使用总计有哪些? 背景 日志,对每个系统来说,都是很重要,又很容易被忽视的部分.日志里记录了程序执行的关键信息, ...
- ELK——集中式日志系统
https://www.ibm.com/developerworks/cn/opensource/os-cn-elk/index.html 基本流程是 Shipper 负责从各种数据源里采集数据,然后 ...
- ASP.NET Core分布式日志系统ELK实战演练
一.ELK简介 ELK是Elasticsearch.Logstash和Kibana首字母的缩写.这三者均是开源软件,这三套开源工具组合起来形成了一套强大的集中式日志管理平台. • Elastics ...
- java项目日志系统的总结
目录 日志系统归类以及关系 日志的三个组件 slf4j的使用 项目中构建日志系统 使用例子 日志系统归类以及关系 常用的日志框架: slf4j.logback .log4j.log4j2.JUL(ja ...
- 搭建Loki、Promtail、Grafana轻量级日志系统(centos7)
搭建Loki.Promtail.Grafana轻量级日志系统(centos7)--简称PLG 需求 公司项目采用微服务的架构,服务很多,每个服务都有自己的日志,分别存放在不同的服务器上.当查找日志时需 ...
- PHP框架中的日志系统
现在在一家公司做PHP后台开发程序猿(我们组没有前端,做活动时会做前端的东西),刚开始到公司的时候花2个周赶出了一个前端加后台的活动(记得当时做不出来周末加了两天班...),到现在过去4个多月了,可以 ...
- 【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据
很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心 ...
随机推荐
- Android官方文档翻译 二 1.Building Your First App
Building Your First App 创建你的第一个App项目 Dependencies and prerequisites 依赖关系和先决条件 * Android SDK * ADT Pl ...
- Redhat 如何使用yum 源(转)
1.需要把Redhat注册的信息给解决掉 This system is not registered with an entitlement server. You can use subscript ...
- MongDB日志分析
Result文件数据说明: Ip:106.39.41.166,(城市) Date:10/Nov/2016:00:01:02 +0800,(日期) Day:10,(天数) Traffic: 54 ,(流 ...
- 【记录一个问题】神坑,自定义一个golang的error类型,居然运行崩溃了
2020-05-20 18:20补充: 感谢yif同学提供指导,出现错误并且打印大量信息的原因是函数递归调用导致栈溢出. 而导致递归调用的关键代码是%v 类型实现了error的interface %v ...
- deepin20搜狗输入法使用
放大打字框 打出中文语句符号
- 前端3D引擎-Cesium自定义动态材质
本文代码基于Vue-cli4和使用WebGL的地图引擎Cesium,主要内容为三维场景下不同对象的动态材质构建. 参考了很多文章,链接附在文末. 为不同的几何对象添加动态材质 不知道这一小节的名称概况 ...
- k8s通过Service访问Pod
如何创建服务 1.创建Deployment #启动三个pod,运行httpd镜像,label是run:mcw-httpd,Seveice将会根据这个label挑选PodapiVersion: apps ...
- linux字符编码防止乱码
一:linux字符编码 en_US.UTF-8 : 美式英文,utf-8 zh_CN.UTF-8 临时优化 export LANG=zh_CN.UTF-8 : 设置编码 永久优化 vim /etc/l ...
- Codeforces Round #746 Div. 2
掉分快乐qwq C题代码以及分析(在注释里) /* * @Author: Nan97 * @Date: 2021-10-04 22:37:18 * @Last Modified by: Nan97 * ...
- 浅谈VPC (转)
来源于知乎:https://zhuanlan.zhihu.com/p/33658624 VPC全称是Virtual Private Cloud,翻译成中文是虚拟私有云.但是在有些场合也被翻译成私有网络 ...