分库分表&百亿级数据迁移(1)

简介: 分库分表&百亿级数据迁移

以下文章来源于阿里开发者,作者星花


一  前言


拆库&数据迁移说白了,考验的不是一个人的技术功底,而是一个人干活的细致程度,以及抗压能力。无论在哪个公司,数据库迁移的机会都不会太多,因此,我也是非常珍惜这次历练,用阿里的一句老话来说就是 “因人成事,借事修人”。写这篇文章的目的主要是自己进行一个总结,也希望能给需要的同学们一些参考。

二  背景


在星爷的《大话西游》中有一句非常出名的台词:“曾经有一份真挚的感情摆在我的面前我没有珍惜,等我失去的时候才追悔莫及,人间最痛苦的事莫过于此,如果上天能给我一次再来一次的机会,我会对哪个女孩说三个字:我爱你,如果非要在这份爱上加一个期限,我希望是一万年!”在我们开发人员的眼中,这个感情就和我们数据库中的数据一样,我们多希望他一万年都不改变,但是往往事与愿违,随着公司的不断发展,业务的不断变更,我们对数据的要求也在不断的变化。在早期为了快速尝试新业务,菜鸟积分系统在发展初期是单体系统,数据库是单库多表。随着菜鸟C端业务快速增长,服务消费者已经过3亿+,对于消费者阵地也从查、取、寄开始慢慢扩展到玩、购。主要是裹酱商城以及各个业务线多种多样的活动,这些活动包含了停留、任务、开奖、分享、签到、助力、兑换、抽奖等多种多样的互动手段。权益在其中起到了钩子的作用,引导流量进入互动业务,互动产品本身提供了某些“价值”,使得消费者在平台停留时间增加,“价值”承载的实体之一就是虚拟权益积分。菜鸟积分系统一直扮演着一个底层核心角色,承载用户核心资产。在大促期间需要支持大流量的活动,因此整个积分系统在大促期间面临挑战是非常大的。

为了支持菜鸟C端营销业务的持续爆炸式增长,我们启动了菜鸟积分系统升级工作,如何在业务不暂停的情况下,完成积分从单库单表到分库分表的数据架构升级,背后实施步骤以及遇到过哪些意想不到的坑,本文将分享这一高风险操作是如何逐步分阶段完成的。


三  面临挑战


在开始设计迁移方案之前,我们首先需要调研系统现状,通过调研系统现状之后,我们发现了本项目面临以下几个主要的挑战:

  • 从1到N在系统架构上差异较大:原来的是单库单表的系统,之前的设计开发都是基于单库单表的,例如SQL查询,在单表上建了多个索引来支持这些查询业务,切换到分库分表之后,不带分表键的查询就不能支持了。


  • 业务不可暂停:整个迁移过程,营销业务不允许暂停,类似于开着飞机换引擎,比一些银行系统的暂停服务来做迁移的难度大。


  • 数据量大:单表数据量超级大,对数据同步链路的稳定性提出了很大的挑战。


  • 系统架构旧:积分系统建立时间很早,所选用的技术框架老旧,有些甚至已经不再维护了,导致整个改造成本加大,改动过程风险很大。


  • 接口版本多:由于历史原因,积分的发放和消耗接口版本非常多,有些历史包袱在里面,使得迁移的难度和风险都很大。


  • 可监控、可灰度、可回滚:为了降低整个项目的风险,按照阿里稳定性三板斧,要求整个迁移过程可监控、可灰度、可回滚。这三个要求对服务重构没有大问题,但是对于这个同时涉及数据迁移的项目,难度反而是加大了,如果不要求可灰度、可回滚,只用做数据的从老的单库单表到新的分库分表的单向迁移就可以了,而如果要求可灰度、可回滚,则必须要求数据的双向同步,加大了数据同步链路的风险。


  • 时间紧迫:需要在特定时间前完成拆库和数据源迁移(近1个多月的时间),封网期间加大了操作流程的复杂性。


备注:涉及到数据的重构项目风险极大,没处理好可能就要背包走人了,如果数据一旦错乱或者丢失,有可能会造成部分数据不可恢复,或者即使能恢复(不同于单纯的服务重构),恢复时间通常也很长,按小时,甚至按天计算。业务很难承受这个代价。在期间师兄送了我四字方针:胆大心细。既然风险这么大,那我们能不干这个分库分表迁移项目吗?不能!因为菜鸟积分系统在2020年双十一期压测期间,已经成为瓶颈了,已经到了不得不迁移重构的地步,而且这个重构越晚做风险越大。这个时候就适合阿里的一条价值观上场了:“If not now, when? If not me, who?” So, let's do it.



相关文章
|
中间件 关系型数据库 Java
MySQL数据库分库分表方案
MySQL数据库分库分表方案
594 0
MySQL数据库分库分表方案
|
SQL 缓存 NoSQL
接口的幂等性设计和防重保证,详细分析幂等性的几种实现方法
本篇文章详细说明了幂等性,解释了什么是幂等性,幂等性的使用场景,讨论了幂等和防重的概念。分析了幂等性的情况以及如何设计幂等性服务。阐述了幂等性实现防重的几种策略,包括乐关锁,防重表,分布式锁,token令牌以及支付缓冲区。
8679 0
接口的幂等性设计和防重保证,详细分析幂等性的几种实现方法
|
消息中间件 存储 监控
自顶向下学习 RocketMQ(十):消息重投和消息重试
生产者在发送消息时,同步消息失败会重投,异步消息有重试,oneway 没有任何保证。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在 RocketMQ 中是无法避免的问题。消息重复在一般情况下不会发生,当出现消息量大、网络抖动,消息重复就会是大概率事件。另外,生产者主动重发、consumer 负载变化也会导致重复消息。
自顶向下学习 RocketMQ(十):消息重投和消息重试
|
算法 安全 Linux
万字详解并发编程!!!
本文介绍了并发编程的基本概念和技术,涵盖了操作系统的发展历程、进程与线程的原理和使用方法。主要内容包括: 操作系统发展史:从手工操作到多道程序系统、分时系统、实时系统,再到通用操作系统,逐步介绍了操作系统的演变过程。 并发编程技术:强调并发编程的目标是充分利用CPU资源,提高系统性能 进程:详细讲解了进程的概念、组成、状态、调度算法、进程间通信(IPC)以及守护进程和僵尸进程等问题。 线:介绍了线程的基本概念、与进程的区别、线程的创建、多线程共享资源、线程同步与互斥锁、递归锁和死锁问题 5. **队列**:讲解了队列的基本概念,包括先进先出队列、后进先出队列和优先级队列,并提供了具体的实现示例
652 38
|
消息中间件 弹性计算 固态存储
256变4096:分库分表扩容如何实现平滑数据迁移?
本文作者就一个高德打车弹外订单系统进行了一次扩分库分表和数据库迁移。
256变4096:分库分表扩容如何实现平滑数据迁移?
|
存储 关系型数据库 MySQL
分库分表:存量1亿,日增量500万如何分库分表?
分库分表:存量1亿,日增量500万如何分库分表?
|
Java API 调度
Web后端Javaee企业级开发之定时任务 Springboot整合任务框架Quartz和Task详解
Web后端Javaee企业级开发之定时任务 Springboot整合任务框架Quartz和Task详解
266 0
|
Linux
百度搜索:蓝易云【深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式】
通过以上方法,你可以深入了解Linux进程的内存使用情况,包括VSS、RSS、PSS、USS等指标,帮助你进行性能优化和资源管理。
553 12
|
存储 缓存 分布式计算
菜鸟积分系统稳定性建设 - 分库分表&百亿级数据迁移
拆库&数据迁移说白了,考验的不是一个人的技术功底,而是一个人干活的细致程度,以及抗压能力。无论在哪个公司,数据库迁移的机会都不会太多,因此,我也是非常珍惜这次历练,用阿里的一句老话来说就是 “因人成事,借事修人”。写这篇文章的目的主要是自己进行一个总结,也希望能给需要的同学们一些参考。
菜鸟积分系统稳定性建设 - 分库分表&百亿级数据迁移
|
SQL 小程序 分布式数据库
百亿级数据 分库分表 后怎么分页查询?
百亿级数据 分库分表 后怎么分页查询?
百亿级数据 分库分表 后怎么分页查询?