构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

算法灵珀客
• 阅读 268

作者|柳下

概述

随着企业规模和数据量的增长,数据的价值越来越受到重视。数据的变化和更新变得更加频繁和复杂,因此及时捕获和处理这些变化变得至关重要。为了满足这一需求,数据库 CDC(Change Data Capture)技术应运而生。然而,从 ETL 架构的角度来看,CDC 仅满足了数据的提取(Extract)能力。
为了实现完整的 ETL 架构,并完成高效、实时的数据集成、处理和同步,阿里云 Serverless 函数计算(FC)与数据库 CDC 技术深度融合。助力企业构建完整的 ETL 架构,实现数据的提取、转换和加载。通过将 CDC 作为事件驱动的数据源,将数据变化作为事件触发 Serverless 函数的执行,可以实现实时的数据处理和同步,有助于提升业务决策和分析的准确性和效率。

架构介绍

下面将从 ETL 模型入手,逐步讲述 FC + CDC 如何适配符合 ETL 模型的业务。

ETL 模型

在大数据领域,承载数据流转、加工业务的系统架构都可抽象为 ETL 模型,它由三个主要步骤组成:提取(Extract)、转换(Transfomr)和加载(Load)。

  1. 提取:从数据源中提取数据。数据源可以是各种数据存储系统。如:数据库、文件系统、消息队列、API接口等。
  2. 转换:数据经过一系列的转换操作转换为目标系统可以接受的格式和结构。如:数据清洗、数据合并、数据富化等。
  3. 加载:将转换后的数据加载到目标服务中。目标服务可以是数据仓库、数据湖、BI 系统等。

此架构应用广泛,帮助企业管理和利用数据,实现数据驱动的决策和业务转型。
构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

CDC + ETL

CDC 和 Extract(E) 是数据处理的两个概念,前者目的是捕获数据库中的变化数据,后者目的是从数据源中提取特定的数据集合。但回归业务本身,两者均是从数据源获取业务所需的数据,因此 CDC 和 ETL 的结合也是必然结果。两者的结合可构建更完整高效的数据处理流程,实现实时增量数据抽取和处理。相比传统的定期批量抽取方式,CDC 可更及时地捕获数据变化,使目标系统中的数据更加实时和准确。
构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

阿里云 DTS + FC

在阿里云数据库产品体系中,数据传输服务 DTS(Data Transmission Service)扮演了 CDC 的角色,作为实时数据流传输服务,它能够捕获上游数据库的变更信息,并将这些变更推送给下游服务。当下游服务是函数计算时,可以利用函数计算的自定义代码能力,对数据进行自定义加工(T)和投递(L)。如下图所示,FC 和 DTS 的深度集成构建了完整的 ETL 体系,为业务系统的快速搭建提供了帮助。
构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

功能详解

针对上文提到的 DTS + FC 架构,下面将剖析内部细节,深入理解系统的运行方式。

DTS 架构

DTS 在数据采集和数据传输上提供了完备的能力,DTS 系统可抽象为如下三大模块:

  1. Poller:从上游丰富的数据库服务获取数据,具体如下:

    • 传输数据类型:可传输存量数据或增量数据;
    • 数据获取方式:针对存量数据,DTS Poller 以并发查询方式扫描全表,将扫描结果投递至下游;针对增量数据,DTS Poller 监听并读取上游数据库的增量日志文件,解析文件中的日志信息并投递至下游;
    • 增量数据源:针对不同的上游数据库,DTS 会读取不同的增量日志文件。例如:当数据库为 MySQL 时读取 Binlog 文件,当数据库为 MongoDB 时读取 Oplog 文件;
  2. Format Plugin:将获取的数据统一格式化为 Canal Json 格式,格式的统一标准化便于数据解析逻辑复用于不同的数据源;
  3. Sinker:将格式化后的数据推送给下游 FC;

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

FC 架构

FC 和 DTS 的深度集成保证了 FC 可以接收 DTS 采集的数据库数据,并根据用户自定义代码实现数据加工和数据投递功能,具体如下:

  1. 请求路由:FC 网关将 DTS 发送的事件路由到 FC 后端;
  2. 调度处理:FC 调度层自动扩容计算节点运行用户代码,处理上游传递的 DTS 事件;
  3. 代码执行:用户的代码按预期运行,通常逻辑为加工处理 event 事件,并将处理后的结果以 SDK/API 等方式发送给外部服务;

构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践
从上图可以看到,您仅需关注数据加工和投递的业务逻辑,并通过简单代码片段完成实现,FC 后端会自动伸缩计算节点执行代码,您无需关注系统的基础设施建设、资源运维、伸缩、监控、报警等一系列繁琐工作,极大提升开发效率。同时 FC 作为 Serverless 应用,支持按量付费,避免长期预留机器资源带来的资源低效问题。

应用场景

OLTP 到 OLAP 的数据传输

什么是 OLTP 和 OLAP?

  • OLTP:指在线事务处理。通过以事务单位进行操作,并需要支持高并发写入和数据一致性。常见的服务如:关系型数据库( MySQL、PostgreSQL 等)、订单处理系统、客户关系管理系统等。
  • OLAP:指在线分析处理。通常用于从大量的数据中提取、聚合和分析信息,满足数据分析和决策支持。OLAP 系统通常以查询为基础,可以进行复杂的数据查询和分析操作。常见的服务如:AnalyticDB、ClickHouse、Power BI 等。

从上面描述看,OLTP 和 OLAP 是两种不同的数据处理服务,用于满足不同的业务需求。OLTP 系统适用于处理实时的交易和业务操作,而 OLAP 系统适用于从大量数据中进行分析和决策支持。在实际应用中,OLAP 的数据来源就是不同的 OLTP 数据库,所以 OLAP 本身不产生数据,通过 ETL 从 OLTP 抽取数据到 OLAP 数据库即数据仓库中做整合清洗达到可分析的数据标准。而 DTS + FC 恰好可以连接两类服务,打通数据通路。
构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

CDC 事件驱动模型

什么是事件和事件驱动?

  • 事件:在业务系统中,事件是指系统或业务中发生的重要、有意义的事情或状态变化。事件可以是内部触发的,也可以是外部输入的,通常与业务流程、数据更改、用户操作等相关。
  • 事件驱动:事件驱动架构是一种系统设计范式,其中事件是系统中的核心组成部分。在这种架构中,系统的各个组件通过订阅和响应事件来进行通信协作,实现松耦合、可扩展的系统架构。

CDC 因用于捕获数据库中的数据变化,常被当做事件驱动后续流程的执行,常见的场景如下:

  • 订阅和发布系统:CDC 可作为订阅和发布系统的一部分,将数据库中的数据变化作为事件发布给相关的订阅者。这可以用于实现发布-订阅模式的事件驱动系统架构。
  • 数据校验:CDC 可将数据库中变化的数据推送给 FC。做定制化数据校验,校验数据的合理合规,这在金融、财务订单等系统非常重要。
  • 数据审计:CDC 可将数据库中变化的数据推送给 FC,经由 FC 持久化至任意三方服务,用于数据审计和数据可追溯需求。
  • 变更通知:当特定关键数据变动后,以任意方式发送特定通知,如:邮箱、钉钉、短信、电话等。
    构建高效数据流转的 ETL 系统:数据库 + Serverless 函数计算的最佳实践

    总结&展望

    CDC 和 Serverless 函数计算的结合,可以实现实时的数据处理和响应,同时减少对基础设施的依赖和管理。在实际应用中,可将 CDC 作为事件驱动的数据源,将数据变化作为事件触发 Serverless 函数的执行。这样可以实现实时的数据处理和分发,同时利用 Serverless 函数计算的弹性扩展能力,根据实际负载动态分配计算资源。总而言之,DTS 和 Serverless 函数计算的集成为企业提供了更高效、灵活和可靠的数据处理解决方案。未来函数计算将探索更多的数据源(Oracle、PolarDB PostgreSQL、PolarDB MySQL 等),满足更多的业务需求。更多信息或需求请钉钉与我们联系,官方钉钉群号:11721331。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
4年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Vitess全局唯一ID生成的实现方案 | 京东云技术团队
为了标识一段数据,通常我们会为其指定一个唯一id,比如利用MySQL数据库中的自增主键。但是当数据量非常大时,仅靠数据库的自增主键是远远不够的,并且对于分布式数据库只依赖MySQL的自增id无法满足全局唯一的需求。因此,产生了多种解决方案,如UUID,Sn
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
算法灵珀客
算法灵珀客
Lv1
我还是很喜欢你,只是少了当初非在一起的理由。
文章
7
粉丝
0
获赞
0