在设计篇中,我们给出了RTDP(Real-time Data Platform)的一个整体架构设计(图1)。在技术篇里,我们则会推荐整体技术组件选型;对每个技术组件做出简单介绍,尤其对我们抽象并实现的四个技术平台(统一数据采集平台、统一流式处理平台、统一计算服务平台、统一数据可视化平台)着重介绍设计思路;对Pipeline端到端切面话题进行探讨,包括功能整合、数据管理、数据安全等。
图1 RTDP架构
图2 整体技术选型
首先,我们简要解读一下图2:
下面我们会进一步细化上图涉及到的技术组件和切面话题,介绍技术组件的功能特性,着重讲解我们自研技术组件的设计思想,并对切面话题展开讨论。
1.2.1 数据总线平台DBus
图3 RTDP架构之DBus
1.2.1.1 DBus设计思想
1)从外部角度看待设计思想
2)从内部角度看待设计思想
✔ 生成每条消息的唯一单调递增id,对应系统字段ums_id_
✔ 确认每条消息的事件时间戳(event timestamp),对应系统字段ums_ts_
✔ 确认每条消息的操作模式(增删改,或insert only),对应系统字段ums_op_
1.2.1.2 DBus功能特性
1.2.1.3 DBus技术架构
图4 DBus数据流转架构图
更多DBus技术细节和用户界面,可以参看:
GitHub: https://github.com/BriData
1.2.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消息元数据管理和模式演变问题呢?
1.2.2.1 元数据管理(Metadata Management)
1.2.2.2 模式演变(Schema Evolution)
[Datastore].[Datastore Instance].[Database].[Table].[TableVersion].[Database Partition].[Table Partition]
例:oracle.oracle01.db1.table1.v2.dbpar01.tablepar01
其中[Table Version]代表了这张表的某个Schema的版本号,如果数据源是数据库,那么这个版本号是由DBus自动维护的。
由上文可以看出,Schema Registry和DBus+UMS是两种不同的解决元数据管理和模式演变的设计思路,两者各有优势和劣势,可以参考表1的简单比较。
表1 Schema Registry 与 DBus+UMS 对比
这里给出一个UMS的例子:
图6 UMS消息举例
1.2.3 流式处理平台Wormhole
图7 RTDP架构之Wormhole
1.2.3.1 Wormhole设计思想
1)从外部角度看待设计思想
2)从内部角度看待设计思想
✔ 统一DAG高阶分形抽象
✔ 统一通用流消息UMS协议抽象
✔ 统一数据逻辑表命名空间Namespace抽象
✔ SinkProcessor:扩展更多Sink支持
✔ SwiftsInterface:自定义流上处理逻辑支持
✔ UDF:更多流上处理UDF支持
1.2.3.2 Wormhole功能特性
1.2.3.3 Wormhole技术架构
图8 Wormhole数据流转架构图
更多Wormhole技术细节和用户界面,可以参看:
GitHub:https://github.com/edp963/wormhole
1.2.4 常用数据计算存储选型
RTDP架构对待数据计算存储选型的选择采取开放整合的态度。不同数据系统有各自的优势和适合的场景,但并没有一个数据系统可以适合各种各样的存储计算场景。因此当有合适的、成熟的、主流的数据系统出现,Wormhole和Moonbox会按照需要相应的扩展整合支持。
这里大致列举一些比较通用的选型:
关系型数据库(Oracle/MySQL等):适合小数据量的复杂关系计算
分布式列存储系统
✔ Kudu:Scan优化,适合OLAP分析计算场景
✔ HBase:随机读写,适合提供数据服务场景
✔ Cassandra:高性能写,适合海量数据高频写入场景
✔ ClickHouse:高性能计算,适合只有insert写入场景(后期将支持更新删除操作)
✔ HDFS/Parquet/Hive:append only,适合海量数据批量计算场景
✔ MongoDB:平衡能力,适合大数据量中等复杂计算
✔ ElasticSearch:索引能力,适合做模糊查询和OLAP分析场景
✔ Druid/Kylin:预计算能力,适合高性能OLAP分析场景
1.2.5 计算服务平台Moonbox
图9 RTDP架构之Moonbox
1.2.5.1 Moonbox设计思想
1)从外部角度看待设计思想
2)从内部角度看待设计思想
1.2.5.2 Moonbox功能特性
1.2.5.3 Moonbox技术架构
图10 Moonbox逻辑模块
更多Moonbox技术细节和用户界面,可以参看:
GitHub: https://github.com/edp963/moonbox
1.2.6 可视应用平台Davinci
图11 RTDP架构之Davinci
1.2.6.1 Davinci设计思想
1)从外部角度看待设计思想
2)从内部角度看待设计思想
1.2.6.2 Davinci功能特性
1)数据源
2)数据视图
3)可视组件
4)交互能力
5)集成能力
6)安全权限
更多Davinci技术细节和用户界面,可以参看:
GitHub:https://github.com/edp963/davinci
1.3.1 数据管理
1)元数据管理
2)数据质量
3)血缘分析
1.3.2 数据安全
图12 RTDP数据安全
上图给出了RTDP架构中,四个开源平台覆盖了端到端数据流转链路,并且在每个节点上都有对数据安全各个方面的考量和支持,确保了实时数据管道端到端的数据安全性。
另外,由于Moonbox成为了面向应用层数据访问的统一入口,因此基于Moonbox的操作审计日志可以获得很多安全层面的信息,可以围绕操作审计日志建立数据安全预警机制,进而建设企业级数据安全系统。
1.3.3 开发运维
1)运维管理
2)监控预警
上一章我们介绍了RTDP架构各个技术组件的设计架构和功能特性,至此读者已经对RTDP架构如何落地有了具体的认识和了解。那么RTDP架构可以解决哪些常见数据应用场景呢?下面我们会探讨几种使用模式,以及不同模式适应何种需求场景。
2.1.1 模式描述
同步模式,是指只配置异构数据系统之间的数据实时同步,在流上不做任何处理逻辑的使用模式。
具体而言,通过配置DBus将数据从数据源实时抽取出来投放在Kafka上,然后通过配置Wormhole将Kafka上数据实时写入到Sink存储中。同步模式主要提供了两个能力:
2.1.2 技术难点
具体实施比较简单。
IT实施人员无需了解太多流式处理的常见问题,不需要考虑流上处理逻辑实现的设计和实施,只需要了解基本的流控参数配置即可。
2.1.3 运维管理
运维管理比较简单。
需要人工运维。但由于流上没有处理逻辑,因此容易把控流速,无需考虑流上处理逻辑本身的功耗,可以给出一个相对稳定的同步管道配置。并且也很容易做到定时端到端数据比对来确保数据质量,因为源端和目标端的数据是完全一致的。
2.1.4 适用场景
2.2.1 模式描述
流算模式,是指在同步模式的基础上,在流上配置处理逻辑的使用模式。
在RTDP架构中,流上处理逻辑的配置和支持主要在Wormhole平台上进行。在同步模式的能力之上,流算模式主要提供了两个能力:
2.2.2 技术难点
具体实施相对较难。
用户需要了解流上处理能做哪些事,适合做哪些事,如何转化全量计算逻辑成为增量计算逻辑等。还要考虑流上处理逻辑本身功耗和依赖的外部数据系统等因素来调节配置更多参数。
2.2.3 运维管理
运维管理相对较难。
需要人工运维。但比同步模式运维管理更难,主要体现在流控参数配置考虑因素较多、无法支持端到端数据比对、要选择结果快照最终一致性实现策略、要考虑流上Lookup时间对齐策略等方面问题。
2.2.4 适用场景
2.3.1 模式描述
轮转模式,是指在流算模式的基础上,在数据实时落库中,同时跑短时定时任务在库上进一步计算后,将结果再次投放在Kafka上跑下一轮流上计算,这样流算转批算、批算转流算的使用模式。
在RTDP架构中,可以利用Kafka->Wormhole->Sink->Moonbox->Kafka的整合方式实现任何轮次任何频次的轮转计算。在流算模式的能力之上,轮转模式提供的主要能力是:理论上支持低延迟的任何复杂流转计算逻辑。
2.3.2 技术难点
具体实施难。
Moonbox转Wormhole能力的引入,比流算模式进一步增加了考虑的变量因素,如多Sink的选择、Moonbox计算的频率设定、如何拆分Wormhole和Moonbox的计算分工等方面问题。
2.3.3 运维管理
运维管理难。
需要人工运维。和流算模式比,需要更多数据系统因素的考虑、更多参数的配置调优、更难的数据质量管理和诊断监控。
2.3.4 适用场景
2.4.1 模式描述
智能模式,是指利用规则或算法模型来进行优化和增效的使用模式。
可以智能化的点:
2.4.2 技术难点
具体实施在理论上最简单,但有效的技术实现最难。
用户只需要完成离线逻辑开发,剩下交由智能化工具完成开发、部署、调优、运维。
2.4.3 运维管理
零运维。
2.4.4 适用场景
全场景。
自此,我们对“如何设计实时数据平台”这个话题的讨论暂时告一段落。我们从概念背景,讨论到架构设计,接着介绍了技术组件,最后探讨了模式场景。由于这里涉及到的每个话题点都很大,本文只是做了浅层的介绍和探讨。后续我们会不定期针对某个具体话题点展开详细讨论,将我们的实践和心得呈现出来,抛砖引玉,集思广益。如果对RTDP架构中的四个开源平台感兴趣,欢迎在GitHub上找到我们,了解使用,交流建议。