[伍运珍 刘顺坤]
海量数据上传的技术研究与实现
[伍运珍 刘顺坤]
首先介绍海量数据上传的背景、上传的流程,然后比较不同的数据上传方式,主要包括Dblink方式和GoldenGate方式,最后阐述可以保证数据读写效率的关键技术,包括动态分区管理技术、并行度优化技术以及管道通信技术。
海量数据 创新应用 动态分区 并行度优化 管道通信
伍运珍
计算机工程师,硕士,现任职于中国电信股份有限公司广东研究院,长期从事电信IT支撑系统的设计与研发工作。
刘顺坤
资深软件工程师,本科,现任职于亚信科技(中国)有限公司,长期从事电信IT支撑系统的设计与研发工作。
移动互联网业务发展的趋势及特点要求提供更为及时、更为丰富的服务,只有服务能够得到快速响应,才有好的客户感知。当前,中国电信的数据分散在各省IT系统,要提供统一的对外服务,首先需要通过统一平台与各省的接口获取数据,然后才能对外提供服务。这样的方案流程长,时效性低,因此,将各省的海量数据集中存储到全国统一的数据平台,然后通过统一平台对外提供服务是高效、快捷的方式。
数据集中存储,需要各省将数据上传到统一平台,那么数据该如何上传?对于海量数据,上传的流程和方式的选择非常重要;数据上传后如何更快地删除旧数据、写入新数据?对于耗时的数据库操作,如何避免因超时被断开连接?本文针对海量数据的上传以及上传后的入库中遇到的各种问题进行了分析和研究。
分布在各省的数据上传到统一平台,但是各省的数据不一定与统一平台的主数据和元数据一致,而数据要可用,主数据必须一致,因此统一平台必须先定义好元数据和主数据,各省进行数据转换后再上传。各地数据在转换过程中,由于源数据本身有问题或者转换程序的不完备,会出现一些不符合要求的数据,不同省的数据,也可能存在着数据冲突,因此,统一数据平台的数据要真正可用,需要将数据进行清洗之后再进入统一平台的数据库。
基于上述考虑,海量数据的上传流程中应通过中间表来进行,各省数据在上传前,先转换到本地中间表,然后再从本地中间表上传到统一数据平台的中间表,最后,统一平台再进行数据入库。流程如图1。
图1 海量数据上传流程
(1)在各省数据库中,通过配置生成需增量上传的关键信息ID表(如客户ID、资产ID等),统一平台和各地约定每个批次数据提取间隔时间以及批次生成规则,如5分钟生成一个批次,各省根据关键信息ID表,采用程序(或存储过程)方式从各数据库表中获取相关信息,将本批次数据入增量上传信息中间表,在本批次各个对象都入到增量上传信息中间表后,在批次结束表中插入相应的批次信息以及本批次业务对象信息;
(2)各省根据数据入库先后顺序,将省增量上传信息中间表和批次结束表的内容复制到统一平台中间表中;
(3)统一平台从批次结束表获取已同步的批次号,然后根据批次对平台侧中间表数据进行校验并入库到统一库的数据表中,统一平台生成每个批次的校验应答数据,各省远程获取校验应答信息进行处理。
各省的中间表数据上传到统一平台的中间表,常规有3种方式:第一,程序接口的方式;第二,Dblink方式;第三,GoldenGate方式。对于海量数据,如果通过接口方式上传,接口压力会非常大,因此,一般采用Dblink方式以及GoldenGate方式。下面我们先介绍下这两种方式,然后再对这两种方式进行比较。
3.1 DBlink方式
DBlink 即DATABASE LINK,如果有两台不同的数据库服务器,需要从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这种情况就可以使用dblink。dblink和数据库中的view类似,建dblink的时候需要知道待读取数据库的ip地址,ssid以及数据库用户名和密码。
3.2 GoldenGate方式
GoldenGate软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,从而实现源数据库与目标数据库同步。
GoldenGate 可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒级的实时复制,适合在应急系统、在线报表、实时数据仓库供应、交易跟踪、数据同步、集中分发、容灾等多个场景下应用。同时,GoldenGate可以实现一对一、广播(一对多)、聚合(多对一)、双向、点对点、级联等多种灵活的拓扑结构。
GoldenGate的工作详细过程如下:
(1)捕获进程:GoldenGate利用捕捉进程(Capture Process)在源系统端读取Online Redo Log或Archive Log,然后进行解析,只提取其中数据的变化如增、删、改操作,并将相关信息转换为GoldenGate TDM自定义的中间格式存放在队列文件中。
(2)传送文件:利用传送进程将队列文件通过TCP/IP传送到目标系统。捕捉进程在每次读完log中的数据变化并在数据传送到目标系统后,会写检查点,记录当前完成捕捉的log位置,检查点的存在可以使捕捉进程在中止并恢复后可从检查点位置继续复制。目标系统接受数据变化并缓存到GoldenGate TDM队列当中,队列为一系列临时存储数据变化的文件,等待投递进程读取数据。
(3)投递数据:GoldenGate TDM投递进程从队列中读取数据变化并创建对应的SQL语句,通过数据库的本地接口执行,提交数据库成功后更新自己的检查点,记录已经完成复制的位置,数据的复制过程最终完成。
3.3 两种上传方式比较
表1 两种上传方式比较
从表1的比较可以看出:对于新增数据的导出,使用goldgate,需要的开发量(包括线程、时序的控制、数据转换)较小,流程相对简单,且及时性较强;对于存量数据的导出,goldengate方式耗时较少;对于海量数据的上传,goldengate的准确性较高;对原系统的影响、主数据的变更实现方式,两者基本一致;因此,在海量数据的上传中我们采用Goldengate方式。
使用Goldengate将海量数据从各省中间表上传到统一平台的中间表后,需要将中间表的数据入库到统一平台的数据库中,新数据的入库及旧数据的删除过程中,也应用了一些关键的技术。为了提高数据入库的效率,在实际的运营中,我们采用了3种技术:动态分区管理技术、并行度优化管理技术及运用管道通信技术。
4.1 动态分区管理技术
各省上传的数据是海量的,而存储空间却总是有限的,已上传并存入中间表的数据在写入统一平台的数据库后,仍会保留一段时间以便稽核,但到了一段时限,中间表中的这些数据保留的意义不大,需要清理这些数据来释放存储空间。清理过往的海量数据,如果采用常规的delete的方式,效率会非常低,所以为了保证数据清理的效率,数据入库和清理数据时,可以采用效率更高的动态分区的方式。
使用动态分区的方法如图2。
(1)利用分区模板指定HASH分区数及存储表空间。在制定分区数及存储表空间时,可参考过往的各省的数据量的大小及发展趋势。
图2 动态分区管理技术
(2)数据的上传会生成批次,当有新批次的数据入库时,首先根据分区模板,创建以批次号为分区ID的分区,将数据入库。
(3)如果是已有批次号的数据入库时,首先判断该批次对应的分区是否存在,若存在,则通过drop清空数据;创建新批次,进行数据入库。
(4)当需要删除数据的时候,用drop 分区的方式来替代常规的delete,可以快速地删除元数据和数据。
如A省每个月上传当月数据,根据该省的数据情况制定分区模板。1月,A省上传了全量数据到P201601分区中,2月,A省也上传了全量数据到P260102分区中,3月,存储空间不够,需要删除1月的数据,就可以直接drop分区ID为P201601的分区。drop分区的效率比delete的数据效率高百倍以上,同时避免delete操作产生高水位表,影响数据库性能。
4.2 并行度优化管理技术
在海量数据的上传和清理中,采用动态分区的方式来保证数据清理的效率。大数据量表均采用HASH分区,而在对分区内的数据进行操作时,可以通过在SQL语句中增加并行度参数((/*+append parallel(4)*/)),利用oracle并发处理机制,来提高数据入库和查询的性能。
方法如图3。
图3 并行度优化管理技术
在从分区表1中往分区表2插入数据时,可以增加并行度,在分区一进行查询时,也可以增加并行度。增加的并行度参数可以根据主机CPU的个数来进行配置。如以某省数据入库为例,数据库配置为16C配置,如果直接使用insert语句做插入操作,1 000万数据入库需花费120秒,如果增加并行度参数,参数为8个并行度处理入库,则入库时间可缩短为20秒。
另外,由于大数据的增加删除查询操作会产生大量的redo,REDO记录transaction logs,以恢复为目的(如机器停电,那么在重起之后需要online redo logs去恢复系统到失败点),但对一个运营非常稳定的系统,如海量数据的入库时,效率更加重要,可以减少redo以增加性能。这种情况下,在SQL语句中增加nologging,从而减少redo,加快数据入库的速度。
4.3 管道通信技术
批量数据入库时,采用工作流调度方式,包括校验、入库等环节。因为数据量巨大,校验和入库操作是耗时的操作。对于耗时的数据库操作,可能因超时被断开连接。
解决上述问题的方法是动态创建JOB进行耗时的校验和入库等操作,并通过oracle的管道获取JOB执行结果。
管道通信的具体使用方法如图4。
图4 管理通信技术
以A省数据入库为例,有数据100万条,后台程序需逐一进行校验和入库,这是一个相当耗时的操作,单个任务运行时,需要耗时3分钟,当有多个任务并行时,耗时可能超过10分钟,在这10分钟以内,数据的连接可能因为各种原因被自动断开了,但应用程序却无法判断是存储过程是否出现了异常,因此需要等待并要做大量的业务逻辑判断、监控和控制。
通过Oracle管道方式能很好地解决这个问题。首先将数据的校验和入库写成存储过程,使用JOB将这个存储过程作为任务提交到任务队列中,然后将任务放在管道里,Oracle管道会将任务处理结果放在管道中,一段时间后,程序再去获取管道的处理结果。这样程序不用跟踪任务进行的过程,只需定期去获取任务的结果。
随着大数据信息技术的不断发展,海量数据的汇聚及应用是一种发展趋势。本文提出了一种海量数据上传的解决方案,并对海量数据上传的方式选择、数据上传流程及海量数据的读写等过程给出了合理的技术建议。
1 明日科技.Oracle 从入门到精通.北京:清华大学出版社,2012:80
2 Ben Prusinski&Steve Phillips&Richard Chung.Expert Oracle GoldenGate.美国:Apress,2011:30
10.3969/j.issn.1006-6403.2016.11.014
(2016-11-02)