大数据迁移实践之路_高峰

随着业务的迅速发展,农业银行某系统承担的运行压力越来越大。现阶段,该系统每天的交易量在2300万笔以上,峰值达2950万笔。交易量的攀升导致了后台数据库数据量的激增,从而影响了联机程序响应时间,也增加了系统各类资源开销和后续数据分析的处理时间。为保障系统稳定运行,项目组从增加系统资源、优化资源配置、优化重点程序和升级系统数据库等多个维度对系统进行了综合优化。下面笔者从大表、热表的数据分析和优化角度,阐述对大数据量表进行的存储优化。

大数据迁移实践之路

中国农业银行股份有限公司软件开发中心 高峰 刘杰 闫友祥

一、大表数据分析

目前农业银行某系统工作流数据量最大且访问最频繁的两张核心表:

(1)流程实例表,用于存储系统发起的所有流程实例,包括基本流程、会签流程、补充资料流程和抄送流程;

(2)任务实例表,用于存储每个流程实例的流转记录。

截至2013年4月1日,工作流两张大表的数据量如表1所示。其中任务实例表为系统中数据量最大的一张表,达到了1.2亿。根据ProDBA 抓取的执行次数最多且执行时间最长的前30条SQL 信息中,显示流程实例表和任务实例表压力

表1 目前系统大表数据量

比较大。

大表中的数据按照结束时间和状态两个维度可以区分为三类:(1)正在运行的流程数据,即业务正在办理过程中,尚未结束;

(2)已结束流程一年内的数据,即业务总体流程已经结束,期限在一年内(包含一年);

(3)已经结束流程一年以上的数据,即业务总体流程已经结束,期限在一年以上(如表2所示)。

事实上,由于存在业务制度等方面的规定,已经结束一年以上的数据基本处于静态无变化的情况,不会发生修改、删除等数据操作,但是占据了一定的表空间,同时也影响了对其他运行中数据的访问效率。为降低大数据量对系统访问的影响,需制定迁移规则,进行数据拆分。

二、拆分规则

根据上述大数据表的数据分布特点,建立三套表结构:运行表、历史表和备份表。运行表仅存储正在运行的流程数据,流程结束后(正常完成或者终止)将基本流程以及其所属子流程相关的所有数据(流程实例、任务实例、流程变量、异常、分支等)实时迁移至历史表。如业务需要将已结束的流程恢复,系统支持流程从历史表实时迁回到运行表继续流转,整个过程对用户是完

全透明的。

由于已完成和终止一年以上的

流程,需恢复的业务需求很少(系

统上线以来未发生过类似业务),因

此由备份表存放第三类数据,形成

三级存储模式如图1所示。历史表

中的数据,每年执行一次批量拆分

操作,拆分至备份表。

为保障数据平稳的迁移,应采

取分布实施的策略。2012年12月8

日,流程结束数据实时迁移到历史

表功能先期投产,因此目前工作流

运行表中存放的数据包含三种情况:

正在运行的数据;2012年5月至

2012年12月结束的流程;2012年

5月前结束一年以上的流程(如图2

所示)。

按照数据三级存储规则,需要

对大数据表进行拆分、剥离及整合,

表2 数据分类

图1 数据三级存储模式

最终实现运行表只存储运行的数据,降低系统压力(如图3所示)。

三、问题分析及拆分策略

1.数据表重命名

数据迁移前需要对流程实例表和任务表进行BCP数据备份,以确保出现异常情况时,可及时恢复数据。任务实例表(1.2亿)和流程实例表(2千万),备份估计需要2~3个小时。数据迁移最终要达到运行

表中仅存放流程正在运行中的数据,

因此采取如下策略,节省BCP备份

时间。

首先,创建任务实例和流程实

例中间表,表结构和运行表保持完

全一致;其次,将运行表中正在运

行的数据迁移至中间表;再次,对

流程运行表和中间表重命名,实现

中间表转换为运行表,运行表转换

为备份表。

如出现数据迁移异常和验证不

通过等情况,由于备份表保存了迁

移当日的全量数据,因此,再次执

行数据表重命名即可解决问题,无

需再对两张大表进行BCP备份。数

据表重命名脚本执行时间,经测试

在1分钟内即可完成,大大减少迁

移时间。

2.数据完整性

一笔完整的流程,包含一条流

程实例和多条任务实例,任务实例

根据流程实例编号和状态等属性,

确定所属流程。迁移方法一:为保

障迁移数据完整,需要根据流程的

状态,查询流程和关联任务的记录,

一次性迁移两张表的记录,如迁移

失败同时回滚,因此,需要进行任

务实例表和流程实例表关联。考虑

到两张表的数据量,此方案将会导

致迁移效率很低。经测试,迁移5

万笔流程(5万条流程和36万条任

务记录)数据约7分钟,循环执行

迁移,迁移完全部流程数据需要约

42个小时。

为提高拆分效率,减少对投产

时间窗口的占用,对拆分方法进行

了优化。迁移方法二:首先,流程

实例表按照ID号升序排列,取前

50万条记录存放至临时表;其次,

将临时表(50万)和任务表(1.2亿)

进行关联,迁移流程所属的所有任

务;再次,再迁移50万条流程记

图 3大数据表拆分目标

2 数据分布

录;最后,删除临时表。循环执行操作,每次迁移,以前一次迁移的最大ID号为条件,再取50万条记录。此方法同样可以保障事务一致性,每次迁移两张表的数据,但是少了表关联的数据量。经测试,迁移50万笔流程(包括流程和任务记录)数据约8分钟,迁移正在运行的数据预计可在1个小时内完成。两种迁移方法对比示意如图4所示。

3.自增字段

任务实例表和流程实例表的主键ID,同为Identity型字段。数据迁移过程中,要保持ID号一致。首先,建表DBO用户和数据迁移操作用户需保持一致;其次,数据迁移脚本中,使用SET IDENTITY_ INSERT 表名 ON命令强制关闭对表的自增字段设置;再次,迁移

完成后,再使用SET IDENTITY_

INSERT 表名 OFF命令再打开自增

字段设置。

4.划分数据拆分批次

对拆分策略和脚本进行测试和

优化后,完成全部迁移仍然需5个

小时左右,因此考虑分批次执行。

在数据拆分规则中,数据被区分为

三类,根据此规则迁移分为两个批

次:一是执行迁移正在运行的数据;

二是执行迁移已经完成流程一年内

的数据。尽可能减小两批次执行的

时间间隔。第一批次执行完成后,

流程运行中的数据不受影响,一年

内已结束的流程如需恢复,将受到

影响。考虑到业务的实际办理情况,

流程结束后再次被恢复的情况很

少,因此分两个批次执行的影响面

积较小。

四、数据迁移方案实践

以迁移正在运行的数据为例,

阐述数据迁移过程。迁移流程结束

一年内的数据到历史表的操作过程

同此,不再赘述。

1.操作步骤

第一,执行脚本查询流程实例

表和任务实例表,获取数据以备验

证。同时查询最大流程和任务I D

号,以备在步骤六中设置自增起

始值。

第二,创建中间表,表结构和

运行表保持一致。

第三,迁移未完成流程数据,

每次迁移50万个流程,检查日志内

容,直到执行影响结果不足50万个,

证明数据迁移完成。

4 两种迁移方法对比示意

第四,执行数据验证脚本,比较此脚本的执行结果和步骤1中的执行结果是否一致。如不一致,后续步骤不再执行。

第五,执行脚本对流程运行表和中间表重命名,执行完成后验证表结构是否一致。

第六,根据步骤一的查询结果,设置运行表自增字段的起始值。

第七,开启工作流WAS,由开发人员进行验证。如验证通过,关闭工作流WAS;如验证不通过,执行应急方案。执行完成后再次进行验证。

第八,进行运行表的索引统计值更新(如图5所示)。

2.应急方案

(1)异常情况一:执行迁移脚本出现时间超长等异常情况,在计划时间窗口内不能正常执行完成。应急方案:迁移脚本未对运行表进行更新和删除等操作,数据未受影响,因此后续操作步骤不再执行,删除中间表即可。

(2)异常情况二:数据拆分完成,开启工作流WAS验证,开发人员验证不通过。应急方案:执行脚本将运行表更名为中间表,备份表更名为运行表,执行完成后,再次由开发人员进行验证,验证通过删除中间表。

3.数据量比较

经过两轮迁移,数据量对比如

表3所示,从中可以看出访问最频

繁的运行表数据量减少95%。

4.结论

数据经过拆分、剥离及整合后

图 5 数据迁移操作步骤

形成了三级存储模式。流程结束后

数据实时转移到历史表,而运行表

数据增量变化不大,因此有效解决

了由于数据量巨大带来的数据访

问响应时间长等问题,提升了系统

性能。

则根据索引定位流程数据,缩小数据查询范围,最终降低系统响应时间。备份表中数据也可转移至其他存储设备进行保存。对备份表中数据查询需求,提供单独的查询、统计及分析服务。FCC

五、未来规划

数据迁移完成后,根据数据增长特点,每年对历史表数据进行一次批量迁移,迁移至备份表存储,而运行表数据不受影响,即消除

表 3迁移前后数据量对比

了对运行中流程的影响。由此带来备份表数据也将不断增大。备份表的存储采用索引存储方式,增加备份数据索引表(如图6所示)。为做到对业务操作的完全透明,如需对备份表的数据恢复,

图 6 三级数据存储结构未来规划

相关文档
最新文档