微服务系列之分布式日志 ELK

1.ELK简介
ELK是ElasticSearch+LogStash+Kibana的缩写,是现代微服务架构流行的分布式日志解决方案,旨在大规模服务的日志集中管理查看 , 极大的为微服务开发人员提供了排查生产环境的便利 。如果规模较小的日志量,直接使用ElasticSearch、Logstash、Kibana是可以满足其应用的 , 但是对于日志量较大的中大规模服务集群来说,这3个中间会引入Filebeat、Kafka、Zookpeer三个中间来大幅度提升采集性能、可靠性、可扩展性 。目前来说,大部分公司使用的解决方案架构如下图:

微服务系列之分布式日志 ELK

文章插图
此篇文章,我们一起来熟悉整个流程的搭建,为了方便演示,环境基于docker(正常情况下,因为这套系统是直接linux部署的 , 因为开销实在是很大) 。
2.API服务
先建一个api服务 , 使用过滤器,让请求前后都会产生日志
微服务系列之分布式日志 ELK

文章插图
我这里,将日志写到根目录下logs文件夹,以MyDockerApi *.log产生日志文件 , 接下来,发布,并上传到linux服务器,并用docker启动 , 不会的同学传送门:https://www.cnblogs.com/saltlight-wangchao/p/16646005.html 。
微服务系列之分布式日志 ELK

文章插图
由于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

文章插图
至此,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

文章插图
使用 docker logs -f filebeat 命令,查看filebeat日志
微服务系列之分布式日志 ELK

文章插图
上图可见,采集完日志后,像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

文章插图
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

推荐阅读