1. 分库分表的处理

大数据之路 读书笔记 Day5 数据同步遇到的问题与解决方案-LMLPHP

分库(Database Sharding)

分库是指将一个大数据库分割成多个小的数据库,每个小数据库运行在不同的服务器上。这样做的目的是为了分散读写操作的压力,提高并发处理能力和数据存储容量。分库策略可以基于用户ID、地理位置、业务类型等进行数据的划分。

分表(Table Partitioning)

分表是在单个数据库内部对表进行分割,将一张大表按照一定的规则拆分成多张小表,这些小表可以分布在同一个数据库的不同表空间,也可以分布在不同的数据库中。分表可以基于范围(如日期)、列表(如地区代码)、散列(如用户ID的哈希值)等方式进行。

分库分表的关键考虑点:

  • 数据一致性:确保跨库跨表的数据一致性,可能需要使用分布式事务或者最终一致性的策略。
  • 数据分布策略:选择合适的数据分布算法,保证数据的均匀分布,避免热点问题。
  • 查询路由:设计合理的路由机制,能够根据查询条件将请求路由到正确的数据库和表。
  • 系统复杂性:分库分表会增加系统的复杂度,需要额外的管理开销和维护成本。
  • 数据迁移:如果现有系统需要进行分库分表改造,涉及到大量的数据迁移工作。

大数据之路 读书笔记 Day5 数据同步遇到的问题与解决方案-LMLPHP

阿里巴巴的TDDL(Taobao Distributed Data Layer)是一个分布式数据库的访问引擎,通过建立中间状态的逻辑表来整合统一分库分表的访问(见图3.8)。TDDL是在持久层框架之下、JDBC驱动之上的中间件,它与JDBC规范保持一致,有效解决了分库分表的规则引擎问题,实现了SQL解析、规则计算、表名替换、选择执行单元并合并结果集的功能,同时解决了数据库表的读写分离、高性能主备切换的问题,实现了数据库配置信息的统一管理。

2. 高效同步和批量同步

高效同步

高效同步通常指的是在数据同步过程中,尽可能减少网络带宽使用、降低延迟和提高数据同步速度的技术。这可以通过以下几种方式实现:

  1. 增量同步:只同步自上次同步以来发生更改的数据,而不是整个数据集。这种方法减少了需要传输的数据量,提高了同步效率。

  2. 数据压缩:在数据传输前对其进行压缩,减少传输的数据体积,从而节省网络带宽。

  3. 并行传输:利用多线程或多进程技术,同时传输数据的不同部分,以充分利用网络带宽和计算资源。

  4. 智能缓存:使用缓存机制来存储已传输过的数据块,避免重复传输相同的数据。

  5. 断点续传:在数据传输中断后,可以从断点处继续传输,而不是从头开始,节省了重新传输的时间。

批量同步

批量同步则是指一次性传输大量数据的过程。这种同步方式适用于初始数据加载或定期的全量数据更新,尤其是在数据量非常大的情况下。批量同步的特点和优势包括:

  1. 全量更新:通常涉及整个数据集的传输,确保目标端的数据完全与源端一致。

  2. 计划执行:批量同步往往在低峰时段进行,以减少对生产环境的影响。

  3. 批量操作:一次处理大量数据,减少每单位数据的处理开销。

  4. 容错性:批量同步通常具有更好的错误恢复机制,确保即使在过程中遇到问题,也能完成数据的完整同步。

  5. 资源集中使用:在短时间内集中使用资源,以快速完成数据同步任务。

在实际应用中,高效同步和批量同步可能会结合使用,比如先进行一次全量的批量同步作为基线数据,然后通过高效的增量同步来维持实时的数据一致性。选择哪种方法取决于具体的应用场景、数据变化频率以及可用的网络和计算资源。

阿里巴巴的OneClick产品

阿里巴巴的OneClick产品主要是在其数据仓库和大数据处理框架中,用于简化数据同步和管理流程的一个关键组件。在阿里巴巴的大数据实践中,OneClick扮演着几个核心角色:

  1. 数据同步配置透明化
    OneClick通过自动化的方式处理不同数据源之间的同步配置,使得数据工程师和分析师能够轻松地设置数据同步任务,而无需深入了解底层技术细节。它通过库名和表名定位数据,自动获取元数据信息并生成相应的配置信息,从而简化了数据同步的初始化步骤。

  2. 一键化和批量化同步
    OneClick支持一键化的数据同步操作,即用户可以简单地点击一个按钮,就启动复杂的数据同步流程。此外,它也支持批量化同步,允许用户同时处理多个数据同步任务,这对于需要定期更新大量数据表的企业级应用来说是非常实用的功能。

  3. 增量同步与全量同步的整合
    在数据量不断增长的环境中,OneClick能够智能地判断何时进行增量同步(仅同步新变更的数据)和何时进行全量同步(同步整个数据集)。这种灵活性有助于优化资源使用,减少不必要的数据传输。
    大数据之路 读书笔记 Day5 数据同步遇到的问题与解决方案-LMLPHP
    淘宝交易订单表,每天新增、变更的增量数据多达几亿条,历史累计至今的全量数据则有几百亿条。面对如此庞大的数据量,如果每天从业务系统全量同步显然是不可能的。可行的方式是同步当天的增量数据,并与数据仓库中的前一天全量数据合并,获得截至当天的最新全量数据(见图3.9)。这就是增量同步与全量同步的整合。

  4. 元数据管理和数据治理
    OneClick利用元数据能力,帮助管理数据仓库的深度和厚度,确保数据的规范和统一。这包括数据源的识别、数据质量的监控以及数据血缘的追踪,对于构建和维护健康的数据生态至关重要。

  5. ETL(Extract, Transform, Load)流程的优化
    在数据仓库的构建中,OneClick充当了ETL流程的一部分,负责数据的抽取、转换和加载。它通过离线和实时方式采集来自不同渠道的数据,并确保数据的格式和质量符合企业数据仓库的要求。

  6. 数据仓库建模和管理体系
    结合行业经验与阿里巴巴自身的特点,OneClick支持基于维度建模理论的模型设计,确保数据仓库的结构清晰、一致且易于理解和使用。

通过OneClick,阿里巴巴不仅提高了内部数据处理的效率,也为其客户和合作伙伴提供了一个强大且易于使用的数据同步和管理解决方案,推动了整个组织的数据驱动决策和业务创新。

3. 数据漂移的处理

时间戳问题:在ODS层,由于业务系统的复杂性,同一笔业务可能涉及多个时间戳,如创建时间、修改时间、完成时间等。如果数据加载逻辑没有正确处理这些时间戳,可能会导致前一天或后一天的数据混入当前业务日期的数据中。比如,用户下单在1号11:59:59,但是由于延迟,记录在操作日志中的数据为12:00:01,这样第一天的数据就漂移到了第二天。

数据漂移的常见解决方案包括:

  • 增加冗余时间窗口:在数据加载时,可以增加前后的冗余时间窗口,比如加载今天的数据时,同时也加载昨天末尾和今天开始一段时间内的数据,以确保不会错过任何变更。

  • 精确的时间戳过滤:使用精确的时间戳字段过滤数据,确保只加载属于当前业务日期的数据。

数据漂移是数据工程和数据仓库管理中必须重视的问题,因为它直接影响到数据的质量和分析的准确性。在设计数据处理流程时,应充分考虑到数据漂移的可能性,并采取适当的预防和纠正措施。

实际案例

业务中常用的四个时间戳,为

  • modified_time,记录在数据库表中表示更新的时间
  • log_time,记录在数据库日志中表示更新的时间
  • proc_time,记录在数据库表中表示业务具体发生的时间
  • extract_time,标识数据记录被抽取到的时间

注:理论上,这四个时间戳应当保持一致,实际中extract_time常晚于前三个时间。

现在,在处理双11订单时发现,有一大批在11月11日23:59:59左右支付的订单漂移到了第二天,主要原因是用户下单支付后需要调用支付宝的接口而有所延迟,从而导致这些订单最后生成的时间跨天了,即modified_time和log_time晚于proc_time。

如果只有支付业务,那么我们直接以支付时间限制就可以获取正确数据,但是,订单包含多个业务过程,下单、支付、成功,每个业务都有自己的时间戳,并不只有支付业务数据会漂移。

如果直接多获取后一天的数据,然后限制一下时间,则可以读取到相关数据,比如限制到第二天12:15:00,但是,这个时候数据可能已经更新多次,即modified_time无法获取到当时最准确的数据。

因此,我们可以获取第二天15分钟数据后,限制多个业务(下单、支付、成功)的时间戳都为双11当天的,然后按modified_time做升序排列,获取数据首次变更的记录

此外,我们还可以根据log_time冗余当天最后15分和第二天凌晨前15分的数据,然后用modified_time过滤非当天数据,再按照log_time降序排序,取每个订单最后一次数据变更的记录。

最后,将两份数据根据订单做全外连接,将漂移数据补回到当天数据中。


点赞关注收藏,获取更多专业知识~

07-15 11:27