滴滴数据通道服务演进之路_滴滴
滴滴数据通道服务演进之路_滴滴_02

桔妹导读:滴滴数据通道引擎承载着全公司的数据同步,为下游实时和离线场景提供了必不可少的源数据。随着任务量的不断增加,数据通道的整体架构也随之发生改变。本文介绍了滴滴数据通道的发展历程,遇到的问题以及今后的规划。

1. 背景

数据,对于任何一家互联网公司来说都是非常重要的资产,公司的大数据部门致力于解决如何更好的使用数据,挖掘数据价值,而数据通道服务作为“大数据”的前置链路,一直以来都在默默的为公司提供及时,完整的数据服务,这里我们对滴滴数据通道的演进做一个全面的介绍。

2. 数据通道简介

数据通道服务,顾名思义,是数据的通路,负责将数据从A同步到B的一套解决方案。

异构数据的同步是公司很多业务的普遍需求,通道服务也就成为了一项基础服务。包括但不限于日志,Binlog同步到下游各类存储和引擎中,如HIVE,ES,HBase等,用于报表,运营等场景。

数据通道方案本身涉及的组件很多,链路也比较复杂,这里通过一个简化的有向图来介绍下通道的核心流程。

滴滴数据通道服务演进之路_滴滴_03

有向图的顶点表示存储,包括磁盘,消息队列以及各种存储服务,边和方向表示数据流量,而数据流动的动力则是边上的各个同步引擎。仅从图中的链路可以看出,基础组件包括以下几种:

组件名称组件说明
容器业务方运行的容器是数据产生的地方,是异构数据的原始数据,包括业务日志和Binlog等。
AgentAgent负责数据采集,常见的远端数据包括普通日志和Binlog,Agent负责将这类数据采集后发送到消息队列中,通过读取文件,并记录offset的方式,保证至少一次的数据采集服务。
Kafka消息队列的加入主要用于数据复用,削峰填谷以及上下游解耦。采集一份数据,多个下游可以根据需要消费后自行处理,同时借用消息队列的高吞吐能力,减少上下游的耦合,在流量突增的时候可以起到缓冲的效果。
DSinkDSink组件是公司内对数据投递服务的简称,主要负责消费MQ数据投递到下游存储,通过消息队列的OffSet保证至少一次的数据投递。
ES/HDFS存储引擎,异构数据通过上述投递服务,完成结构化处理,投递到下游存储中,供业务方使用。
ETL写入HDFS数据一般来说都是作为业务方ETL的输入,经过自定义的处理逻辑后写入HIVE,供分析和计算使用。
数据仓库数据仓库中保存结构化的数据,方便业务系统或者下游级联使用。
各类业务系统业务系统直接对接ES或者数据仓库,提供线上或者准线上服务。

3. 数据通道服务的演进

数据通道致力于解决异构数据同步的问题,从开始构建到现在,经历了组件平台化,服务化,产品化,引擎升级和智能化几个阶段,每个阶段都面临着各种各样的问题,而问题的解决都伴随着系统稳定性,可靠性的提升。

3.1 组件平台化

目标:更好地服务业务

数据通道构建初期,各个组件各自维护,为业务方提供数据服务,业务有需求过来的时候各个组件快速启动一个进程就可以为业务方提供一个端到端的数据通路,业务拿到数据就可以分析计算,完整相关的业务指标。随着业务发展,需求不断增多,经过了一段时间的野蛮增长后,通道的任务数也水涨船高,大量的任务需要规范的平台来管控,因此在通道服务活下来以后第一件需要做的事就是组件平台化,这么多任务需要有一个统一的管控平台管理起来,方便根据用户的需求,新建修改或者删除任务。

滴滴数据通道服务演进之路_滴滴_04

3.2 服务化

目标:承诺SLA

面临问题:如何保证各个环节的At Least Once数据的完整性和及时性是下游服务关注的重点,完整性是基础,在这之上尽可能保障及时性。对于下游来说,可以容忍短暂的延迟,但是不能数据数据不准确的情况,因此,自下而上的,通道服务要为自己同步的数据负责。要为下游提供一致性服务,一方面需要各个组件能够提供At Least Once的语义保证,另外一方面则需要一个数据质量中心对外提供数据质量服务。

滴滴数据通道服务演进之路_滴滴_05

介绍一个简单的场景:DSink在数据同步过程中如何实现At Least Once数据投递服务DSink是消费MQ消息,投递到下游存储,MQ以Kakfa为例,DSink在投递的过程中是异步多线程同时投递,那怎么保证数据投递完成之后提交准确的offset呢,毕竟一个partition的数据会分不到多个线程中同时投递,投递的下游可能会因为网络或者压力的原因失败,还需要重试。方案一:一批数据都投递完成后再继续消费,也就是全部投递成功之前阻塞上游消费,这样可以保证提交的offset是准确的。但是这样就会有性能问题,在日志场景下会严重影响性能。方案二(DSink采用方案):使用TreeMap保存offset,Map的value为一个范围,A-B的offset范围,Key则为这个范围的最小值A,每次有一个partition的offset处理成功后则加入到TreeMap中,具体过程如下:

滴滴数据通道服务演进之路_滴滴_06 定时提交offset时只需要获取Map中第一个Entry value的结束offset进行提交即.........