微服务系列之分布式日志 ELK
1.ELK简介
ELK是ElasticSearch+LogStash+Kibana的缩写,是现代微服务架构流行的分布式日志解决方案,旨在大规模服务的日志集中管理查看,极大的为微服务开发人员提供了排查生产环境的便利。如果规模较小的日志量,直接使用ElasticSearch、Logstash、Kibana是可以满足其应用的,但是对于日志量较大的中大规模服务集群来说,这3个中间会引入Filebeat、Kafka、Zookpeer三个中间来大幅度提升采集性能、可靠性、可扩展性。目前来说,大部分公司使用的解决方案架构如下图:
此篇文章,我们一起来熟悉整个流程的搭建,为了方便演示,环境基于docker(正常情况下,因为这套系统是直接linux部署的,因为开销实在是很大)。
2.API服务
先建一个api服务,使用过滤器,让请求前后都会产生日志
我这里,将日志写到根目录下logs文件夹,以MyDockerApi *.log产生日志文件,接下来,发布,并上传到linux服务器,并用docker启动,不会的同学传送门:https://www.cnblogs.com/saltlight-wangchao/p/16646005.html。
由于docker的隔离性,想要采集日志,必须给服务docker挂载到linux宿主机的盘内,上图就是我为该API服务创建的日志写入目录,因为可能一个宿主机上可能有多个API服务,所以,可以按照规则,继续新建服务文件夹,用于存放不同API服务的日志,我这里就弄了一个先。
docker run --name API8082 -p 8081:5000
-v /etc/localtime:/etc/localtime --解决 docker 容器时间与本地时间不一致
-v /home/fileBeate/logs/mydockerapi1:/app/logs --挂载目录,降容器的app/logs目录挂载到宿主机,我们要指定该服务采集的目录
my1api
启动后,请求该服务
至此,api服务所产生的日志,已经写到我们要采集的指定目录里。
3.Filebeat
Filebeat是用于监视、采集、转发指定位置的文件轻量级开源工具,使用golang编写,就采集来说,其性能和资源利用率远好于基于jvm的logstash。
在这里,filebeat做为kafka的生产者
1)拉取filebeat镜像
docker pull docker.elastic.co/beats/filebeat:6.4.2
2)创建filebeat.yml配置文件,进行vim修改
基础的配置
---
filebeat.inputs:
- type:log
enabled: true
fields:
log_topics: mydockerapi1 --命名以服务名字,注意,因为一台宿主机可能有多个服务,而我们采集也要分开,再来一组-type
paths:
- /usr/share/filebeat/mydockerapi1-logs/*.log --这里是docker内的路径,千万别写错了。如果是 output.kafka:
hosts:
- "10.0.8.17:9092" --kafka的地址
topic: "elk-%{[fields][log_topics]}" --消息队列的topic
3)运行
docker run --restart=always --name filebeat -d
-v /home/filebeat.yml:/usr/share/filebeat/filebeat.yml
-v /home/fileBeate/logs/mydockerapi1/:/usr/share/filebeat/mydockerapi1-logs
docker.elastic.co/beats/filebeat:6.4.2
进入filebeat容器内部如下图,可以看到已经采集到日志文件
使用 docker logs -f filebeat 命令,查看filebeat日志
上图可见,采集完日志后,像kafka发送了
4.Zookeeper/Kafka
kafka是结合zookeeper一起使用的,kafka通过zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息,这里不过多描述,感兴趣的可以去详细查看。
1)拉取zookeeper镜像并运行
docker pull zookeeper:latest
docker run -d --name zookeeper -p 2181:2181 -t zookeeper:latest
2)拉取kafka镜像并运行
docker pull wurstmeister/kafka:latest
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0
-e KAFKA_ZOOKEEPER_CONNECT=10.0.8.17:2181
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.0.8.17:9092
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka:latest
3)查看filebeat是否采集完日志,是否之前配置的topic写进来,直接执行下面命令
docker exec -it kafka bash
cd /opt/kafka/bin
kafka-topics.sh --zookeeper 10.0.8.17:2181 --list
可见,我们采集的日志已经写进来了。接下来,使用exit命令退出容器。
5.Logstash
Logstash是一个接收、过滤、输出的组件,三块形成一个管道,其实这个的功能性很强大,配置起来也很繁琐,我们这里主要是收集各个API服务的日志用,所以就做基础配置即可
1)拉取镜像
docker pull docker.elastic.co/logstash/logstash:6.4.3
2)创建配置文件并配置
input{
kafka{ 数据源来自kafka,此时logstash做为消费者
bootstrap_servers => "10.0.8.17:9092" kafka地址
topics_pattern => "elk-.*" 消费的主题匹配elk-开头的
consumer_threads => 5 -消费线程数
decorate_events => true
codec => "json"
auto_offset_reset => "latest"
}
} output {
elasticsearch { 输出到es
hosts => ["10.0.8.17:9200"] es地址
index => "ts-mydockerapi1" es的索引
}
}
上述是简单的配置,生产中在输出output块中,,要根据topic来输出到不同的索引配置如下:
output { if [@metadata][kafka][topic] == "elk-mydockerapi1" {
elasticsearch {
hosts => "http://10.0.8.17:9200"
index => "ts-mydockerapi1"
timeout => 300
}
} 这里可以多个if判断,输出到不同的索引中 stdout {}
}
3)运行
docker run --name logstash -d -e xpack.monitoring.enabled=false -v /home/logstash:/config-dir docker.elastic.co/logstash/logstash:6.4.3 -f /config-dir/logstash.conf
至此logstash启动成功,日志显示正常。至于繁琐的过滤配置,主做运维的同学,可以深研究下,后端同学了解下就行了。我这期间,老是遇到内存溢出的情况,可以改一下,logstash的配置文件,进入docker容器,位置在config/jvm.options,可以修改下内存使用。
6.ElasticSearch
简称es,elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。官方概念,我们本篇文章不做深入研究,只就ELK分布式日志应用来说。
1)拉取镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:6.4.2
2)运行es
docker run --name myes --restart=always -p 9200:9200 -p 9300:9300 -d -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.4.2
3)查看logstash输入到es的数据
浏览器运行http://你的IP:9200/_search?pretty
日志数据已经进来了,接下来最后一步,展示日志。
7.Kibana
kibana是一个开源的分析与可视化平台,设计出来用于和elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在elasticsearch索引里的数据,使用各种不同的图表、表格、地图等kibana能够很轻易地展示高级数据分析与可视化.
1)拉取镜像
docker pull docker.elastic.co/kibana/kibana:6.4.3
2)运行
docker run -d --name kibana -p 5601:5601 -e ELASTICSEARCH_URL=http://10.0.8.17:9200 docker.elastic.co/kibana/kibana:6.4.3
3配置展示
运行起来后,打开你的ip:5601,刚进来会让你创建索引,步骤如下图
选择next step按钮,创建完毕,如下图
由于我这个linux服务器太弱了,ELK完全运行起来太卡了,就不继续做了,可以再建个API服务,模拟多个服务日志,通过ELK采集,在kibana里,根据logstash输入进es的索引,来展示对应服务的日志,如下图:
这里就可以选择对应API服务的索引日志了。。。
最后做为后端研发来说,一个有规模的做微服务的团队,ELK的搭建不是直接购买云产品,就是由运维来搭建,但是小规模团队,还是需要后端同学来搞的,总之,后端研发人员可以不实践,但是最好要了解一下整体流程。OK本文到此结束。
微服务系列之分布式日志 ELK的更多相关文章
- 【SpringCloud构建微服务系列】分布式链路跟踪Spring Cloud Sleuth
一.背景 随着业务的发展,系统规模越来越大,各微服务直接的调用关系也变得越来越复杂.通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用协同产生最后的请求结果,几乎每一个前端请求都会形成一 ...
- .NETCore微服务探寻(三) - 分布式日志
前言 一直以来对于.NETCore微服务相关的技术栈都处于一个浅尝辄止的了解阶段,在现实工作中也对于微服务也一直没有使用的业务环境,所以一直也没有整合过一个完整的基于.NETCore技术栈的微服务项目 ...
- 【CHRIS RICHARDSON 微服务系列】事件驱动的数据管理-5
编者的话 |本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模 ...
- Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案
Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...
- Spring Cloud微服务系列文,服务调用框架Feign
之前博文的案例中,我们是通过RestTemplate来调用服务,而Feign框架则在此基础上做了一层封装,比如,可以通过注解等方式来绑定参数,或者以声明的方式来指定请求返回类型是JSON. 这种 ...
- 微服务架构下分布式事务解决方案——阿里GTS
1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,很多互联网行业巨头.开源社区等都开始了微服务 ...
- 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足
Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...
- 微服务系列实践 .NET CORE
从事这个行业转眼已经6年了,从当初刚毕业的在北京朝八晚十,从二环到五环,仍每天精力充沛的小愤青:再到深圳一点一滴的辛勤在软件行业的耕种,从当初单体应用架构到现在微服务架构的经历,回想起来自己的收获倒是 ...
- 微服务架构下分布式事务解决方案——阿里云GTS
https://blog.csdn.net/jiangyu_gts/article/details/79470240 1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这 ...
随机推荐
- Qt 国际化翻译
简介 Qt Linguist 提供了一套加速应用程序翻译和国际化的工具.Qt 使用单一的源码树和单一的应用程序二进制包就可同时支持多个语言和书写系统. 使用 QTranslator 来加载生成的 qm ...
- JVM 系列(4)一看就懂的对象内存布局
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- k8s驱逐篇(2)-kubelet节点压力驱逐
kubelet节点压力驱逐 kubelet监控集群节点的 CPU.内存.磁盘空间和文件系统的inode 等资源,根据kubelet启动参数中的驱逐策略配置,当这些资源中的一个或者多个达到特定的消耗水平 ...
- SvelteUI:运用svelte3构建的网页版UI组件库(升级版)
距离上次分享的svelte-ui 1.0已经一月有余,这次带来全新升级完整版svelte-ui 2.0. 这次优化并新增15+个组件.在开发之初借鉴了element-ui组件库,所以在组件结构及语法上 ...
- my2sql工具之快速入门
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. my2sql工具之快速入门 1.什么是my2sql ...
- uni-app 从0 到 1 制作一个项目,收藏等于学会
uni-app 是使用 vue.js 开发的所有前端应用框架,开发者编写的一套代码,可以发布到 ios.android.web ,以及各种小程序平台. 一.创建uni-app 1.hBuilderX ...
- java-流的使用完结与异常处理机制
1.1java.io.objectInputStream 对象输入流:用于将一组字节(通过对象输出流写出对象而转换的一组字节)读取并转换为对应的对象.对象输出流将对象写出时转换为一组字节的过程,称为: ...
- 入门 Socket.io
概念 Socket.io 是一个支持客户端和服务器之间的低延迟.双向和基于事件的通信的库,除了支持 JavaScript 以外,还支持 Java.Python.Golang. Socket.io 构建 ...
- dentry的引用计数不对导致的crash
[17528853.189372] python invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=-998[17528853.189 ...
- Dreamweaver8 网站制作软件使用教程
Dreamweaver是我喜欢做网站的软件.之所以喜欢Dreamweaver 8 是因为这个版本有折叠功能. 下面说说它的使用方法. 1.创建站点文件.注意看截图的顺序,如下图 2.选择你喜欢的编辑模 ...