作者:卢山巍
敏捷之歌
我抽数故我存在 | DBus
人人玩转流处理 | Wormhole
就当吾是数据库 | Moonbox
颜值最后十公里 | Davinci
导读:实时数据平台(RTDP,Real-time Data Platform)是一个重要且常见的大数据基础设施平台。在上篇(设计篇)中,我们从现代数仓架构角度和典型数据处理角度介绍了RTDP,并探讨了RTDP的整体设计架构。本文作为下篇(技术篇),则是从技术角度入手,介绍RTDP的技术选型和相关组件,探讨适用不同应用场景的相关模式。RTDP的敏捷之路就此展开~
回顾上篇(设计篇)请戳这里:如何设计RTDP(上篇)
在设计篇中,我们给出了RTDP的一个整体架构设计(图1)。在技术篇里,我们则会推荐整体技术组件选型;对每个技术组件做出简单介绍,尤其对我们抽象并实现的四个技术平台(统一数据采集平台、统一流式处理平台、统一计算服务平台、统一数据可视化平台)着重介绍设计思路;对Pipeline端到端切面话题进行探讨,包括功能整合、数据管理、数据安全等。
图1
首先,我们简要解读一下图2:
下面我们会进一步细化上图涉及到的技术组件和切面话题,介绍技术组件的功能特性,着重讲解我们自研技术组件的设计思想,并对切面话题展开讨论。
2.技术组件介绍
DBus设计思想
从外部角度看待设计思想
✔ 负责对接不同的数据源,实时抽取出增量数据,对于数据库会采用操作日志抽取方式,对于日志类型支持与多种Agent对接。
✔ 将所有消息以统一的UMS消息格式发布在Kafka上,UMS是一种标准化的自带元数据信息的JSON格式,通过统一UMS实现逻辑消息与物理Kafka Topic解耦,使得同一Topic可以流转多个UMS消息表。
✔ 支持数据库的全量数据拉取,并且和增量数据统一融合成UMS消息,对下游消费透明无感知。
从内部角度看待设计思想
✔ 基于Storm计算引擎进行数据格式化,确保消息端到端延迟最低。
✔ 对不同数据源数据进行标准化格式化,生成UMS信息,其中包括:
◇ 生成每条消息的唯一单调递增id,对应系统字段ums_id_
◇ 确认每条消息的事件时间戳(event timestamp),对应系统字段ums_ts_
◇ 确认每条消息的操作模式(增删改,或insert only),对应系统字段ums_op_
✔ 对数据库表结构变更实时感知并采用版本号进行管理,确保下游消费时明确上游元数据变化。
✔ 在投放Kafka时确保消息强有序(非绝对有序)和at least once语义。
✔ 通过心跳表机制确保消息端到端探活感知。
DBus功能特性
DBus技术架构
图4 DBus数据流转架构图
更多DBus技术细节和用户界面,可以参看:
#DBus# 关系型数据库全表扫描分片详解
GitHub用户手册:
https://bridata.github.io/DBus/
(2) 分布式消息系统Kafka
Kafka已经成为事实标准的大数据流式处理分布式消息系统,当然Kafka在不断的扩展和完善,现在也具备了一定的存储能力和流式处理能力。关于Kafka本身的功能和技术已经有很多文章信息可以查阅,本文不再详述Kafka的自身能力。
这里我们具体探讨Kafka上消息元数据管理(Metadata Management)和模式演变(Schema Evolution)的话题。
图5
图片来源:http://cloudurable.com/images/kafka-ecosystem-rest-proxy-schema-registry.png
图5显示,在Kafka背后的Confluent公司解决方案中,引入了一个元数据管理组件:Schema Registry。这个组件主要负责管理在Kafka上流转消息的 元数据信息和Topic信息,并提供一系列元数据管理服务。之所以要引入这样一个组件,是为了Kafka的消费方能够了解不同Topic上流转的是哪些数据,以及数据的元数据信息,并进行有效的解析消费。任何数据流转链路,不管是在什么系统上流转,都会存在这段数据链路的元数据管理问题,Kafka也不例外。Schema Registry是一种中心化的Kafka数据链路元数据管理解决方案,并且基于Schema Registry,Confluent提供了相应的Kafka数据安全机制和模式演变机制。更多关于Schema Registry的介绍,可以参看:
Kafka Tutorial:Kafka, Avro Serialization and the Schema Registry
http://cloudurable.com/blog/kafka-avro-schema-registry/index.html
那么在RTDP架构中,如何解决Kafka消息元数据管理和模式演变问题呢?
元数据管理(Metadata Management)
✔ DBus会自动将实时感知的数据库元数据变化记录下来并提供服务
✔ DBus会自动将在线格式化的日志元数据信息记录下来并提供服务
✔ DBus会发布在Kafka上发布统一UMS消息,UMS本身自带消息元数据信息,因此下游消费时无需调用中心化元数据服务,可以直接从UMS消息里拿到数据的元数据信息
模式演变(Schema Evolution)
✔ UMS消息会自带Schema的Namespace信息,Namespace是一个7层定位字符串,可以唯一定位任何表的任何生命周期,相当于数据表的IP地址,形式如下:
[Datastore].[Datastore Instance].[Database].[Table].[TableVersion].[Database Partition].[Table Partition]
例:
oracle.oracle01.db1.table1.v2.dbpar01.tablepar01
其中[Table Version]代表了这张表的某个Schema的版本号,如果数据源是数据库,那么这个版本号是由DBus自动维护的。
✔ 在RTDP架构中,Kafka的下游是由Wormhole消费的,Wormhole在消费UMS时,会将[TableVersion]作为*处理,意味着当某表上游Schema变更时,Version会自动升号,但Wormhole会无视这个Version变化,将会消费此表所有版本的增量/全量数据,那么Wormhole如何做到兼容性模式演变支持呢?在Wormhole里可以配置流上处理SQL和输出字段,当上游Schema变更是一种“兼容性变更”(指增加字段,或者修改扩大字段类型等)时,是不会影响到Wormhole SQL正确执行的。当上游发生非兼容性变更时,Wormhole会报错,这时就需要人工介入对新Schema的逻辑进行修复。
由上文可以看出,Schema Registry和DBus+UMS是两种不同的解决元数据管理和模式演变的设计思路,两者各有优势和劣势,可以参考表1的简单比较。
表1 Schema Registry 与 DBus+UMS 对比
(3) 流式处理平台Wormhole
图7 RTDP架构之Wormhole
Wormhole设计思想
从外部角度看待设计思想
✔ 消费来自Kafka 的UMS消息和自定义JSON消息
✔ 负责对接不同的数据目标存储 (Sink),并通过幂等逻辑实现Sink的最终一致性
✔ 支持配置SQL方式实现流上处理逻辑
✔ 提供Flow抽象。Flow由一个Source Namespace和一个Sink Namespace定义,且具备唯一性。Flow上可以定义处理逻辑,是一种流上处理的逻辑抽象,通过与物理Spark Streaming、Flink Streaming解耦,使得同一个Stream可以处理多个Flow处理流,且Flow可以在不同Stream上任意切换。
✔ 支持基于回灌(backfill)的Kappa架构;支持基于Wormhole Job的Lambda架构
从内部角度看待设计思想
✔ 基于Spark Streaming、Flink计算引擎进行数据流上处理。Spark Streaming可支持高吞吐、批量Lookup、批量写Sink等场景;Flink可支持低延迟、CEP规则等场景。
✔ 通过ums_id_, ums_op_实现不同Sink的幂等入库逻辑
✔ 通过计算下推实现Lookup逻辑优化
✔ 抽象几个统一以支持功能灵活性和设计一致性
◇ 统一DAG高阶分形抽象
◇ 统一通用流消息UMS协议抽象
◇ 统一数据逻辑表命名空间Namespace抽象
✔ 抽象几个接口以支持可扩展性
◇ SinkProcessor:扩展更多Sink支持
◇ SwiftsInterface:自定义流上处理逻辑支持
◇ UDF:更多流上处理UDF支持
✔ 通过Feedback消息实时归集流式作业动态指标和统计
Wormhole功能特性
Wormhole技术架构
图8 Wormhole数据流转架构图
更多Wormhole技术细节和用户界面,可以参看:
Wormhole# (开源)流式处理平台设计思想
GitHub用户手册:
https://github.com/edp963/wormhole
(4) 常用数据计算存储选型
RTDP架构对待数据计算存储选型的选择采取开放整合的态度。不同数据系统有各自的优势和适合的场景,但并没有一个数据系统可以适合各种各样的存储计算场景。因此当有合适的、成熟的、主流的数据系统出现,Wormhole和Moonbox会按照需要相应的扩展整合支持。
这里大致列举一些比较通用的选型:
(5) 计算服务平台Moonbox
图9 RTDP架构之Moonbox
Moonbox设计思想
从外部角度看待设计思想
✔ 负责对接不同的数据系统,支持统一方式跨异构数据系统即席混算
✔ 提供三种Client调用方式:RESTful服务、JDBC连接、ODBC连接
✔ 统一元数据收口;统一查询语言SQL收口;统一权限控制收口
✔ 提供两种查询结果写出模式:Merge、Replace
✔ 提供两种交互模式:Batch模式、Adhoc模式
✔ 数据虚拟化实现,多租户实现,可看作是虚拟数据库
从内部角度看待设计思想
✔ 对SQL进行解析,经过常规Catalyst处理解析流程,最终生成可下推数据系统的逻辑执行子树进行下推计算,然后将结果拉回进行混算并返回
✔ 支持两层Namespace:database.table,以提供虚拟数据库体验
✔ 提供分布式服务模块Moonbox Grid提供高可用高并发能力
✔ 对可全部下推逻辑(无混算)提供快速执行通道
Moonbox功能特性
更多Moonbox技术细节和用户界面,可以参看:
#Moonbox# (开源)计算服务平台简介
GitHub用户手册:
https://github.com/edp963/moonbox
(6) 可视应用平台Davinci
图11 RTDP架构之Davinci
Davinci设计思想
从外部角度看待设计思想
✔ 负责各种数据可视化展示功能
✔ 支持JDBC数据源
✔ 提供平权用户体系,每个用户可以建立属于自己的Org、Team和Project
✔ 支持SQL编写数据处理逻辑,支持拖拽式编辑可视化展示,提供多用户社交化分工协作环境
✔ 提供多种不同的图表交互能力和定制化能力,以应对不同数据可视化需求
✔ 提供嵌入整合进其他数据应用的能力
从内部角度看待设计思想
✔ 围绕View和Widget展开。View是数据的逻辑视图;Widget是数据可视化视图
✔ 通过用户自定义选择分类数据、有序数据和量化数据,按照合理的可视化逻辑自动展现视图
Davinci功能特性
更多Davinci技术细节和用户界面,可以参看:
#Davinci# (开源)可视应用平台介绍与展望
GitHub用户手册:
https://github.com/edp963/davinci
3.切面话题讨论
(1) 数据管理
上图给出了RTDP架构中,四个开源平台覆盖了端到端数据流转链路,并且在每个节点上都有对数据安全各个方面的考量和支持,确保了实时数据管道端到端的数据安全性。
另外,由于Moonbox成为了面向应用层数据访问的统一入口,因此基于Moonbox的操作审计日志可以获得很多安全层面的信息,可以围绕操作审计日志建立数据安全预警机制,进而建设企业级数据安全系统。
(3) 开发运维
• 运维管理
✔ 实时数据处理的运维管理向来是个痛点,DBus和Wormhole通过可视化UI提供了可视化运维管理能力,让人工运维变得简单。
✔ DBus和Wormhole提供了健康检查、操作管理、Backfill、Flow漂移等RESTful服务,可以基于此研发自动化运维系统。
• 监控预警
✔ DBus和Wormhole均提供可视化监控界面,可以实时看到逻辑表级的吞吐和延迟等信息。
✔ DBus和Wormhole提供了心跳、Stats、状态等RESTful服务,可以基于此研发自动化预警系统。
上一章我们介绍了RTDP架构各个技术组件的设计架构和功能特性,至此读者已经对RTDP架构如何落地有了具体的认识和了解。那么RTDP架构可以解决哪些常见数据应用场景呢?下面我们会探讨几种使用模式,以及不同模式适应何种需求场景。
1.同步模式
(1) 模式描述
同步模式,是指只配置异构数据系统之间的数据实时同步,在流上不做任何处理逻辑的使用模式。
具体而言,通过配置DBus将数据从数据源实时抽取出来投放在Kafka上,然后通过配置Wormhole将Kafka上数据实时写入到Sink存储中。同步模式主要提供了两个能力:
(2) 技术难点
具体实施比较简单。
IT实施人员无需了解太多流式处理的常见问题,不需要考虑流上处理逻辑实现的设计和实施,只需要了解基本的流控参数配置即可。
(3) 运维管理
运维管理比较简单。
需要人工运维。但由于流上没有处理逻辑,因此容易把控流速,无需考虑流上处理逻辑本身的功耗,可以给出一个相对稳定的同步管道配置。并且也很容易做到定时端到端数据比对来确保数据质量,因为源端和目标端的数据是完全一致的。
(4) 适用场景
2.流算模式
(1) 模式描述
流算模式,是指在同步模式的基础上,在流上配置处理逻辑的使用模式。
在RTDP架构中,流上处理逻辑的配置和支持主要在Wormhole平台上进行。在同步模式的能力之上,流算模式主要提供了两个能力:
(2) 技术难点
具体实施相对较难。
用户需要了解流上处理能做哪些事,适合做哪些事,如何转化全量计算逻辑成为增量计算逻辑等。还要考虑流上处理逻辑本身功耗和依赖的外部数据系统等因素来调节配置更多参数。
(3) 运维管理
运维管理相对较难。
需要人工运维。但比同步模式运维管理更难,主要体现在流控参数配置考虑因素较多、无法支持端到端数据比对、要选择结果快照最终一致性实现策略、要考虑流上Lookup时间对齐策略等方面问题。
(4) 适用场景
3.轮转模式
(1) 模式描述
轮转模式,是指在流算模式的基础上,在数据实时落库中,同时跑短时定时任务在库上进一步计算后,将结果再次投放在Kafka上跑下一轮流上计算,这样流算转批算、批算转流算的使用模式。
在RTDP架构中,可以利用Kafka->Wormhole->Sink->Moonbox->Kafka的整合方式实现任何轮次任何频次的轮转计算。在流算模式的能力之上,轮转模式提供的主要能力是:理论上支持低延迟的任何复杂流转计算逻辑。
(2) 技术难点
具体实施难。
Moonbox转Wormhole能力的引入,比流算模式进一步增加了考虑的变量因素,如多Sink的选择、Moonbox计算的频率设定、如何拆分Wormhole和Moonbox的计算分工等方面问题。
(3) 运维管理
运维管理难。
需要人工运维。和流算模式比,需要更多数据系统因素的考虑、更多参数的配置调优、更难的数据质量管理和诊断监控。
(4) 适用场景
4.智能模式
(1) 模式描述
智能模式,是指利用规则或算法模型来进行优化和增效的使用模式。
可以智能化的点:
(2) 技术难点
具体实施在理论上最简单,但有效的技术实现最难。
用户只需要完成离线逻辑开发,剩下交由智能化工具完成开发、部署、调优、运维。
(3) 运维管理
零运维。
(4) 适用场景
全场景。
自此,我们对“如何设计实时数据平台”这个话题的讨论暂时告一段落。我们从概念背景,讨论到架构设计,接着介绍了技术组件,最后探讨了模式场景。由于这里涉及到的每个话题点都很大,本文只是做了浅层的介绍和探讨。后续我们会不定期针对某个具体话题点展开详细讨论,将我们的实践和心得呈现出来,抛砖引玉,集思广益。如果对RTDP架构中的四个开源平台感兴趣,欢迎在GitHub上找到我们,了解使用,交流建议。
如想了解更多,您还可以:
到Github浏览更多平台信息
DBus地址: https://github.com/BriData/DBus
Davinci地址: https://github.com/edp963/davinci
Wormhole地址: https://github.com/edp963/wormhole
Moonbox地址: https://github.com/edp963/moonbox
加入微信群,和技术大神们点对点交流
请先添加小助手:edpstack
(烦请告知小助手您的信息来源哦~如:“微信公众号”、“知乎专栏”、“CSDN”、“今日头条”等等~)
关注微信公众号“敏捷大数据”,获得第一手文章~