刘伟光
阿里巴巴集团副总裁
阿里云智能新金融&互联网事业部
总经理
导语
2021年9月,某超大型金融机构圆满实现后一个规模高达20TB+核心数据库的全面迁移改造工作,也为后续向云原生多活架构演进打下了坚实的基础。该核心系统数据库全量迁移项目的成功上线,树立了金融行业践行科技强国的标杆实践。将历时一年的迁移全过程完整步骤及技术攻略做提炼梳理,便完整沉淀成了独一无二的干货、本文的全部内容。“实践出真知”,阿里云走出了助力超大型金融机构国产数据库全面迁移坚实的一步,积累了弥足珍贵的经验。因此,本文不是对于数据库替换的分析和畅想,而是真正从实际面对实际的大规模复杂的核心应用系统的技术平台替换的技术指南,过程中存在各种“分析”文章中想不到的问题,尤其对于现有运行的环境的各种适配和兼容,对应用的友好性等,关于这些问题到底该如何解决,这篇文章均一一给出了详细解法。
前言
在国家层面提出加快建设科技强国,实现高水平科技自立自强的大背景之下,某超大型保险(集团)公司深入推进数字化转型,紧随先锋技术发展趋势,前瞻性布局启动IT架构分布式改造转型,并于21年9月圆满实现了后一个规模高达20TB+核心数据库的全面迁移改造工作,也为后续向云原生多活架构演进打下了坚实的基础。该数据库国产迁移项目成功上线,树立了金融行业践行科技强国的标杆实践,也是对国家科技自立自强战略以及国产技术的履责担当;更推动了整个国内数据库管理与应用体系科技生态建设和科技产业链的快速成熟。对于保险行业而言,短时业务并发压力虽没有互联网企业那么大,但是在业务复杂性和对数据库专有特性的依赖程度上,都要远大于互联网企业。保险业务的处理更为复杂,单一业务要多个系统完成,调用链比银行和互联网业务更长、更复杂,确保复杂集合大交易量的稳定是保险业务数据库国产的挑战。由于金融机构对业务连续性和数据准确性的严苛要求,在传统头部金融机构中始终没能有一家完成国产数据库全面迁移,直到这家保险公司成功实施,并取得了五个突破。
突破一、迁移时间短。从2020年9月到2021年9月,仅用时一年即完成迁移, 而传统金融机构还没有实现过如此大规模的核心系统全量迁移。
突破二、迁移规模破纪录。一年内完成了包括传统核心、互联网核心、个险销售、团险销售、经营管理、客服管理、大数据在内的近百个业务系统近在线Oracle数据库的全量搬迁工作,迁移数据规模超400TB、数据量超千亿,单库数据规模超20TB。
突破三、迁移全程同时保障了业务连续性和数据准确性。整个迁移过程无一例回切,上线后近一年来,系统稳定运行,并历经2021年完整周期的“业务大考”,经受住了开门红高峰TPS 5万+、QPS 21万+和包括精算在内的所有业务环节的严苛考验,完全满足生产需要,实现国产数据库从可用到好用的跨越。
突破四、迁移后实现技术自主创新。基于完全自研创新的国产数据库,迁移过程中版本升级持续发版共计50余次,长需求解决时间2个月(Pro*C+Tuxedo)。同时通过系统培训与交流实现累计超过500位员工的数据库专业考试认证,实现了数据库的全面自主掌控能力。
突破五、迁移后新一代技术成为关键生产力。迁移后,存储成本显著下降,性能也大幅度提升,数据库由主备模式发展为支持两地三中心多活部署,生产事件处理时长从小时级缩短到分钟级。
当我们回顾这一段历程,过程虽然艰辛,但积累了宝贵的大型金融机构国产数据库迁移实践经验。
国产金融级数据库迁移实践
1.1 前期准备工作
1.1.1 数据库选型数据库是企业IT基础设施中皇guan上的明珠,存储企业运行核心数据资产,向上支撑应用,向下屏蔽底层基础设施,在金融行业“稳定压倒一切”的大前提下,数据库的选型更为慎重,根据信通院《数据库发展研究报告(2021年)》 的描述,截止2021年6月底,国产关系型数据库厂商就高达81家,面对如此纷繁复杂的产品,如何选择合适的数据库是摆在该保险公司面前的首要问题。虽然数据库产品众多,经过审慎的评估后,终选择了OceanBase、PolarDB等三款产品作为先期试点验证,主要选型考量点如下:
是否能满足业务的平滑迁移和未来架构的演进。
是否具备分层解耦能力,重点解除数据库与底层硬件、操作系统、中间件之间的耦合。
是否有足够人才储备、资金投入,保证产品的长期演进和商业兜底。
是否有广泛的行业实践案例。
是否能做到完全自主研发。
是否能兼容原有开发运维体系,自有技术人员能否快速掌握。
1.1.2 基础设施准备
该保险公司核心业务系统原先共计使用超过60多台IBM和HP高端小型机,超过70多台高端存储,传统集中式架构耦合性强,难以实现规模和性能的线性扩展。本次国产数据库采用机架式服务器和本地存储全面替代进口小型机及传统SAN存储架构,以满足核心系统全量迁移的云原生分布式架构改造。同时为了避免基础设施变动过大导致业务系统不稳定,采用Intel+海光+鲲鹏服务器混合部署的架构。前期仍以Intel X86为主,逐步过度到海光、鲲鹏芯片国产服务器。实现在线调整不同型号机器,解除了基础设施供应依赖。2020年9月,正式启动国产数据库迁移项目之后,从硬件环境的型号选择,到选出目标系统,进行容量规划,不到两个月的时间,从开始完成国产数据库的硬件和操作系统适配、以及整个服务器集群的搭建。
1.1.3 迁移策略制定
该保险公司的业务经过多年的发展,业务范围覆盖,特色鲜明、种类繁多、关联关系错综繁杂,核心数据库迁移需要广泛调研和充分的科学论证——既要求数据库产品比照原有生产数据库的高性能和安全可靠,也需要快速实现多套系统的平滑迁移,同时解决资源弹性和数据库横向扩展的能力。因此,建立了数据库迁移实施的统一规范和标准,总体遵循评估-实现-控制-分析改进的科学方法论,开展有序迁移,并定下三大迁移策略:
先平迁再做业务和架构改造升级,避免多个变量同时发生,影响业务的连续性。原有数据模型不做改造,主体改造工作由新数据库来承担。
迁移批次以业务系统为粒度,从低负载到高负载,从外围到核心。
用1年时间完成所有业务系统的数据库全量迁移改造,所有系统数据库迁移动作时间窗口只给周六、周日凌晨0点到早上6点,周末小流量验证,周一重点保障,不影响正常业务开展。
1.2 互联网核心迁移
1.2.1 业务背景
该保险公司核心虽然涉及系统众多,但总结下来主要分为:互联网核心和传统核心,中间通过类似ESB的总线机制实现异步解耦。
核心系统分类
自2016年,这家保险公司的互联网核心和传统新核心应用开始从传统单体架构向分布式微服务架构改造。到2020年,互联网核心业务系统已经拆分成了40多个微服务模块并完成Mesh化接入,互联网核心特点是:
数据库系统已实现物理集中、逻辑集中,数据库对接的关联系统较多。
虽然做了微服务拆分,数据库仍有一定量的存储过程,另外触发器、自定义类型、函数、外键、分区表等功能均有使用。
因为业务特点,要服务好100多万代理人,对数据库资源弹性和性能要求更高。
因此互联网核心的数据库迁移面临的主要技术挑战是:
集中式部署下单点故障会影响到。
主数据系统作为核心业务链路中的整个保险开-户入口,内部对接43个关联系统,数据规模超20TB,大单表超50亿条数据,每天接口调用量超2000万次,是该公司单体数据库日均请求量大的系统,因为关联系统多,且处在业务链路的核心位置,因此对数据库SQL的效率要求非常高,迁移过程不能影响原有生产系统。
迁移到新的数据库平台要具备实时同步到Kafka的能力,并兼容原有格式,供下游大数据系统消费。
原有大数据消费链路
1.2.2 技术方案
-
整体选型
针对以上技术挑战,选择了和原有Oracle RAC架构更接近的PolarDB作为互联网核心数据库的替换,PolarDB作为新一代云原生数据库主要特点如下:
计算与存储分离,使用共享分布式存储,满足业务弹性扩展的需求。极大降低用户的存储成本。
读写分离,一写多读,PolarDB引擎采用多节点集群的架构,集群中有一个主节点(可读可写)和至少一个只读节点(大支持15个只读节点)。写操作发送到主节点,读操作均衡地分发到多个只读节点,实现自动的读写分离。
基于K8S形态部署,提供分钟级的配置升降级,秒级的故障恢复,全局数据一致性和完整的数据备份容灾服务。
集中式架构,不需要进行分布式架构相关考虑设计,和原有使用习惯保持一致,性能不低于原有Oracle数据库。
高度兼容Oracle,应用基本上不需要做SQL语法调整。
-
迁移方法
为了避免对原有生产业务造成影响且保证迁移数据的严格一致性,采用了DTS全量+增量的方式,对于数据规模超大的Oracle集群,如客户主数据系统,提前2周启动数据迁移链路,在全量数据迁移之前DTS会启动增量数据拉取模块,增量数据拉取模块会拉取源实例的增量更新数据,并解析、封装、存储在本地存储中。当全量数据迁移完成后,DTS会启动增量日志回放模块,增量日志回放模块会从增量日志读取模块中获取增量数据,经过反解析、过滤、封装后迁移到目标实例,通过目标端主键保证数据的性。应用切换成功后,从应用接口的响应速度上看,性能比Oracle提升约30%。到2020年底,双方携手完成了互联网核心所有模块的迁移,包括服务超百万代理人的出单系统APP,和注册用户超1亿的寿险APP、客户主数据等共计40多个业务系统。
互联网核心整体迁移技术方案
为了减少迁移过程中对下游大数据消费造成影响,到大数据的同步链路改造采用了2步走的策略。
大数据同步链路改造方案
-
主要挑战
迁移完成后,PolarDB作为互联网核心数据库,需要稳定支撑起2021年一季度业务冲刺。而前端的出单系统是整个性能压力的集中点,并且由于做了微服务化改造拆成了30多个模块,分散在了多个数据库中,任何一个数据库都可能存在被打爆的风险,在迁移到PolarDB之前是拆在多个Oracle RAC集群中,依靠内部开发的数据库监控完成多个Oracle集群的监控,迁到PolarDB之后整体架构将更适应业务弹性的挑战:
读写分离:通过智能代理服务实现自动的读写分离,实现分钟级扩容,故障场景下自动切换,应用不需要做任何调整。
PolarDB技术架构
业务冲刺当天经过了三个高峰时间点:12:00、17:00、21:00,每小时出单量和全天出单量进入了历史的前三位,高峰期出单笔数达到9000笔/s。
-
迁移历程
2020年9月,互联网核心首批应用模块迁移到PolarDB,整个适配过程不到一个月。此后,互联网核心各个模块就开始了大规模的迁移。2020年11月,PolarDB完成了大的单库客户主数据迁移。2021年1月底,PolarDB作为互联网核心出单系统的数据库,稳定支撑起该保险公司2021年一季度业务冲刺。
1.3 传统核心迁移
1.3.1 业务背景
该大型保险公司的传统核心系统历史悠久,既有1998年之前建成的,也有2004到2008年间建成的,时间跨度长,数据量异常庞大,单个数据库的数据规模甚至超过20TB。更具挑战的是,很多老核心按省市做了拆分,要分省市分别进行迁移,单一老核心系统需要迁移的数据库可能就要多达36个。传统核心总体来说可以分为三类系统:
类:2016、2017年基于Java技术栈开发的新核心系统,大概有13个。
第二类:分别在1998年之前,2004到2008年间建成的老核心系统,大概有6个。
第三类:一些可能要下线的,不在此次数据库迁移范围内的系统。
这些传统核心的数据库当时面临的主要技术挑战是:
系统关联关系庞杂,既有保单平台管理系统也有资金类系统,系统间关系难以梳理。
既有物理和逻辑集中的新核心,也有物理集中,逻辑分离的老核心,其中老核心分省部署,每个省都会有一套数据库,迁移工作量巨大。
对Oracle专有特性依赖较多,大量使用存储过程、触发器、自定义类型、函数、外键等。更为挑战的是老核心大量使用Pro*C(SQL嵌入式C程序)和Tuxedo(Oracle中间件做分布式事务处理)做保单过程处理,仅某年金系统涉及到的Pro*C程序就有1500多个,约140万行代码,业务短时间难以改造。
单库体量非常大,超过10TB的就有6个,大单库规模有超20TB,停机窗口短暂。
交易量大,每天数据库调用几十亿次,还有大量复杂集合类精算和结算类交易。
1.3.2 技术方案
-
选型方案
针对以上技术挑战,选择了分布式数据库OceanBase作为传统核心的替换,OceanBase数据库主要特点如下:
-
迁移方法
针对传统核心复杂的数据库情况进行全面验证,终形成了140页的迁移操作手册和详细的割接行事历,为后续系统的迁移和大面积推广积累了宝贵的经验,并形成了标准的迁移割接方案。整体迁移方法过程如下,从基础环境准备-迁移过程演练-正式割接-监控运维等四大环节进行逐项拆解,落实到人,到分。
数据库整体迁移割接流程
对于规模较大Oracle数据库的迁移,我们总结了如下四点帮助提升迁移效率:
Oracle数据表行 LOB 类型空间占用较大,每一批次的数据拉取大小会在原始行的基础上有显著增加。相比无LOB数据类型,对OMS端内存需求有数倍的需求,因此,优化的策略是单独对LOB类型的表建立新的链路,采用较小的并发,防范JVM OOM的风险,同时,为了提高整体迁移的速度,进行多链路并行迁移。
相对于LOB类型数据,无LOB数据类型的表的迁移,单位迁移批次的大小较小且稳定,内存需求可控,并发度可适度加大,提高迁移速度。所以,对该部分数据可使用较高的并发度单链路或多链路迁移。
单台OMS可以支持多个迁移任务,但是共享数据网络出口。鉴于大库数据的持续拉取,可以将大库的迁移分散至不同OMS节点,减少大数据网络流量的争用。
- 主要挑战
但难的是针对Pro*C的适配。Pro*C是Oracle提供的应用程序专用开发工具,应用C语言编写程序,在程序源代码中可以直接嵌入SQL语句,执行数据库操作。Pro*C既兼容了传统C语言的开发模式,又提供了强大的数据库操控能力,所以在保险行业和其他行业也有不小的用户基础。
而Tuxedo(Transactions for Unix, Extended for Distributed Operations)作为是早的分布式事务产品,是AT&T在20世纪80年代推出的。传统老核心业务中,大量使用Tuxedo调用相关的Pro*C程序来做保单业务流程处理来保证跨库事务的一致性。
为了根本上解决该问题,实现应用的平滑迁移,阿里成立项目攻坚团队,用1个月时间,从头开发Pro*C兼容预编译程序和运行时库,2020年国庆节前,预编译程序成功编译了某年金业务的全部1000多个Pro*C程序,并正确跑通了两个典型批处理作业,通过了该公司的验收,进展大大超出该公司预期,也因此在赛马中成功胜出赢得了该公司对OceanBase产品研发能力的信心。
短时间完成老核心的适配,得益于:
始终坚持自主研发,研发人员有的个人能力,清楚产品每一行代码的来龙去脉,能够快速和高质量地新增和修改代码,真正做到了自主研发。
全链路打通的研发模式,Pro*C只是外在交互模式,底层还要依赖数据库的内核能力,从SQL模式、优化器、服务端等做到了全链路打通,比如研发在批处理作业现场联调时发现SQL对to_date函数的'J'参数尚未支持时,快速反映给SQL模块,后端仅用一天完成了开发测试和发布。
敏捷开发模式,攻坚小组的研发和测试大家坐到一起,每日随着项目进展和变化快速确定和调整当日的目标。打破研发和测试边界,研发一边在开发,测试同学已经把单测和集成测试案例写好,开发侧有一点小的进展就立即验证测试,使得开发和测试能接近同步完成。
-
迁移历程
2020年10月,传统新核心理赔系统顺利上线。
2021年3月,完成传统老核心小省份的迁移上线。
2021年4月,完成13个传统新核心的迁移上线。
2021年8月,完成传统老核心后一个大省迁移上线。
2021年9月,完成传统老核心后一个单体库迁移上线。
1.4 全面体系化迁移
该保险公司核心迁移过程中遇到的另一个问题是如何体系化全面迁移,虽然在2021年3月完成小省份的迁移,但后面还有多个老核心分布在36个按省市独立部署的Oracle数据库中,每个省份又包括了20多个schema,如果按照老的迁移方式,每个省份都需要创建20多条迁移链路,对于资源和人力都是极大的消耗,短时间也难以完成。通过分析,工程化批量迁移大的问题是没有做到全流程自动化,手工操作的步骤还比较多,为了解决该问题,产研和现场交付同学做了三件事情:
OMS数据迁移工具在底层链路上从技术层面支持多schema合并操作,从而可以将同一个省份的二十多条链路合并到一条迁移链路中。
在产品层面将数据迁移工具的底层能力进行拆解,将原来无法自动化的步骤做了自动化,并通过API的方式暴露出来,使得前线交付同学可以根据用户的实际情况像搭积木一样进行组装使用。
交付同学基于暴露的API和140多页的迁移操作手册,用一个月时间开发出简化迁移链路配置的快捷迁移工具。
一键自动迁移过程图
在对快捷迁移工具迭代了四个版本后,投入使用。需要人工干预的工作量减少了80%。同时一起建立了数据库迁移实施的统一规范和标准,开展有序迁移。上线实施标准流程包括8大环节,98个步骤,5倍峰值压测,体系化迁移8大环节如下:
在线压测:迁移完成后,定期开展在线压测,基于实际生产场景进行业务全链路压力测试,持续保障应用容量和性能。
2021年5月,西部某省的迁移在2小时内顺利完成,验证了Oracle端多schema合并迁移这一重要技术难点,相比之前有数倍的提升,为剩余省份的并行迁移扫清了障碍,经过优化后:1、测试环境:自主进行数据迁移和压测回放,并通过SQL自动优化建议工具,大大提高了迁移验证效率,可以自助解决90%以上的问题。测试环境多次迁移演练步骤2、生产环境:将过程中需要人工检查费时、费力的步骤,做到了自动化。
正式迁移割接步骤
紧接着完成了东北三省+内蒙古总共四个省份的数据,过程中解决了Oracle源端出现不可见控制字符脏数据的问题,确保了数据准确无误。
2021年8月,历经前面11次的迁移后,终于完成了后一个、重要省份,也是数据规模大的的数据库迁移。
2021年9月,在解决了所有技术难题,完成了所有核心数据库的迁移,经历了开门红大促的考验后,要完成一个保险公司一个完整的业务周期,只剩下后一关,就是保险精算。
保险精算是保险公司业务经营的特色,指运用数学、统计学、金融学、保险学及人口学等学科的知识与原理,去解决商业保险与各种社会保障业务中需要计算的项目。一般会在季度末和年末进行,以衡量企业的经营状况,并制定更有市场竞争力的保险产品,是保险业务开展不可或缺的关键一环。
保险精算分析的特点在于数据量大,分析的模型复杂,过程中还有大量的数据写入,往往要持续一周甚至更长时间。并且要确保精算过程中,快照点的数据不能发生变化,基于传统IOE架构往往通过存储层的快照来实现。迁移到分布式数据库后,怎么保证在不停应用的情况下完成保险精算,是整个迁移过程的后一个障碍。经过反复评估,阿里云为此制定了佳方案,受益于OceanBase底层数据块的快速物理备份和表级的恢复能力。经过近1个月的压测验证,集群恢复速度达到800MB/S,完全满足精算的备份恢复的时间要求。终在2021年9月30日在规定的时间窗口完成了数据的备份并导入到了精算库,有效支撑了全面迁移后的保险精算业务,解决掉了后遗留的小尾巴。
保险精算数据准备过程
1.5 主要问题总结
当然迁移过程并不是完全一帆风顺,虽然未产生重大生产事故,但过程中也出了几次故障。而这些故障背后既反映了国产数据库在面对复杂场景上能力的提升,也反映了分布式架构带来的根本性变化。
1.5.1 数据库连接打满多次触发高可用切换 互联网核心迁移到PolarDB过程中遇到的大一次问题是在2021年1月,当天凌晨面向C端用户的两个重要系统完成数据迁移和应用的割接。伴随着日间业务流量逐渐增加,两系统因为大量的慢查询堆积较多应用连接,将数据库服务堵塞,全天多次触发PolarDB实例自动高可用切换,执行节点重建恢复流程。
以云原生容器形式部署的数据库服务节点,除了受本身数据库相关的内存参数限制外,还受cgroup指定的CPU和内存限制。当时连接池打满后,由于内存超出限制,引起实例的多次高可用切换重建。云原生数据库基于容器部署需要在稳定性和自保能力方面做诸多增强,为了解决相关问题,后续的版本中增加了global plan cache、resource manager、并行日志回放、global index等功能,数据库的内核参数也针对金融场景逐一做了定制化优化。
针对金融场景对稳定性要求极高的需求,通过本次互联网核心迁移也增加了诸多管控运维能力:
增加AWR功能,定期收集AWR报告对性能和可用性进行分析。
增加GAWR功能,对主机、Dockers、RW/RO进行全量数据采集。
新增online promote功能,优化在线切换,进一步缩短切换时间。
增加Idle状态Session超时自动断开连接功能,减少后台进程数,及时释放回收Idle Session的内存资源。
优化元信息缓存功能,Session级别元信息缓存优化为全局元信息缓存,降低后台进程的内存使用。增加内存总量资源管理控制,设置一定的阈值,到达阈值后开始Cancel Query、Kill Idle Session、Kill Active Session、拒绝新用户Session连接,增强数据库的自保能力。
2.5.2 SAN交换机故障导致数据库进入无主状态
由于原有Oracle数据库都是基于SAN存储部署,在2020年9月份启动数据库迁移工作之时,针对OceanBase部署建议的本地SSD盘硬件还没有采购到位。为了快速启动相关的迁移工作,开始OceanBase传统新核心集群还是部署在SAN存储上,这也为个生产问题埋下了隐患。
个传统新核心应用理赔上线后,系统运行比较平稳。意外出现在某天下午14点7分,系统同时收到了应用监和数据库监控的告警。监控显示,应用出现了90秒的阻塞迭停。然而,当双方团队还在排查问题时,数据库已经自动完成了恢复。
OceanBase QPS监控截图
问题现象时间轴分析
经过深入分析,发现是SAN存储交换机到核心交换机连接的一个端口出现了故障。虽然配置了多路径转发,但由于操作系统内核的超时时间OceanBase切主时间不匹配,触发了OceanBase的自动选主操作。而选主过程中,另外一台物理机也走的同样端口也出现了IO阻塞的问题,终导致OceanBase进入无主状态,当多路径软件成功切换后,OceanBase未经过任何干预就完成了自动恢复。本质上是因为软件超时参数与硬件超时参数不匹配所导致,也是软硬件系统磨合不够充分的表现,通过相关参数的调整能减少RTO的时间。
在此次故障之前,大家对OceanBase的了解都停留在PPT层面:RPO=0、RTO