深入理解数仓开发(二)数据技术篇之数据同步

本文涉及的产品
云原生数据仓库AnalyticDB MySQL版,基础版 8ACU 100GB 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 深入理解数仓开发(二)数据技术篇之数据同步

1、数据同步

       数据同步我们之前在数仓当中使用了多种工具,比如使用 Flume 将日志文件从服务器采集到 Kafka,再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志,并将采集到的变更日志(json 格式)保存到 Kafka,同样再由一个 Flume 同步到 HDFS。使用 DataX 每天 0 点将需要全量同步的数据全量采集到 HDFS。

       数据同步主要的作用就是实现不同数据源的数据流转,对于大数据系统来说,包含把数据从业务系统同步进入数据仓库和把数据从数据仓库当中同步进入数据服务和数据应用两个方面。

1.1、三种同步方式

1.1.1、直连同步

       直连同步是指通过定义好的规范接口 API 和基于动态链接库的方式直接连接业务数据库,比如 ODBC/JDBC 等规定了统一规范的标准接口,不同数据库厂商基于这套接口实现了自己的驱动,支持完全相同的函数调用和 SQL 实现。

       直连同步就是通过 JDBC/ODBC 连接数据库来往数仓进行写入,但是这种方式对数据库系统的性能影响比较大,尤其是执行大批量的数据同步可能会严重拖垮业务系统的性能。如果业务系统采用主备策略,则可以从备库抽取数据,避免对业务系统产生性能影响。但是终究这不是一种好办法。

1.1.2、数据文件同步

       通过约定好的文件编码、大小、格式等,直接从源系统生成数据的文本文件(比如把数据库的二进制文件转为文本文件),由专门的文件服务器传输到目标系统,对于常见的关系型数据库,这种方式比较简单实用。

       另外,对于互联网日志数据,通常是以文本文件形式保存的,所以也适合这种方式。

1.1.3、数据库日志解析同步

       现在大多数主流的数据库都已经实现了使用日志文件进行系统恢复,比如 MySQL 的 binlog,通过数据库日志可以实现增量同步的需求,不仅延迟可以控制在毫秒级别,而且对数据库性能影响也比较小,目前这种方式也是广泛应用于从业务系统到数仓的增量同步应用中的。

       通过数据库日志解析同步的效率虽然高,但是依然存在一些问题:

  • 数据延迟。当业务系统做批量补录时可能会使数据更新量超出系统处理的峰值,导致数据延迟。
  • 投入较大。需要在业务数据库和数仓之间部署一个专门用来实时同步的系统(比如 MaxWell,Cannal,这倒是也不算太大问题)。
  • 数据漂移和遗漏。数据漂移一般是对于增量表而言的。具体解决方案下面会专门介绍。

1.2、阿里数据仓库的同步方式

        关于阿里云数据仓库的同步方式这里简单介绍,对于批量数据同步,阿里云使用的就是人家自研的 DataX;而关于实时数据同步,我们之前使用的是 MaxWell,而阿里云使用的是自家的 TT(TimeTunnel),具有高性能、实时性、高可用、可扩展等特点,被阿里巴巴广泛应用于日志收集、数据监控、广告反馈、量子统计、数据库同步等领域。TT 是一种基于生产者、消费者和 Topic 的消息中间件(基于 HBase),不管是日志服务器中的日志还是业务系统中的数据都可以通过 TT 来进行同步到 MaxCompute。

1.3、数据同步中的问题与决绝方案

这里主要介绍数据漂移

1.3.1、数据漂移问题

       数据漂移一般是对增量表而言的,它指的是数据在同步到数仓(ODS 层)过程中,由于网络延迟或者系统压力的原因,导致上一个分区的数据进入了下一个分区(今天的数据到了明天)。

       由于 ODS 层有着面向历史的细节数据查询需求,这就要求数据采集到 ODS 层后必须按照时间进行分区存储(离线数仓基本都是按天进行分区)

说明

       尽管离线数仓一般是以天为单位来进行数据分析,但并不是说我们就等到每天 0 点才开始同步前一整天的数据。

       事实上,数据同步策略分为全量/增量同步,对于订单表这种本身就非常大,而且变化也特别大的表一般都是采用实时同步策略(增量)。阿里巴巴采用 TT(TimeTunnel)来实现对业务数据库的实时数据同步(原理就是监听 binlog),但是一般并不是一条数据同步一次,而是累积一定时间间隔进行同步(比如每 15 分钟)

   这里使用订单表来说明数据漂移是怎么发生的,对于我们的业务数据表,它并不会像我们在数仓建表那样为每个业务过程建立一张表,而是通过 update 操作来实现业务过程的变化,比如当 order_status 为已下单时,proc_time 就代表下单时间;当 order_status 为待支付时,modified_time 就代表状态变化为待支付的时间。

id order_id proc_time order_status modified_time
1 1001 下单时间 已下单/支付中/支付成功 状态修改时间

通常,用于分区的时间戳字段分为四种:

  • 业务表中用于标识数据记录更新的时间戳字段(modified_time,比如订单表中当订单状态变化为待支付、支付成功的识货,modified_time 就会发生变化)
  • 数据库日志(binlog)当中用于标识数据记录更新的时间戳字段(log_time)
  • 业务表中用于记录业务过程发生时间的时间戳字段(proc_time,比如下单时间、支付时间)
  • 数据被抽取到的时间戳字段(extract_time, Flume 中的数据在写入到 Kafka 之后,如果没有 Event Header ,那么数据的时间默认就是写入到 Kafka 的时间)

理论上,这几个时间应该是一致的,但是在现实中,四个时间戳的大小关系为:proc_time<log_time<modified_time<extract_time,造成这些差异的原因有:

  • 数据抽取是需要时间的而且得在数据产生之后,所以 extract_time 往往比另外三个时间都晚。
  • 关系型数据库采用预写日志方式来更新数据,所以更新时间modified_time会晚于log_time
  • 业务不能保证 modified_time 一定被更新。
  • 由于网络或系统压力问题,会导致数据延迟写入/数据延迟更新。log_time或者modified_time会晚于proc_time

       通常的做法是选择其中一个字段来进行分区,这就导致了数据漂移。下面是数据漂移常见的几种场景:

  • 根据 extract_time 进行分区。这种情况下最容易出现数据漂移。(比如 Flume 经过一定延迟把数据写入到 Kafka 之后,如果没有 Event Header,那么当 Kafka 的数据被转为 Flume 格式时,Header 中默认的 timestamp 就是写入到 Kafka 的时间 )
  • 根据 modified_time 进行分区。但是业务不能保证 modified_time 一定被更新。
  • 根据 log_time 进行分区。由于网络或者系统压力,可能会出现延迟。
  • 根据 proc_time 进行分区。如果根据 proc_time 进行分区,我们得到的数据就遗漏了业务过程的变化(比如对于待支付、支付成功这些业务过程都是需要通过 modified_time 和 order_status 来确定的)。

数据漂移问题的解决方案(面试题)

1、多获取后一天的数据

       在每个 ODS 表时间分区中多冗余一部分数据,保证数据只多不少,毕竟即使网络延迟再高,很小概率会超过 15 分钟,所以我们可以向后冗余 15 分钟的数据。但是这种方式会有一些误差,比如我 1 号 0 点之前下单,2 号 1 点取消订单,那么对于 1 号,我的数据状态应该是已下单状态,但是由于我把 2 号的部分数据页拉到我的分区了,所以就可能导致记录的状态为订单已关闭。所以对于记录状态更新频繁的场景,我们可以创建拉链表,用时间(起始时间和结束时间)来约束获取记录的状态。

2、多个时间戳字段限制

① 根据 modified_time 获取后一天 15 分钟的数据,并限制多个和业务过程的时间戳(下单、支付、成功)都是当天,然后根据这些数据按照 modified_time 升序排序,获取每个数据(每个订单,可以用 order_id 唯一区分)首次数据变更的那条记录

② 根据 log_time 分别冗余前一天最后15分钟的数据和后一天凌晨开始15分钟的数据,并用 modified_time 过滤非当天数据,并针对每个订单按照 log_time 进行降序排序,取每个订单当天最后一次数据变更的那条记录

③ 将两部分数据根据 order_id 做full join 全外连接,将漂移数据回补到当天数据中。

       总之,数据漂移是不可能杜绝的,毕竟大数据场景下网络延迟和系统压力不可避免,所以只能通过一些规则限制获得相对准确的数据。

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
相关文章
|
4月前
|
关系型数据库 OLAP 分布式数据库
揭秘Polardb与OceanBase:从OLTP到OLAP,你的业务选对数据库了吗?热点技术对比,激发你的选择好奇心!
【8月更文挑战第22天】在数据库领域,阿里巴巴的Polardb与OceanBase各具特色。Polardb采用共享存储架构,分离计算与存储,适配高并发OLTP场景,如电商交易;OceanBase利用灵活的分布式架构,优化数据分布与处理,擅长OLAP分析及大规模数据管理。选择时需考量业务特性——Polardb适合事务密集型应用,而OceanBase则为数据分析提供强大支持。
1099 2
|
4月前
|
SQL DataWorks 数据库连接
实时数仓 Hologres操作报错合集之如何将物理表数据写入临时表
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
4月前
|
DataWorks 负载均衡 Serverless
实时数仓 Hologres产品使用合集之如何导入大量数据
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
4月前
|
SQL 消息中间件 OLAP
OneSQL OLAP实践问题之实时数仓中数据的分层如何解决
OneSQL OLAP实践问题之实时数仓中数据的分层如何解决
60 1
|
4月前
|
SQL 分布式计算 关系型数据库
实时数仓 Hologres操作报错合集之指定主键更新模式报错主键数据重复,该如何处理
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
|
4月前
|
SQL 分布式计算 MaxCompute
实时数仓 Hologres产品使用合集之如何在插入数据后获取自增的id值
实时数仓Hologres是阿里云推出的一款高性能、实时分析的数据库服务,专为大数据分析和复杂查询场景设计。使用Hologres,企业能够打破传统数据仓库的延迟瓶颈,实现数据到决策的无缝衔接,加速业务创新和响应速度。以下是Hologres产品的一些典型使用场景合集。
实时数仓 Hologres产品使用合集之如何在插入数据后获取自增的id值
|
4月前
|
前端开发 UED 开发者
无障碍设计的魔法:JSF让每个用户都能畅游数字世界!
【8月更文挑战第31天】本文介绍如何使用JavaServer Faces (JSF)构建无障碍Web应用,确保所有用户都能访问和使用。文章通过实际代码示例展示了如何利用ARIA属性增强组件、实现键盘导航、提供文本替代以及使用语义化标签等技术。无障碍设计不仅是道德责任,也是提升用户体验的关键。通过这些方法,JSF可以帮助开发者创建更加公平和包容的应用。
36 0
|
4月前
|
前端开发 数据处理 数据库
Angular与Firebase的完美联合:掌握实时数据同步技术——从环境配置到数据服务的详细实现指南
【8月更文挑战第31天】在现代Web应用中,实时数据同步对于提升用户体验至关重要。本文档详细介绍如何在Angular应用中集成Firebase实时数据库,包括准备工作、配置环境、实现实时数据同步及在组件中使用数据服务等步骤。通过本教程,开发者将掌握利用Angular与Firebase高效实现数据同步的方法,增强应用的实时互动性。
44 0
|
4月前
|
监控 安全 数据中心
实时数仓Hologres容器技术问题之应用底层技术如何解决
容器技术如Docker基于Linux的namespace与cgroup技术,提供进程隔离与资源限制。这些技术早已有之,但未广泛普及。Docker创新性地提供了可分发的容器镜像格式,简化部署流程,从而促进了容器技术的大规模采用。
51 0
|
4月前
|
canal 关系型数据库 MySQL
"揭秘阿里数据同步黑科技Canal:从原理到实战,手把手教你玩转MySQL数据秒级同步,让你的数据处理能力瞬间飙升,成为技术界的新晋网红!"
【8月更文挑战第18天】Canal是一款由阿里巴巴开源的高性能数据同步系统,它通过解析MySQL的增量日志(Binlog),提供低延迟、可靠的数据订阅和消费功能。Canal模拟MySQL Slave与Master间的交互协议来接收并解析Binary Log,支持数据的增量同步。配置简单直观,包括Server和Instance两层配置。在实战中,Canal可用于数据库镜像、实时备份等多种场景,通过集成Canal Client可实现数据的消费和处理,如更新缓存或写入消息队列。
813 0

热门文章

最新文章