一次线上生产库的全流程切换完整方案

一、现状梳理

本篇介绍了一次数据库迁移的完整方案。 本次需要改造的系统为一个较为陈旧的技术栈系统,其中MongoDB作为核心数据存储中间件,承担着存储全部核心数据的重要任务。该系统目前的配置为1主1副本模式,涉及1个数据库和2张表,服务于7个不同的应用。尽管系统架构相对简单,但其在日常运营中发挥着不可或缺的作用。目前需要将MongoDB存储在其它介质中,如何能够保障在不影响线上使用的情况下,平滑切流到新库,是本文主要探讨的问题。

二、迁移方案

2.1 迁移节奏

整体节奏分为

1.梳理范围,因为系统内不仅有mongo还同时有mysql数据源,需要梳理出使用mongo的所有业务范围

2.确定好原有的数据,应该存储在哪个介质中,确定好存储标准,需要能够cover住原有的所有业务,包括读写性能

3.对原有数据结构的DAO层进行改造

4.需要对数据进行双写并进行数据迁移

5.R2流量验证/测试回归/数据比对 进行验证

6.切量:放量节奏

2.2 代码改造/数据异构

采用装饰器模式,统一控制双写逻辑(主写,辅写),统一控制切量逻辑,下线逻辑, 抽取代码中原有的直接调用底层mongodb API的代码,将其不改业务逻辑的情况下迁移到Dao层。这样做的目的是为了后续做切流适配逻辑。不改逻辑及出入参的目的是为了避免对当前业务造成影响。

选用数据源的依据为

特性 JimKV HBase
优势 - 支持多存储引擎(SSD、AEP)- 基于 Raft 协议的强一致性和多机房容灾 - 完善的运维监控和弹性伸缩能力 - 支持PB级别的存储容量- 云原生架构,支持单集群和主备集群 - 高吞吐性能,适合写密集型应用
劣势 - 由于Raft协议,写性能低于JimDB - 故障恢复时间较长,约1---2分钟
适用场景 - 数据一致性和可靠性要求高- 数据存储量大- 读流量大于写流量 - 存储量非常大(PB级别)- 写密集且性能要求高的场景
技术选型推荐理由 - JimKV满足存储量和吞吐量要求- 数据一致性和可靠性优于HBase - 适合读流量大于写流量的应用场景 - 适用于存储量极大的场景,但对一致性要求较高的场景不如JimKV适合

基于以上原则,我们选用JImKV(京东自研中间件),Mysql和ES作为MongoDB的替换的数据源,数据源切换Dao层的改造方式如下:

2.3 存量数据迁移

方案 是否可实现 难度
使用大数据抽数任务
使用代码异步任务的方式
DRC同步 从mongo到数据库不支持

考虑整体的数据量并不大单表300w,通过大数据离线表的方式效率并不高,通过代码更加的灵活,可以随时调整速度和范围存量数据分了两部分1、已经审核通过,申请单不会在有任何变更,可以随时迁移,比对2、申请单处于过程中的数据,数据随时会变更。凌晨迁移,打开双写

2.4 增量数据同步

创建申请单和更新不包含状态字段时的操作

先写mongo再写mysql,以mongo写入成功为准,写mysql失败,mq异步补偿

三、上线三板斧(灰度/监控/回滚)

本章节主要探讨在进行数据迁移和代码改造这些基础工作完成之后,如何保障上线没有线上问题,如何保障平滑切流和听写,工作主要聚焦于上线三板斧,可灰度,可回滚,可监控等方面,具体工作如下:

3.1 可监控(数据对比读逻辑)

增量数据比对

双写数据完成后发送MQ,消息里面查询新库,老库的数据进行实时比对,不一致数据记录不一致字段,关键字业务报警,写入日志文件,导出分析

存量数据比对

遍历全量老库数据,与新库查出数据,转换成相同对象对比数据一致性,异常数据写入日志文件分析

3.2 可监控(对比读逻辑)

对比逻辑,引入R2流量回放对比,提高对比速度,

3.3 可灰度(灰度切量读)

读切流,按照供应商和采销白名单+百分比来切流

切流时,由于需要根据pin对流量分散,但是不在同一线程内,使用threadlocal对商户信息进行设置和读取

3.4 可回滚(灰度切量写)

写切流 分为四步

1.首先验证 写新库没问题 相当于对新加代码进行灰度 如果有问题 进行回切

2.当验证写新库没问题,需要补齐数据库数据

3.当数据补齐后 转换为主写新库

4.后续如果读写新库都没问题 可以彻底下线旧库存

四、总结

本文详细梳理了线上生产环境的全流程,包括迁移和切换的灰度方案对比。在数据源选型方面,根据实际业务需求选择合适的中间件是整个工作的基石。在代码改造和数据异构方面,选择恰当的设计模式和合理的架构方案是关键所在。存量数据迁移和增量数据同步是不可或缺的步骤。上线过程中,确保系统具备可监控、可回滚和可灰度的能力,是实现平滑切换的保障。欢迎各位同学与我交流探讨。

相关推荐
专注VB编程开发20年7 分钟前
asp.net mvc如何简化控制器逻辑
后端·asp.net·mvc
用户67570498850237 分钟前
告别数据库瓶颈!用这个技巧让你的程序跑得飞快!
后端
千|寻1 小时前
【画江湖】langchain4j - Java1.8下spring boot集成ollama调用本地大模型之问道系列(第一问)
java·spring boot·后端·langchain
程序员岳焱1 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
后端·sql·mysql
龚思凯1 小时前
Node.js 模块导入语法变革全解析
后端·node.js
天行健的回响1 小时前
枚举在实际开发中的使用小Tips
后端
wuhunyu1 小时前
基于 langchain4j 的简易 RAG
后端
techzhi1 小时前
SeaweedFS S3 Spring Boot Starter
java·spring boot·后端
写bug写bug2 小时前
手把手教你使用JConsole
java·后端·程序员