乐趣区

关于golang:小猴启蒙数据迁移实战

作者:刘都都

背景

学前启蒙教育赛道,竞争日益激励,好将来团体旗下“小猴英语”,“小猴语文”,”小猴思维“三条独立产品站线,策略调整,资源合并,重拳出击,打造全新”小猴启蒙“品牌,专为 2 - 6 岁学前儿童打造的启蒙课程。

现状

  • 语言层面:小猴英语主技术栈应用 JAVA 语言; 小猴语文、思维主技术栈应用 PHP 语言
  • 构造层面:数据依赖关系、类型差异化大,无奈互相转换
  • 存储层面:课程存储构造、课前、课外、课中存储构造差异化大
  • 经营层面:独立经营、面向群体、策略形式均不雷同
  • 课程层面:课程差异化大,制作流程均不雷同

计划

行业常见的迁徙计划有“停机迁徙”、”双写迁徙“、”实时(单向)迁徙“,每一种计划都各自的特点和优劣势,对各个计划进行剖析。

  • 停机迁徙:主动型,迁徙机会可控,复杂度较低,危险较低,成本低,对业务有损,对用户不敌对
  • 双写迁徙:被动型,迁徙机会可控,复杂度较高、危险较高,老本较高,对业务无损,对用户敌对
  • 实时迁徙:被动型,迁徙机会不可控,复杂度高,危险较高,老本中等,对业务无损,对用户敌对

挑战

在团体策略背景推动下,联合以后现状及对将来布局,冀望摈弃历史包袱,轻装上阵,综合思考后采纳实时迁徙计划。面临诸多挑战,例如:

  • 迁徙机会:不可控,用户自主触发迁徙
  • 不可逆:一旦触发迁徙,过程不可逆,应答突发状况,要有应急预案
  • 一致性:数据一致性,迁徙前和迁徙后的数据不能失落
  • 给飞机换引擎:兼顾用户体验,尽可能确保整个迁徙过程用户无感知,平滑过渡

迁徙计划

小猴启蒙是一个全新的品牌,全新架构设计、存储结构设计,课程制作 & 排课设计,兼容旧的三科产品状态,同时具备灵便可扩大的能力。

第一步、迁徙机会明确

迁徙机会是用户下载小猴启蒙 APP,登录之后触发机会,触发机会后首先告诉三科服务,限度不可用,确保不会有新的数据长生,此时启动迁徙脚本进行数据迁徙,在此期间要确保迁徙速度足够快并且确保数据一致性,从而晋升用户体验,整个过程不可逆,一旦呈现紧急情况,须要有应急预案,迁徙胜利之后,用户即可在小猴启蒙 APP 上课(英语、思维、语文)。再也不必在三个 APP 中上课

第二步、数据分析 & 归类

通过对业务及数据分析 & 归类、数据可分两大类根底数据、用户数据。两种数据类型特点也各不相同,例如:

  • 根底数据:私有数据,其中包含售卖商品、积分商品、课包、绘本、儿歌
  • 用户数据:个人隐私数据,其中包含权利、积分、报告、课内数据,通过细分发现用户数据可分为外围数据、交易数据,例如:
  • 外围数据:权利、积分
  • 交易数据:交易记录、上课、完课记录等明细数据
第三步、针对不同数据特点,制订合适迁徙计划

通过上述剖析理解业务以后的数据及特点剖析,例如:

  • 根底数据:数据量少、根底前置数据,可控迁徙机会及迁徙工夫,危险可控,可人工校验。
  • 用户数据:这部分数据比拟非凡,外围数据量较少且重要,明细数据量较大且重要水平没有外围数据的高,迁徙整体复杂度较高,外围数据实时迁徙,交易数据一旦产生就不会在有变更了,如果数据量大,可前置迁徙,配合着用户触发迁徙进行最终的数据迁徙。迁徙机会及工夫不可控,用户触发,危险不可控。
第四步、”实时迁徙“技术计划分析

整个迁徙架构设计思维”透明化、先于用户发现问题,分钟级解决,数据可回溯“。在用户触发迁徙机会后,调度核心通过采纳 Invoke 反射机制,启动迁徙子工作 & 监控个子工作的状态(耗时、里程牌),子工作视数据量决定是否分片解决。

  • 外围架构设计点:RDS-TO-DRDS:面对交易明细或学习记录这类数据,为了在迁徙时晋升查问速度,能够思考将数据同步到 DRDS 中,依照用户 ID 做分库分表的主键

    • 工作解耦:面对多个业务模块或工作数据高低依赖关系时,通过解耦的形式升高或缩小高低依赖,例如:商品、订单、物流这几个模块,都是有档次关系的,惯例流程必定是先商品而后在订单之后依据订单生产物流数据,串行形式,这样带来的问题就是效率,故通过某种形式进行解耦,数据之间的依赖关系个别状况下依赖 ID,这里咱们能够放弃某种状况下雷同旧的 ID 生成的新 ID 要保持一致,另外在迁徙的过程中除了有历史数据,还有新增数据,倡议通过 ID 位数辨别开来,防止撞针,另外也便于排查问题,依据 ID 即分辨出新的业务数据还是历史数据。
    • 多任务并行:并行是为了晋升迁徙速度,这块没什么可说的。
    • 可回溯:历史数据的关联主键 ID 是字符串类型的,须要雷同旧的 ID 生成的新 ID 要保持一致,记录 & 存储下来,当然还有一种是依据 ID 通过算法生成,而后通过算法反推出来。
    • 数据分片:数据分片也是为了晋升迁徙速度。
    • 幂等性:为了保障因不可控因素导致中断或异样,保证数据的一致性所做的工作
    • 隔离:首先保障用户与用户之间是隔离的,其次是工作是隔离的,为了保障稳定性
    • 进度监控:为了可能对线上的状况一目了然,每一个系统监控都是不可或缺的。
    • 状态计算:多个子工作同时工作,须要通过调度核心计算最终的迁徙状态,后果,耗时等。
  • 调度核心:波及所有各个业务模块的数据,故每个模块都称之为子工作,通过调度核心对立调度,监控,计算整体迁徙进度;触发所有的迁徙子工作 & 监控 & 计算。计算所有子工作的迁徙状态计算最终的迁徙进度,迁徙耗时,迁徙数据量,外围要害数据。
  • 监控告警:为用户迁徙内容,提供透明化的监控伎俩,先于用户发现问题
  • 品质保障体系:为数据一致性提供的伎俩,及突发状况的预案。
  • 数据分片 Proxy:升高迁徙耗时晋升用户体验,解决大数据量迁徙问题。
  • 异构数据转换:从旧业务数据提供数据,通过格局转换、数据建模,后果计算,后置解决实现整个子工作的数据迁徙;其中里程碑是记录外围关键步骤,目标是为了疾速定位问题。
  • 业务 ID 转换器:数据 ID 类型产生了变动,字符串变成数值类型,为了确保数据一致性,故所有数据都可回溯,便于追溯数据前生今世。
第五步、品质保障体系设计

为了晋升用户体验及迁徙的速度及数据一致性所做的工作,使呈现突发状况,咱们可能对突发状况有应急预案。

对各个模块(工作)状态 & 进度监控,装备了主动修复机制,解决肯定水平上的问题,当主动修复机制解决不了时,及时的预警解决,咱们通过补丁助手能够疾速修复问题。

上线

上线是对咱们后期所有的工作的一个考验及验证,这个过程咱们还是要审慎操作的。

内测阶段分为两步:

  • 内测:内部测试 + 数据演练
  • 外测:抽样不同类型的用户,作为种子用户进行测试。
  • 天然阶段:这个阶段还是比拟激进,求稳为主,逐渐阶段。
  • 倡议阶段:相对来说曾经肯定的信念了,能够中等规模的告诉迁徙。
  • 强制阶段:大规模的迁徙阶段了
  • 缄默阶段:对缄默用户做迁徙了,这部分数据是最初一批用户数据了

复盘

在上线的每一个阶段,对每个问题都要进行复盘总结,防止同样的问题再次发生,当复盘之后会发现,呈现的问题都很低级,不应该呈现的问题。例如:

环境问题:刚刚开始在预发环境,前期上线后对某个数据库地址批改拉下了,导致数据迁徙不是最新的

Redis 问题:缓存过期工夫没有管制好,导致飞速增长。

ID 问题:两边事先沟通不分明、导致数据对不上。

总结

数据模型建设的办法

深刻理解两侧业务设计、数据结构设计
新旧映射关系整顿(点对点转换)
依据新的数据结构设计反向推旧零碎的数据结构设计
字段属性映射、关系映射
字段非凡类 型的含意
新构造新增的字段整顿
新增字段的数据起源
新增字段的类型转换
新增数据结构整顿
获取数据源前置条件
获取数据源办法
后果属性和新增数据结构映射
战绩
迁徙数据量过 20 亿

迁徙人次近 110 万人次

未呈现汇集性问题、失败率 0.1‰

专利产出(已受权)数据迁徙办法、安装、电子设备及存储介质

成长

对个人成长还是比拟大的,在技术上,架构设计衡量各方利益关系,没有完满的架构,只有最适宜的,不能只关注架构层面,对细节点及落地也须要更加的关注,细节决定胜利。在项目管理上,对我的项目沟通协调、节奏、危险把控也有很大的晋升,作为此次我的项目 Owner,负责并协调七八种角色,将近 30 人,此次我的项目的成绩离不开组内及各位搭档的定力反对,另外也要感激刘俊海老师对整体计划的领导。

退出移动版