数据同步技术含义:不同系统间的数据流转,有多种不同的应用场景。
应用场景:
大数据系统中的数据同步
源业务系统的数据类型:
数据同步需要针对不同的数据类型及业务场景选择不同的同步方式。
同步方式可以分为三种:
通过定义好的规范接口API直连业务数据库,如JDBC规定了统一规范的标准接口。适合操作型业务系统的数据同步。
直连同步优缺点:
通过约定好的文件编码、大小、格式等,直接将源系统的生成数据的文本文件通过专门的文件服务器(如FTP服务器)传输到目标系统,然后加载到目标数据库系统中。
优点:当数据源包含多个异构的数据库系统时,用这种方式比较简单、实用。另外,日志类数据通常是以文本文件形式存在的,也适合使用数据文件同步方式。
注意:
大多数主流数据库都已经实现了使用日志文件进行系统恢复,因为日志文件信息足够丰富,而且数据格式也很稳定,完全可以通过解析日志文件获取发生变更的数据,从而满足增量数据同步的需求。
数据库中日志文件信息丰富、数据格式稳定,保存了数据记录的变更(增、删、改),当出现故障时,可以通过日志文件进行系统恢复。所以可以通过读取数据库的日志文件,收集变化的数据信息,并判断日志中的变更是否属于被收集的对象,将其解析到目标数据文件中。
优点:数据库日志读取操作是在操作系统层面完成,不需要通过数据库,因此不会给源系统带来性能影响。
缺点:
数据仓库的特性之一是集成,将不同的数据来源、不同形式的数据整合在一起。
阿里数仓数据同步特点:
对于离线类型的数据仓库应用,需要将不同的数据源批量同步到数据仓库,以及将经过数据仓库处理的结果数据定时同步到业务系统。
市场上数据库种类繁多,不同数据库的数据类型都略有不同,而数据仓库是集成各类数据源的地方,所以数据类型必须是统一的。
阿里通过DataX将各类源数据库系统的数据类型统一转换为字符串类型的方式,实现数据格式的统一。
对于不同的数据源,DataX通过插件的形式提供支持,开发者可以在极短的时间内开发一个插件以快速支持新的数据库或文件系统,将数据从数据源读出并转换为中间状态,同时维护好数据的传输、缓存等工作。
日志类数据都是实时产生的,所以需要尽快将日志以数据流的方式不间断地同步到数据仓库。或者对业务系统产生的数据进行实时处理,比如天猫“双11”的数据大屏,对所产生的交易数据需要实时汇总,实现秒级的数据刷新。
这类数据是通过解析MySQL的binlog日志来实时获得增量的数据更新,并通过消息订阅模式来实现数据的实时同步。具体来说,就是建立一个体制数据交换中心,通过专门的模块从每台服务器源源不断地读取日志数据,或者解析业务数据库系统的binlog或归档日志,将增量数据以数据流的方式不断同步到日志交换中心,然后通知所有订阅了这些数据的数据仓库系统来获取。
阿里是通过TimeTunnel(TT)消息中间件(具有高性能、实时性、顺序性、高可靠性、高可用性、可扩展性等特点)来实现实时数据同步的。TT是一种基于生产者、消费者和Topic消息标识的消息中间件,将消息数据持久化到 HBase 的高可用、分布式数据交互系统。
问题:业务系统需处理的数据量飞速增长,为了让系统具备灵活的扩展能力和高并发大数据量的处理能力,一些主流数据库采用了分布式分库分表方案来解决,但是这种设计也加大了同步处理的复杂度。
解决方案:通过建立中间状态的逻辑表来整合统一分库分表的访问。
阿里的TTDL(Taobao Distributed Data ayer)就是这样一个分布式数据库的访问引擎。
TDDL是在持久层框架之下、JDBC驱动之上的中间件,它与JDBC规范保持一致,有效解决了分库分表的规则引擎问题,实现了SQL析、规则计算、表名替换、选择执行单元并合并结果集的功能,同时解决了数据库表的读写分离、高性能主备切换的问题,实现了数据库配置信息的统一管理。
问题:
解决方案:
阿里通过OneClick实现数据的一键化和批量化同步。一键完成DDL和DML生成、数据的冒烟测试以及在生产环境中测试等,大大降低了数据同步成本。
问题:表的业务数据库越来越大,按周期全量同步的方式会影响处理效率,甚至不可能做到。
解决方案:每次只同步新变更的增量数据,然后与上一个同步周期获得的全量数据进行合并,从而获得最新版本的全量数据。简而言之,就是增量同步,然后与原数据合并。
当前流行的大数据平台基本都不支持 update 操作 ,现在比较推荐的方式是全外连接( full outer join) +数据全量覆盖重新加载( insert overwrite ),例如日调度,则将当天的增量数据和前一天的全量数据做全外连接,重新加载最新的全量数据。
问题:
上述问题总结下来,就是数据同步任务运行不稳定。
解决方案:
基于负载均衡思想的数据同步方案。通过目标数据库的元数据估算同步任务的总线程数,以及通过系统预先定义的期望同步速度估算首轮同步的线程数,同时通过数据同步任务的业务优先级决定同步线程的优先级,最终提升同步任务的执行效率和稳定性。
问题:ODS层表的同一个业务日期数据中包含前一天或后一天凌晨附近的数据,或者丢失当天的变更数据。
ODS表按时间段来切分进行分区存储,通常的做法是按某些时间戳字段来切分,而实际上往往由于时间戳字段的准确性问题导致发生数据漂移。
通常,时间戳字段分为四类:
理论上,上述几个时间应该是一致的,但实际生产中,会出现差异,可能的原因如下:
下列的一些做法,可能会导致数据漂移:
根据extract_time来获取数据,数据漂移问题最明显
根据modified_time限制,不更新modified_time导致数据一楼,或者凌晨时间产生的数据记录漂移到后一天
根据log_time限制,由于网络或者系统压力问题,会晚于proc_time,导致凌晨时间产生的数据记录漂移到后一天。
解决方案: