1.ELK简介
ELK是ElasticSearch+LogStash+Kibana的缩写,是现代微服务架构流行的分布式日志解决方案,旨在大规模服务的日志集中管理查看 , 极大的为微服务开发人员提供了排查生产环境的便利 。如果规模较小的日志量,直接使用ElasticSearch、Logstash、Kibana是可以满足其应用的 , 但是对于日志量较大的中大规模服务集群来说,这3个中间会引入Filebeat、Kafka、Zookpeer三个中间来大幅度提升采集性能、可靠性、可扩展性 。目前来说,大部分公司使用的解决方案架构如下图:
![微服务系列之分布式日志 ELK](https://m.360buyimg.com/jdcms/jfs/t1/114856/35/29329/30503/6352563dEd63b3252/01783b16c94aaf07.png)
文章插图
此篇文章,我们一起来熟悉整个流程的搭建,为了方便演示,环境基于docker(正常情况下,因为这套系统是直接linux部署的 , 因为开销实在是很大) 。
2.API服务
先建一个api服务 , 使用过滤器,让请求前后都会产生日志
![微服务系列之分布式日志 ELK](http://img.zhejianglong.com/231018/1RPV627-1.jpg)
文章插图
我这里,将日志写到根目录下logs文件夹,以MyDockerApi *.log产生日志文件 , 接下来,发布,并上传到linux服务器,并用docker启动 , 不会的同学传送门:https://www.cnblogs.com/saltlight-wangchao/p/16646005.html 。
![微服务系列之分布式日志 ELK](https://m.360buyimg.com/jdcms/jfs/t1/153014/14/29451/9811/6352563eE7089591a/6d376f8d0252f0bf.png)
文章插图
由于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 启动后,请求该服务
![微服务系列之分布式日志 ELK](https://m.360buyimg.com/jdcms/jfs/t1/33878/39/17412/187412/6352563eEb45b8be9/ae645b8f8be3572e.png)
文章插图
至此,api服务所产生的日志 , 已经写到我们要采集的指定目录里 。
3.Filebeat
Filebeat是用于监视、采集、转发指定位置的文件轻量级开源工具 , 使用golang编写 , 就采集来说,其性能和资源利用率远好于基于jvm的logstash 。
在这里 , filebeat做为kafka的生产者
1)拉取filebeat镜像
docker pull docker.elastic.co/beats/filebeat:6.4.22)创建filebeat.yml配置文件,进行vim修改
基础的配置
---filebeat.inputs:- type:logenabled: truefields:log_topics: mydockerapi1--命名以服务名字,注意,因为一台宿主机可能有多个服务,而我们采集也要分开,再来一组-typepaths:- /usr/share/filebeat/mydockerapi1-logs/*.log--这里是docker内的路径,千万别写错了 。如果是output.kafka:hosts:- "10.0.8.17:9092"--kafka的地址topic: "elk-%{[fields][log_topics]}"--消息队列的topic3)运行
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-logsdocker.elastic.co/beats/filebeat:6.4.2进入filebeat容器内部如下图 , 可以看到已经采集到日志文件
![微服务系列之分布式日志 ELK](https://m.360buyimg.com/jdcms/jfs/t1/172572/22/26077/13121/6352563fE9540d269/74d18129082ffbc9.png)
文章插图
使用 docker logs -f filebeat 命令,查看filebeat日志
![微服务系列之分布式日志 ELK](https://m.360buyimg.com/jdcms/jfs/t1/41127/17/21297/120152/6352563fEa169392f/f11773d9a27cd4e0.png)
文章插图
上图可见,采集完日志后,像kafka发送了
4.Zookeeper/Kafka
kafka是结合zookeeper一起使用的,kafka通过zookeeper管理集群配置,选举leader,以及在consumer group发生变化时进行rebalance 。producer使用push模式将消息发布到broker,consumer使用pull模式从broker订阅并消费消息,这里不过多描述,感兴趣的可以去详细查看 。
1)拉取zookeeper镜像并运行
docker pull zookeeper:latestdocker run -d --name zookeeper -p 2181:2181 -t zookeeper:latest
![微服务系列之分布式日志 ELK](https://m.360buyimg.com/jdcms/jfs/t1/22930/32/19874/67951/63525640Ea0deb17a/e80b14310f0d100b.png)
文章插图
2)拉取kafka镜像并运行
docker pull wurstmeister/kafka:latestdocker 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
推荐阅读
- 快速安装 服务器之Apollo单机部署
- 微信公众号怎么转发(微信上面的公众号如何转发)
- 怎样转发微信内容到朋友圈(如何将微信中的内容转发到朋友圈)
- 微信如何转发(微信朋友圈一键转发)
- 微信怎么转发应用(微信怎么互传app)
- 微信怎么把一条消息或链接转发给自己(微信消息怎么全部转发)
- 29 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-终篇
- 二 Selenium+Python系列 - 元素定位那些事
- 安装与配置FTP服务器
- 如何撤掉自己建的群 微信如何建立自己的微信群建群后如何撤销呢