ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 企业开发 >> Flume+Kafka收集Docker容器内分布式日志应用实践

Flume+Kafka收集Docker容器内分布式日志应用实践(1/6)

来源:网络整理     时间:2016-05-24     关键词:docker,kafka

本篇文章主要介绍了"Flume+Kafka收集Docker容器内分布式日志应用实践",主要涉及到docker,kafka方面的内容,对于企业开发感兴趣的同学可以参考一下: 1 背景和问题随着云计算、PaaS平台的普及,虚拟化、容器化等技术的应用,例如Docker等技术,越来越多的服务会部署在云端。通常,我们需要需要获取日志,来进行...

1 背景和问题

随着云计算、PaaS平台的普及,虚拟化、容器化等技术的应用,例如Docker等技术,越来越多的服务会部署在云端。通常,我们需要需要获取日志,来进行监控、分析、预测、统计等工作,但是云端的服务不是物理的固定资源,日志获取的难度增加了,以往可以SSH登陆的或者FTP获取的,现在可不那么容易获得,但这又是工程师迫切需要的,最典型的场景便是:上线过程中,一切都在GUI化的PaaS平台点点鼠标完成,但是我们需要结合tail -F、grep等命令来观察日志,判断是否上线成功。当然这是一种情况,完善的PaaS平台会为我们完成这个工作,但是还有非常多的ad-hoc的需求,PaaS平台无法满足我们,我们需要日志。本文就给出了在分布式环境下,容器化的服务中的分散日志,如何集中收集的一种方法。

2 设计约束和需求描述

做任何设计之前,都需要明确应用场景、功能需求和非功能需求。

2.1 应用场景

分布式环境下可承载百台服务器产生的日志,单条数据日志小于1k,最大不超过50k,日志总大小每天小于500G。

2.2 功能需求

1)集中收集所有服务日志。

2)可区分来源,按服务、模块和天粒度切分。

2.3 非功能需求

1)不侵入服务进程,收集日志功能需独立部署,占用系统资源可控。

2)实时性,低延迟,从产生日志到集中存储延迟小于4s。

3)持久化,保留最近N天。

4)尽量递送日志即可,不要求不丢不重,但比例应该不超过一个阈值(例如万分之一)。

4)可以容忍不严格有序。

5)收集服务属于线下离线功能,可用性要求不高,全年满足3个9即可。

3 实现架构

一种方案实现的架构如下图所示:

3.1 Producer层分析

PaaS平台内的服务假设部署在Docker容器内,那么为了满足非功能需求#1,独立另外一个进程负责收集日志,因此不侵入服务框架和进程。采用Flume NG来进行日志的收集,这个开源的组件非常强大,可以看做一种监控、生产增量,并且可以发布、消费的模型,Source就是源,是增量源,Channel是缓冲通道,这里使用内存队列缓冲区,Sink就是槽,是个消费的地方。容器内的Source就是执行tail -F这个命令的去利用linux的标准输出读取增量日志,Sink是一个Kafka的实现,用于推送消息到分布式消息中间件。

3.2 Broker层分析

PaaS平台内的多个容器,会存在多个Flume NG的客户端去推送消息到Kafka消息中间件。Kafka是一个吞吐量、性能非常高的消息中间件,采用单个分区按照顺序的写入的方式工作,并且支持按照offset偏移量随机读取的特性,因此非常适合做topic发布订阅模型的实现。这里图中有多个Kafka,是因为支持集群特性,容器内的Flume NG客户端可以连接若干个Kafka的broker发布日志,也可以理解为连接若干个topic下的分区,这样可以实现高吞吐,一来可以在Flume NG内部做打包批量发送来减轻QPS压力,二来可以分散到多个分区写入,同时Kafka还会指定replica备份个数,保证写入某个master后还需要写入N个备份,这里设置为2,没有采用常用的分布式系统的3,是因为尽量保证高并发特性,满足非功能需求中的#4。

3.3 Consumer层分析

消费Kafka增量的也是一个Flume NG,可以看出它的强大之处,在于可以接入任意的数据源,都是可插拔的实现,通过少量配置即可。这里使用Kafka Source订阅topic,收集过来的日志同样先入内存缓冲区,之后使用一个File Sink写入文件,为了满足功能需求#2,可区分来源,按服务、模块和天粒度切分,我自己实现了一个Sink,叫做RollingByTypeAndDayFileSink,源代码放到了github上,可以从这个页面下载jar,直接放到flume的lib目录即可。

4 实践方法

4.1 容器内配置

Dockerfile

相关图片

相关文章