vlambda博客
学习文章列表

传统行业Oracle转型MySQL数据库落地实践

传统行业Oracle转型MySQL数据库落地实践

一、背景

随着互联网+医疗健康平台不断深化以及业务量的快速增长,传统数据库架构迎来了巨大的挑战。但随着业务的不断发展,医疗健康数据对数据库产品的需求已经逐渐多样化:

  1. 业务支撑
    单库无法支撑业务规模的增长

  2. 敏捷开发
    伴随业务增长,开发版本迭代速度,产品研发面临挑战

  3. 运维能力
    传统的基础环境以及运维模式无法应对开发的敏捷迭代

  4. 降低风险
    打散数据、解耦各应用业务层依赖、降低整体集中式风险

  5. 控制成本
    通过下移核心业务至平台,使用更低廉和同质化的硬件基础设施

  6. 政治因素风险
    自主可控,解决对商业产品的依赖。比如2020年的芯片和HashiCorp事件

因此在这样的背景下,去“Oracle”被提上日程,开始数据库转型尝试并取得了不错的成果。

二、数据库转型方案

1、为什么首选MySQL数据库作为替换Oracle的数据库产品

DB-Egines发布的《2020年全球数据库大盘点》,MySQL、Oracle和SQL Server三大数据库产品遥遥领先。并且MySQL获得“年度数据库”称号。

  • 一方面MySQL提供了免费版

  • 另一方面Oracle收购Sun后,看到MySQL越来越规范,5.7号称性能是5.6的3倍,5.6号称是5.5的2倍。

MySQL作为当前最热门的开源数据库,阿里、百度、腾讯、字节跳动、快手等互联网公司广泛应用。基于对数据库安全可控的考虑,很多金融行业公司也正在进行较大规模的推广,用于替代传统数据库产品。

2、MySQL优势
  1. 稳定
    具有优秀的架构设计及相当丰富的周边产品,实现了企业级的高可用性和高扩展性,被大量的互联网公司广泛应用

  2. 开源
    基于GPL(GNU通用许可证)可以免费使用修改,易自主可控

  3. 免费
    无需购买Licence,有效降低企业运行成本

  4. 学习成本较低
    丰富的文档资料,较Oracle等易上手

  5. 生态成熟
    社区生态发展活跃,参与者众多,业界有较成熟的配套解决方案

医疗行业是追求稳定、安全,MySQL实际上在较多互联网公司有大量的实践经验,而且有较多的厂商作为贡献者参与到社区当中,整个社区是非常活跃的;MySQL的版本质量也是相对稳定的。其开源的特性是没有Licence,也相对自主可控。其相较于同为关系型数据库Oralce相对容易上手,并且业界也有很多的成熟配套方案。

基于以上情况,所以MySQL就成为我们的选则。

三、准备工作

1、MySQL对比Oracle有哪些语法、数据类型、对象类型兼容性问题

MySQL支持Oracle绝大部分的基本SQL语法及数据类型、对象类型。
部分不支持的如下:

  1. 数据类型方面,MySQL不支持序列、自定义类型、XML数据类型

  2. MySQL不支持对象包括物化视图、包管理及同义词

  3. 索引方面,MySQL不支持位图索引、位图连接索引、函数索引、在线重建索引

  4. 触发器方面,MySQL不支持DDL事件触发器、系统事件触发器、时间触发器

  5. 高级功能方面,MySQL不支持外部数据库链接、面向对象、闪回查询等

  6. 函数方面,MySQL不支持COSH(x)、CHR(n1)、LAG()、RANK()等函数

2、MySQL开发与运维体系
  1. 设计层面
    我们参考了阿里等公司的规约,建立了MySQL设计指引;加强元数据管理,提出元数据完备性、明确性、具象性和前瞻性的要求,建立应用的元数据标准,统一数据架构设计,设计表结构时均基于元数据进行设计,提升数据架构质量。

  2. 开发层面
    制定了开发规范和SQL调优指引,同时基于sonar开发了MySQL检查和审核工具,提前发现SQL不规范的写法,同时将sonarlint插件纳入开发人员必备插件,将规范融入开发过程中,提升开发人员的SQL编写能力。

  3. 测试层面
    通过压力测试,尽量减少性能瓶颈,提前发现SQL性能问题。

  4. 运维层面
    考虑自动化部署、监控告警、故障分析、自动巡检以及SRE平台,还有数据迁移、备份恢复、配置管理、版本升级等。

四、具体落地与实践

我们对于去Oracle的核心诉求是:在外部用户无感知的情况下,在线更换掉Oracle数据库。即给奔驰的火车换轮子。

对数据库进行了按业务域垂直拆分,拆分的主要目的是:

  1. 按照业务域垂直拆分数据库,实现数据库容量的水平扩展;

  2. 应用解耦、服务化,让应用访问数据库的调用更加清晰和规范;

  3. 严禁应用跨域访问数据库,严禁数据库之间产生数据交互,从业务角度呈现出一个更加完善的数据库架构。

对数据库按业务域垂直拆分,主要有四个关键阶段:

1、应用改造实现逻辑拆分
  1. 按表为粒度对大库的数据库对象进行梳理,把每张表归属于不同的应用域。

  2. 在应用层根据梳理的结果对操作表的代码进行改造,包括:

  • 拆分复杂的大查询

  • 拆分复杂的大事务

  • 操作表的代码全部封装在属主应用的代码中,非属主应用无法直接操作表,通过调用服务接口的方式实现非常规范的应用访问数据库的调用链

2、对应用改造的结果进行验证
  • 在同一个物理库使用逻辑schema的方式或不同的物理库对数据库对象的授权进行调整,验证应用改造符合预期。

3、数据库迁移和实时同步
  • 逻辑层拆分验证完成后,通过实时同步把待拆分的数据库对象实时同步到另外一个物理库。

4、物理拆分和切换流量,可以采用两种方式结合
  1. 通过应用双写,在应用层控制一致性,确保异构数据库都能运行正常,最后停掉迁移之前的Oracle数据库。

  2. 源端和目标端保持实时同步后,在某个时间点推送配置并切换流量。整个过程最好有一套完善的自动化运维确保各个细节工作的无缝落地。流量切换操作,必须确保可以随时前滚和回滚。

我们在整个医疗健康平台按照业务域拆分过程中,遇到比较大的难点是大事务拆分和多表关联复杂查询。这里不再详细展开。

在去Oracle数据库过程中,完成数据迁移的主要过程如下:

  1. 去Oracle数据库会解析业务表结构,并转化成MySQL表结构部署到MySQL上。如果Oracle有任何数据字典变更,都会对MySQL进行同步。

  2. 将Oracle的存量数据全部同步至MySQL,因为Oracle库还在对外提供服务,所以会记录同步开始时间点,发生过变更的Oracle数据。

  3. 在全量同步完成后,把同步期间发生过变更的数据进行增量追平。

  4. 增量追平后,比对Oracle和MySQL每一条记录和每一个字段的数据一致性。

  5. 逐步将Oracle上的流量降低并直到Oracle数据库下线。

五、目标/收益

在整个去Oracle数据库的过程中,我们基本做到了奔驰的火车换轮子。主要收益如下四点:

  1. 应用转型
    实施的医疗健康平台涉及很多核心业务,95%的应用已完成了MySQL数据库转型。

  2. 运行状况
    15台MySQL节点, 完成数据库集群等级应用占比高达95%。同时支持横向扩展,理论上通过扩展设备还可以无限地增加。

    通过MySQL支持的核心业务,峰值TPS可以达到9000+。经受住了全省「2020年人口统计10.07亿」几千万老百姓如同洪峰般 瞬间涌入进行新冠疫情登记和新冠核酸检测登记。看一组数据:较平时 平台的QPS翻了10倍、带宽翻了1倍等。

  3. 自主能力
    在自主能力方面,初步建立了企业级的基于MySQL的分布式解决的自主能力:首先是分布式框架+MySQL的应用级分布式解决方案,该方案承载了医疗健康平台应用。

  4. 成本
    在成本方面,由于无需购买Licence在支出成本上有非常大的降幅。

六、总结

在整个去Oracle实践过程中获得了许多经验,希望能对之后想要去Oracle的企业有所帮助。

  • 对于任何一家TOCTOB企业来说,去Oracle是个复杂的系统工程,涉及到开发、测试、架构和DBA等技术部门的协作。

  • 整个去Oracle改造过程需要在各个阶段都总结出一套完善的方法论,确保各个细节改造工作能稳妥落地。

  • 完善相关体系:规范设计、开发、测试和运维,实现管控的体系化和自动化,才能避免眼高手低,减少生产安全风险。

-EOF-