21世纪了还愚公移山?数据库这么迁移更稳定!

Photo by Barth Bailey on Unsplash

在系统的快速迭代过程中,业务系统往往部署在同一个物理库,没有做核心数据和非核心数据的物理隔离。随着数据量的扩大这种情况会带来稳定性的风险,如库的慢sql,磁盘,IO等等都会相互整体影响,从而影响核心系统的业务稳定性,因此需要将核心业务的业务表从原有库里抽取出来,单独到新库里。而核心数据的迁移,涉及到的一个关键难点:如何平稳及用户无感知的迁移数据,本文将结合闲鱼商品库迁移实践,向大家展示如何解决这个难题的。

闲鱼商品数据现状

闲鱼商品数据量XX亿级别以上, 采用分表分库和读写分离的MYSQL数据库集群来支撑线上查询服务,如下图,通过TDDL[1]数据库中间件进行高效统一管理。可能有些同学会对分表分库相关概念不了解,这里先简单做些介绍。

01分表分库原理

本质是数据库的水平拆分问题,把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题,下图描述分表分库的核心原理:


当然分表分库也有负面影响,就是表结构变更及相关管理相比单表麻烦,有一定风险,具体如何决择,还是要根据实际情况来分析。

02分表分库下全局Sequence生成

分表分库解决在线服务容量和性能问题,但是也带来使用上的复杂度提升。灵活的配置路由规则和路由数据并提供简单易用的封装都是要考虑的,以便业务对此无感知。阿里开源中间件产品TDDL提供了解决方案,对应阿里云上产品为:DRDS[2]。

TDDL关键原理不多做介绍,但是在数据库迁移过程中主键冲突风险是故障重要风险点,这里简要介绍下TDDL的全局唯一主键生成原理。


如上图,TDDL Sequence是基于数据库更新+内存分配:每次操作批量分配id,分配id的数量就是sequence的内步长,而原有id值就加上外部长值,后续的分配直接就在内存里拿,这样的优势:简单高效 缺点:无法保证自增顺序。

另外数据迁移过程中,在新库中,为了保证跟原数据库主键非冲突,需要设置一个跃迁比较大的主键,防止出现两个库中的主键冲突,这是后续迁移中要注意的关键点之一。

数据迁移方案

通过前文的简单介绍,大家对闲鱼商品库现状有了初步了解,下面将给大家介绍一下闲鱼是如何做到稳定迁移商品库的。

01核心思路

数据迁移核心思路抽象起来其实很简单,即如何稳定平滑迁移数据,如下图所示:

但围绕这个过程细化下去,我们会遇到不少问题,如:
1、数据我们该如何迁移,是一次性?还是分阶段?
2、如何校验数据迁移过程的正确性?
3、我们业务改造有问题怎么办?如何尽早发现?如何回滚?
4、我们的新库性能如何?

带着这些问题,我们进一下细化梳理迁移方案。

02实现方案

如上图所示,整个方案分为几个部份:

1、系统改造,包括SQL改造,双写开关,新库sequence创建。

SQL改造:加载两套TDDL数据源,一套是给老库的,一套是给新库的,并且生成两套mybatis sql 模板。
双写开关:设置好写新库,写老库的开关,用于线上迁移过程中双写过程及遇到问题及时回滚。
sequence创建:迁移sequence表时,需要抬升新库的sequence表中的值,用于防止主键冲突,并且需要按照主键消耗量评估一个安全值,这是非常重要的一个细节,再次强调一下。

2、稳定性保障,迁库是大事,改造过程中,稳定性重中之重,主要有系统压测,线上流量回放,故障演练。

系统压测:主要针对新库进行性能测,防止新库有意外情况。
线上流量回放:Edsger W. Dijkstra说过如果调试程序是一种标准的可以铲除BUG的流程,那么,编程就是把他们放进来的流程。通过引入线上数据在测试环境回放,可以尽可能的发现问题,保证改造后的稳定性。
故障演练:通过注入一些人为故障,如写新库失败,新库逻辑有问题,及时的演练回滚策略。

3、数据迁移,主要利用阿里云数据传输服务DTS[3]的数据迁移能力,涉及到全量迁移、增量迁移、一致性校验及反向任务。

全量迁移:数据迁移首要目标如何将历史全量数据迁移到新库中,我们的做法是指定一个时间点,再根据这个时间点查找每张源表的最大及最小id,然后分别批量导到目标库中,如图:

*整个过程都是查询在线库的备库,因此不影响在线业务的数据库服务。

增量迁移:由于迁移过程中业务服务一直运行,因此全量迁移完全成,并且要将全量时间点后的数据追回来,这里核心原理是同步全量时间位点后binlog日志数据来保证数据一致性,需要注意的是增量时间需要前移一小断时间(如5分钟),其主要原因是全量迁移启动的那刻会有时间差,需要增量前移来保证数据最终一致性,如下图:

一致性校验:通过全量及增量的迁移后,此时源库跟目标的数据理论上是一致的,但实际上应用在经过功能测试,线上流量回放等阶段,数据在这个过程中有可能会现不一致的情况,因此正式上线前,需要做数据一致性校验,其原理是分批查询源表(跟全量迁移的查询方式类似),再跟目标库进行比对,如图所示:

反向任务:迁移到新库后,会有一线离线业务对老库还有依赖,需要建立从新库到老库的回流任务,原理跟增量迁移一样,只是变更一下原库及目标库。

03迁库流程

到这里大家应该对迁库所涉及到点比较清楚了,但还有一个非常重要的事,即梳理整个迁库步骤非常关键,通常会有两种方案。

方案一:

1、DTS数据追平,即全量同步完成,开启增量同步,并且延迟在秒级以内。
2、上线前校验,主要有线上流量回放、压测、一致性校验,故障演练。
3、线上开双写,线上同时写新库及老库,这时需要关闭增量同步任务,防止无效覆盖。
4、线上校验,执行预先准备的测试脚本并结合一致性校验工具,同时将读流量慢慢切到新库,验证双写逻辑。
5、切换数据源,关闭双写并正式写入新库。
6、创建反向任务,数据回流老库。

方案二:


1、DTS数据追平,即全量同步完成,开启增量同步,并且延迟在秒级以内。
2、上线前校验,主要有线上流量回放、压测、一致性校验,故障演练。
3、线上切开关,写新库, 同时需要关闭增量同步任务,防止无效覆盖。
4、创建反向任务,数据回流老库。

方案优缺点对比:

总结起来方案1迁移流程相对复杂,对迁移的控制力度更细,适合业务复杂,底层改造比较多,想精细化控制迁移步骤的场景,方案2迁移相对简单,过程快速,适合业务流程相对简单,可控,想快速切换的场景,具体选选择哪个方案,同学们可以根据自身的业务情况做选择。

这里考虑到闲鱼商品业务复杂,底层改造较多,从稳定性的角度考虑,最终选择方案1。

方案1,最关键的是3、4、5步骤,因此需要预先做好回滚计划。

04回滚方案

回滚方案总原则是不丢数据。最有可能的发生点是双写期间新库出问题,导致线上服务异常,这时只要立即关闭写新库即可,另外就是切到新库后,新库出问题了(如性能问题),可以立即切回到老库,并通过反向任务,保持数据一致性,最后若没启用分布式事务,双写的时间越短越好,有可能会有数据不一致情况。

小结

通过周密的迁移方案设计,以及DTS强大的数据迁移工具的能力,闲鱼商品库顺利完成XX亿在线数据库服务迁移,独立的物理部署显著提升商品库在线服务的稳定性。然而不同业务系统的数据库情况可能会有差异,如单库向多库迁移,单表向多表迁移等,不过整体方案大致类似,希望本文迁库实践方案能给大家提供一个可行的参考。

Image placeholder
sun250866693
未设置
  25人点赞

没有讨论,发表一下自己的看法吧

推荐文章
微服务?数据库?它们之间到底是啥关系?

过去几年来,“微服务架构”这个术语持续火热,它描述了一种将软件应用程序设计为可独立部署的服务套件的特定方式。尽管这种架构风格没有确切的定义,但围绕业务能力,自动化部署,网点智能以及语言和数据的分散控制

Go语言高级编程_1.1 Go语言创世纪

1.1Go语言创世纪 Go语言最初由Google公司的RobertGriesemer、KenThompson和RobPike三个大牛于2007年开始设计发明,设计新语言的最初的洪荒之力来自于对超级复杂

idea2019激活教程,永久激活,一次性搞定!(必看)

idea2019激活教程,永久激活,一次性搞定!(必看)此教程仅用作个人学习,请勿用于商业获利,造成后果自负!!!此教程已支持最新2019.2版本永久激活方法1.下载jar包点击链接网盘链接:pan.

忘记MySQL密码怎么办?一招教你搞定!

课程推荐:PHP开发工程师--学习猿地精品课程 在安装完MySQL或者是在使用MySQL时,最尴尬的就是忘记密码了,墨菲定律也告诉我们,如果一件事有可能出错,那么它一定会出错。那如果我们不小心忘记了M

开曼国家银行已证实被黑客入侵:2.21 TB数据惨遭泄露

“或许这只是冰山一角,其背后还隐匿着更多的深海冰川。”开曼群岛——一个吸引人的财政天堂。近日,据外媒报道,匿名黑客入侵了开曼国家银行,并泄露了2.21TB数据,此外,他还向其他黑客提供100,000美

GORM 中文文档_4.4. 数据库迁移

自动迁移 使用migrate来维持你的表结构一直处于最新状态。 警告:migrate仅支持创建表,没有的字段和没有索引。为了保护你的数据,它并不支持改变已有的字段类型或删除未被使用的字段 db.Aut

【Golang+MySQL】记一次 MySQL 数据库迁移(一)

【Golang+mysql】记一次mysql数据库迁移(一)文章地址:https://github.com/stayfoo/stayfoo-hub一、准备目标: 腾讯云CVM自建mysql数据迁移到腾

Google 21 岁生日,一文回顾 Google 发展史

9月27日,谷歌在Google搜索引擎首页庆祝自己21岁生日。 在涂鸦存档上,谷歌发布了一封庆祝信: 21年前,两位斯坦福大学博士生谢尔盖·布林和拉里·佩奇发表了一篇有关启动“大型搜索引擎”原

干货满满 | 来自灵魂的拷问-这21道Redis面试题

1、使用redis有哪些好处?速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)支持丰富数据类型,支持string,list,set,sort

任正非对话美国思想巨头:短期预计营收下降300亿美元,但2021年华为将重焕生机

大数据文摘编辑部出品6月17日,华为创始人任正非在华为深圳总部,与数字时代三大思想家的其中两位,《福布斯》著名撰稿人乔治·吉尔德和美国《连线》杂志专栏作家尼古拉斯·尼葛洛庞帝,进行了一场长达100分钟

Gartner:到2021年AI将创造2.9万亿美元商业价值

根据Gartner周一发布的报告显示,到2021年,人工智能将创造2.9万亿美元的商业价值,创造全球62亿小时的工人生产力,人工智能(AI)即将进入回报期。而在不久之前,“人工智能寒冬论”还曾不绝于耳

21岁日本女星惨遭猥亵,只因自拍瞳孔倒影暴露住址? | 一张照片是怎么出卖你的!

不管你是才男俊女还是相貌平平,在朋友圈中点赞最高的永远都是自拍照,特别是到了放假期间,通过朋友圈你可以感受全世界的爱。各位在各大社交网站晒图享受赞誉的同时,跟随着有一些风险也悄悄到来。前一段时间有一个

2021适合移动和桌面应用的JavaScript框架是什么

课程推荐:Java开发工程师--学习猿地--送7个上线商业项目 当听到JavaScript这个词的时候,“web开发”会一下子出现在我们的脑海中,因为JavaScript在很长一段时间里一直是web应

Mysql中,21个写SQL的好习惯,你值得拥有呀

课程推荐:PHP开发工程师--学习猿地精品课程 前言每一个好习惯都是一笔财富,本文分SQL后悔药,SQL性能优化,SQL规范优雅三个方向,分享写SQL的21个好习惯,谢谢阅读,加油哈~github地址

Python分析42年高考数据,告诉你高考为什么这么难?

大数据文摘授权转载自数据森麟作者:徐麟对于已经工作的“上班族”来说,6月7号到9号三天无疑是兴奋到飞起的,终于迎来了令人愉悦的端午假期。然而有那么一群人,将在端午节日之际迎来人生特别重要的一次经历或者

1000亿文本信息,高并发MD5查询,这么大数据量的业务怎么弄?

==提问== 沈老师,你好,想请教一个身份证信息检索的问题。公司有一个每秒5万并发查询的业务,(假设)根据身份证MD5查询身份证信息,目前有1000亿条数据,纯文本存储,前几天看你写LevelDB,请

最稳定可靠,PostgreSQL 12.1版本正式发布!

1.PG12.1Beta发布了!PostgreSQL全球开发组宣布,PostgreSQL12的第一个测试版(PG12.1Beta)现已开放下载。该版本中可预览的所有特性都将延续至PG12的最终版本中,

稳定彰显强悍实力,商务办公首选ThinkPad L490

商务本主要面向的人群是职场精英,他们对于产品的稳定性以及数据的安全性都有极高的要求,与此同时为了满足繁杂的办公任务,也需要强劲的性能来保驾护航。全新产品ThinkPadL490采用了英特尔第八代低功耗

如果我问你:排序算法的「稳定性」有何意义?你怎么回答?

虽然我们在工作不一定经常去写排序算法,但是排序算法却是充斥着我们的程序生活,比如你不经意间调用了SDK中的某个sort算法,其背后无非是什么快排、归并等算法。而且在我们面试的过程中也会经常被问及,如果

Dubbo 稳定性案例:Nacos 注册中心可用性问题复盘

问题描述上周四晚刚回到家,就接到了软负载同学的电话,说是客户线上出了故障,我一听”故障“两个字,立马追问是什么情况,经过整理,还原出线上问题的原貌:客户使用了Dubbo,注册中心使用的是Nacos,在

稳定性专题 | Spring Boot 常见错误及解决方法

导读『StabilityGuide』是阿里多位阿里技术工程师共同发起的稳定性领域的知识库开源项目,涵盖性能压测、故障演练、JVM、应用容器、服务框架、流量调度、监控、诊断等多个技术领域,以更结构化的方

MySQL 数据库操作:创建和查看数据库

数据库是数据的集合。MySQL允许我们高效地存储和检索数据库中的数据。在MySQL中,我们可以使用CREATEDATABASE语句创建数据库。但是,如果数据库已经存在,则会引发错误。为了避免该错误,我

MySQL 数据库操作:删除数据库

使用MySQL的DROPDATABASE命令可以很容易的删除一个数据库。数据库删除的同时,所属的数据表将一起被删除。如果删除的数据库不存在,则会引发错误。为了避免错误的发生,可以在DROPDATABA

平安科技数据库总经理汪洋:开源数据库在平安的应用实践

本文转自| 平安科技数据库产品团队2019年5月9日,平安科技数据库产品及存储产品部总经理在第十届数据库技术大会DTCC上分享了《开源数据库在平安的应用实践》,本文根据演讲内容整理,围绕以下几个方面进

2019数据库趋势研究:谁是最受青睐的数据库?

哪些数据库在2019年最受青睐?本文向DeveloperWeek的数百名业内人士咨询了当前NoSQL与SQL的使用情况,得到了有关MySQL、MongoDB、PostgreSQL、Redis和其他方面