小米数据收集利器:AgentSource

揭秘小米内部的数据收集利器

往期文章回顾: 万亿级消息背后: 小米消息队列的实践

背景概述

小米内部各业务每天会产生大量数据,有的是实时产生用于计算,有的落盘写入日志文件待后续分析,还有写入MySQL数据库。 为了更好更快的将数据同步到Hadoop相关平台存储和计算,对于MySQL的数据,前面文章《 Mysql数据实时同步实践 》很好的解决了此类场景,而对于前两种情况,需要一套统一的数据收集解决方案来实现业务数据与后端Hadoop平台的连接,AgentSource则很好的做到了这一点。

AgentSource作为Talos Platform中使用广泛且非常重要的数据收集方式,当前已支持6种接入方式,TalosPlatform中注册topic数在1W6左右,其中使用AgentSource作为数据收集接入方式的占80%左右,日均接入数据达万亿条规模,其核心LCSAgent已在公司2W+ 台机器上进行部署。

AgentSource通过在每台机器上部署一个LCSAgent实例,实现数据的收集等需求。 其支持的数据收集方式主要有: Thrift传输,文件传输,Scribe传输,HTTP传输,TailDir传输和OceanDir传输。

  • Thrift传输,文件传输,Scribe传输是官方提供的客户端打点SDK,用于实现发送数据到LCSAgent,提供数据缓存,Metric收集等高级功能。

  • 对于Http传输,TailDir传输和OceanDir传输,需要依赖相关的协议进行自行扩展。

  • HTTP传输即支持HTTP协议的数据收集。

  • TailDir传输支持本地多级目录多文件的扫描收集。

  • OceanDir传输是在公司Ocean弹性调度平台上支持收集容器内文件的扫描采集。

AgentSource详细介绍

我们来详细介绍下AgentSource的相关内容,首先我们了解下TalosPlatform数据流整体流程架构:

LCSAgent部署在业务的每台机器上收集用户数据,使用LCSServer作为配置管理中心,LCSAgent通过心跳机制定期与LCSServer交互,更新自身运行中数据流的最新配置;

使用包管理服务TankServer,提供给LCSAgent定期拉取新包进行自升级。

上述就是前端基于AgentSource作为数据的收集端,依托于团队自研流式消息队列Talos作为消息中间件,LCSTransferServer做为Transfer作业的管理提交服务,会启动相应后端服务的sink作业,进行消费Talos写到对应存储。

> > > >

支持多种传输方式

AgentSource支持多种丰富的接入方式,适合于各种接入场景,其核心为每个节点部署LCSAgent提供数据接收和采集服务。 具体如下:

Thrift传输

业务使用打点SDK通过thrift协议将数据转发到LCSAgent,目前SDK主要推荐LCSAgentSDK方式,支持Java、Go两种语言。 同时还可以使用用户自定义日志框架的Appender的方式将数据转发到LCSAgent,支持log4j/logback/log4j2的方式发送数据到LCSAgent,用户也可以通过扩展thrift client来实现数据写入。

Thrift传输的主要特点为:

  • 依赖RPC进行数据传输,数据延迟更低。

  • LCSAgent优化了线程模型,使得数据缓存机制更可靠。

  • LCSAgent优化了数据缓存模型,为了低延迟优先读写Memory,Memory写满之后再写本地磁盘。

HTTP传输

LCSAgent支持的传输协议为Http传输协议,即任何支持Http协议的客户端都可以发送数据到本机的LCSAgent,LCSAgent能够更便捷的提供多语言支持,并提供发送单条及多条数据Rest接口。

TailDir传输

TailDir传输方式支持本地多级目录多文件的扫描收集。 LCSAgent能够根据用户在Web页面配置的过滤条件,监控指定目录下匹配到文件的新增内容,将数据直接发送到talos。

LCSAgent会维护一个记录每个文件上次处理到位置信息的position文件,以确保故障重启后不会重复读取数据。

通过设备标识符device和文件标识符inode组合标识一个文件,这样文件被系统重命名或者移到另外的目录下后还是会被认为是同一个文件,避免了LCSAgent对同一个文件内容重复采集。

OceanDir传输

OceanDir传输可以算是TaildDir传输方式的扩展,能够在弹性调度平台Ocean上进行容器内日志的采集。 用户可通过融合云Web页面将Ocean产品线下的实例作业与TalosPlatform进行绑定。 并且Ocean研发同学实现了在容器实例化时相应的创建容器内目录到宿主机上的软链。 LCSAgent可以获取配置,通过软链在宿主机上采集容器内对应目录的文件转发到相应topic。

  • 每个产品线的日志会在LCSAgent中由内部单独的队列采集日志进行转发,解决不同产品线容器环境多租户隔离的问题,

  • 动态监控宿主机上容器实例创建、删除,第一时间采集新部署的容器。

  • 通过dev和inode标识判断一个文件是否发生了轮转,进而避免重复日志采集。

> > > >

配置中心化管理

用户当前配置数据流接入可以在融合云前端页面上进行配置。 所有数据流配置通过LCSServer管理,且能够通过心跳机制定时更新配置到其对应的LCSAgent上。 用户仅需在融合云上创建Talos的topic,然后配置对应source和sink,即可通过AgentSource收集应用节点上数据到Talos,然后通过sink作业转出到后端系统。

在LCSAgent中,配置更新通过HeartBeat同LCSServer同步该agent中所处理的数据流配置。 其会将自身的AgentInfo传给LCSserver,server端记录agent的状态,返回其所对应的所有流最新配置。 其中AgentInfo包含LCSAgent状态、包版本、心跳次数、以及当前运行中的流的集合。

当用户发送新的数据流数据到LCSAgent时,LCSAgent会主动请求LCSServer,获取新数据流的配置。 同时LCSAgent会把最近一次HeartBeat的配置缓存在本地,当LCSServer不可用时,可以使用本地缓存配置继续实现数据流的收集。

> > > >

LCSAgent自升级机制

LCSAgent的升级方式为定期检查最近包的版本,自动下载包,重启升级。 整个过程对业务方透明。 为此,我们依赖了Tank sever,Tank server是为数据流 LCSAgent 以及其他服务提供灰度发布和包版本升级功能的服务。

当有新版本LCSAgent需要升级时,只需要将新版本的包上传到LCSAgent,创建新的灰度任务,添加灰度机器范围,即可进行机器上LCSAgent的自动灰度升级,这里的灰度机器范围可通过填写机器名,机器tag,以及全量机器百分比的方式来确定。

以此,LCSAgent的升级方式大大缩减了升级成本,提升了升级效率。 实现了LCSAgent全公司统一维护。

> > > >

端到端数据质量监控

我们在每个数据流阶段包括LCSLoggerSDK和LCSAgent增加了监控打点逻辑,帮助业务能够知晓数据在LCSLoggerSDK端和LCSAgent端的数据收发和相关延迟的情况,做到数据流端到端的审计。 具体看审计数据汇总整理的流程,如图:

整个审计数据的处理可以说是一条缩小版的数据流,共分为三个阶段: 收集,合并和展示。

  • 收集阶段,数据流的各个模块都将审计数据落盘,Agent 读取原始记录打入Talos;

  • 合并阶段,数据质量监控作业消费Talos数据并进行聚合,将聚合后的数据存入drurid;

  • 展示阶段,将审计数据通过融合云展示到 Web 供用户查询。

> > > >

端其他功能点

本地缓存

AgentSource在SDK端和LCSAgent服务端均引入内存buffer机制,接收的数据首先写入buffer,当buffe写满时,会将buffer中的数据flush到本地磁盘,在进程关闭重启时,也会将buffer中的数据进行刷盘操作,这样能够很好应对流量突增和后端系统异常时数据持续发送等非正常场景下造成的影响,最大限度保证数据完整性。

Source提速

当数据流量过大时在LCSAgent缓存本地文件,如果是持续流量,缓存文件总会达到上限,所以提供Source提速功能,用户配置后,能够增加对应配置数的发送线程,来提升数据的发送速率。 该项配置建议单台机器流量在30M/s之上的情况下进行配置,默认为1。 最大能将转储速率提升到70M+/s。

LCSAgentSDK

我们之前采用了log4j、log4j2、logback 三种框架作为发送数据的方式,但也因此带来了很多使用不便和理解上的困难,为此我们推出LCSAgentSDK,不依赖于任何一种日志框架,直接使用thrift协议向agent发送数据,使用简便。 解决之前用户遇到的工程依赖,配置生效等问题。

> > > >

数据收集场景

服务端埋点数据收集

业务服务需要进行埋点数据收集,然后进行相应的数据分析。 埋点的含义是需要在业务的逻辑代码里面嵌入LCSAgent的API,进而进行数据的收集。 另外此处的数据含义非常广,包括但是不限于如下:

  • 用户数据统计: 例如小米统计依赖AgentSource进行埋点,然后后续分析统计日活和新增等。

  • 系统间调用数据: 例如Zander和信息部模调系统,通过AgentSource收集业务的调用延迟数据,进而进行数据链路的追踪。

  • 业务统计数据: 例如新上业务,或者进行A/B Test时,通过AgentSource进行埋点,通过数据分析后驱动后续决策

文本文件日志收集

业务的各种服务产生了大量的日志,可以利用LCSAgent进行日志收集,然后通过TalosSink转储到ElasticSearch进行线上服务日志的分析/问题排查。 例如Nginx日志,服务异常日志等等。

容器环境下数据收集

业务在容器环境下部署应用的情况,应用可以直接将埋点数据使用thrift传输发送到LCSAgent或者产生容器内部日志文件LCSAgent均可进行采集。

HTTP协议数据收集

业务服务使用php或者其他非Java/Go语言实现,无法使用打点SDK并且不想写本地日志的情况,可以直接使用HTTP协议发送数据到LCSAgent。

其他适合单机数据收集的场景

AgentSouce的特点是每台机器都会部署LCSAgent服务,并且每个LCSAgent实例能支持不同的数据流中转。 因此AgentSource适用的范围很广,业务可以根据自身的特点进行使用。

总结      

AgentSource作为TalosPlatform主要的数据收集接入端,其核心是为业务方在使用流式平台过程中提供便捷的接入体验,为此我们的工作一直围绕服务稳定性,扩展接入场景,提升接入性能等方面开展。 本篇文档简单介绍了AgentSource支持的接入方式,应用场景以及一些优化功能点。 很多细节本文没有展开,后续也会针对推出一些文章进行讲解,欢迎感兴趣的同学们继续关注我们的系列文章。  

我就知道你“在看”

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章