作为一名码农,你是否曾经遇到过如下这些令人头疼的问题:
需要不定期更新某个线上文件,心力交瘁;
有一组很大的数据文件,需要传送分发给大量的服务器,一台一台拷贝过去,费时费力;
有成千上万个数据字典会不定期更新,更新后需要立即传送到线上提供服务,每天更新成百上千次,传输操作,痛苦不堪。
有读者可能会想到,使用上线的方式去解决上述问题不就可以了嘛?然而,上线是一个比较繁琐的过程,要经过一系列严格的审批。上线的主要对象为程序,程序变更引入的 bug 导致服务异常的概率要高于数据变更,并且程序变更频率也很低,因此上线会引入一系列严格的审批流程。在数据变更高频率与低风险的背景下,上线很难满足数据变更的需求。
百度的各项业务也面临着同样的问题,比如搜索业务的词典变更、地图业务的数据变更等。为了解决线上数据变更的难题,百度数据服务应运而生。
基本介绍
百度数据服务为百度线上服务所需的数据提供一整套的解决方案,包括数据名字服务与权限管理(数据注册)、分发生效(数据配送)等一系列数据生命周期涉及的操作。数据配送系统相当于 B2C 中的快递,将数据从生产者(源模块)按照使用者的要求快递(配送)给消费者(目标模块)。 为了解决线上数据不定期更新的问题,它还引入了自动化流程,即业务方一旦产出新的数据,无需人工干预,即可进行线上数据变更。
图 1 百度数据服务基础结构
数据注册
数据注册解决数据的管理以及上下游依赖解耦问题,同时包括变更通知和数据权限管理。业务方完成数据注册会获得一个数据 key,数据 key 可以理解为业务方数据的别名并记录数据的版本信息以及权限信息。
用户可以将数据 key 与配送任务进行绑定,当业务方产生新数据时会生成对应的版本号,记录数据源信息并触发对应的配送任务。
线上的多个服务可能会依赖同一份数据,数据的变更需要在多个服务中同时生效,这就要求数据与线上服务进行解耦。一份数据只能对应一个数据 key,但是数据 key 可以与多个配送任务进行绑定。因此,百度数据服务可以做到一份数据的变更在多个线上服务中同时生效。
数据配送
数据配送负责数据在线上生效,主要由业务方数据的变更触发。
图 2 配送任务触发流程
整个配送过程依赖百度集群控制系统(CCS),数据配送任务在启动之前会将配送信息封装成 CCS job,然后向 CCS 发送请求执行该 job。任务到达单机后,会执行配送插件,完成在单机的各种操作,如前置命令、数据下载和后置命令。前置命令与后置命令由用户自定义,完成数据在下载前和下载后的操作。
问题与方案
百度数据服务的宗旨是快速安全地将数据传输至线上并生效,因此要综合考虑风险控制与传输效率的问题,尽可能做到最优。
风险控制
既然百度数据服务引入了自动化流程,那必然要通过技术手段控制数据变更给线上服务带来的风险,因此它提供了分级配送的功能。
分级配送
分级配送是指将配送目标分成 N 个组,组与组之间串行配送,每个分组在完成配送之后回调检查接口对数据进行检查,检查失败则判定该组配送任务失败并将整个配送任务终止、向业务方发出报警,从而做到风险可控。
用户在创建配送任务时,通常把第一个分组中的机器设置为分级检查机器,如果第一个分组检查失败,数据将无法配送至线上,这进一步降低线上风险。
图 3 分级配送
传输效率
为了提高数据传输效率,百度数据服务还提供了预分发与 p2p 下载的功能并很好地支持数据跨地域传输。
预分发
在数据配送过程中,大部分时间耗费在数据下载。但是组与组之间串行配送将极大地增加数据变更生效时间,不符合数据变更高时效性的要求。为了解决这个问题,数据配送提供了预分发的功能。即允许所有的配送目标以并发的方式将数据下载至临时目录,然后再按照分组串行执行其他操作与分组检查。预分发的功能实现了数据下载与分组检查的解耦,将极大缩短数据生效时间。
p2p 下载
预分发功能使得配送目标并发下载数据,为了利用这种下载场景,我们通过 libtorrent 协议实现 p2p 下载工具 gingko,用于支持数十万台规模的机器同时进行 p2p 快速传输。预分发高并发下载的特点充分利用了 p2p 下载的优势,降低了对数据源的依赖,同地域下载平均速度提升十倍以上。
支持跨地域传输
当前百度的服务器有地域之分,主要为华北、华东和华南。这种现状导致数据在配送过程中涉及到跨地域数据传输问题。众所周知,跨地域传输成本高,而且还会出现网络拥塞状况,这将极大降低数据下载速度,降低数据变更时效性。
为了解决该问题,gingko 提供了链路选择功能,在 p2p 网络中每个节点仅从本地域 peer 获取数据。如果本地域没有种子,gingko 还提供了中转机功能,即本地域某一节点进行一次跨地域传输,当作本地域种子,从而尽可能减少跨地域甚至跨 IDC 流量。
总结
本文主要向大家介绍了百度数据服务以及在面对安全控制与传输效率两个问题时提出的解决方案,希望本文对大家有所帮助,起到抛砖引玉的作用。欢迎大家持续关注百度 AIOps,关注百度智能云。
作者介绍:
运小然,百度高级研发工程师,负责百度运维平台(数据传输)相关研发工作,致力于为百度云的用户提供安全、可靠与高效的数据分发服务。
本文转载自公众号 AIOps 智能运维(ID:AI_Ops)。
原文链接:
https://mp.weixin.qq.com/s/m8Jw_XCRs3pzu8uGuLz4wQ
评论