加餐 | 数据的迁移应该如何做?
唐扬
该思维导图由 AI 生成,仅供参考
你好,我是唐扬。
在“数据库优化方案(二):写入数据量增加时,如何实现分库分表?”中我曾经提到,由于 MySQL 不像 MongoDB 那样支持数据的 Auto Sharding(自动分片),所以无论是将 MySQL 单库拆分成多个数据库,还是由于数据存储的瓶颈,不得不将多个数据库拆分成更多的数据库时你都要考虑如何做数据的迁移。
其实在实际工作中,不只是对数据库拆分时会做数据迁移,很多场景都需要你给出数据迁移的方案,比如说某一天,你的老板想要将应用从自建机房迁移到云上,那么你就要考虑将所有自建机房中的数据,包括 MySQL、Redis、消息队列等组件中的数据全部迁移到云上,这无论对哪种规模的公司来说都是一项浩瀚的工程,所以你需要在迁移之前准备完善的迁移方案。
“数据的迁移”的问题比较重要和繁琐,也是开发和运维同学关注的重点。在课程更新的过程中,我看到有很多同学,比如 @每天晒白牙,@枫叶 11,@撒旦的堕落等等,在留言区询问如何做数据迁移,所以我策划了一期加餐,准备从数据库迁移和缓存迁移两个方面带你掌握数据迁移的方法,也带你了解数据迁移过程中需要注意的关键点,尽量让你避免踩坑。
如何平滑地迁移数据库中的数据
你可能会认为:数据迁移无非是将数据从一个数据库拷贝到另一个数据库,可以通过 MySQL 主从同步的方式做到准实时的数据拷贝;也可以通过 mysqldump 工具将源库的数据导出再导入到新库,这有什么复杂的呢?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了数据迁移的重要性和复杂性,涉及数据库迁移和缓存迁移两个方面。在数据库迁移方面,作者提出了“双写”方案和级联同步方案,分别适用于不同场景的数据迁移。在缓存迁移方面,作者强调了保持缓存的热度的重要性,尤其是对于Redis缓存的迁移。文章还提出了改进版的副本组方式来迁移缓存数据,以尽量减少对专线带宽的占用。总的来说,本文提供了实用的数据迁移方案,帮助读者了解数据迁移的方法和关键考虑点。文章内容经过实战考验,对于需要进行数据迁移的读者具有一定的指导意义。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统设计 40 问》,新⼈⾸单¥59
《高并发系统设计 40 问》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(42)
- 最新
- 精选
- 约书亚a. @_CountingStars的问题提到“双写”方案中主从同步和双写冲突的问题,的回答是双写之前要将同步断掉。 假设我们在夜间进行操作,不考虑主从延迟过高的情况。 但是,”断掉同步“与”有双写代码的应用,被部署上线能正常执行双写“这两个操作之间,时机也不会配合特别完美吧? 如果先断掉同步,就意味着有可能从库丢掉部分数据。 如果先上线新代码,就意味着短时间内数据要么冲突,要么对于不幂等的操作,数据变成双份了? b.双写方案的一种隐患是新旧二库在遇到同一资源的并发操作时,执行顺序有可能不一样,进而结果就不一样。这种情况在实践中还要考虑么? c.另外我还疑问,现代的应用部署都是基于灰度的,在写操作的代码发生切换时(从双写到写新库,或者从写旧库到写新库),做灰度发布都会带来问题吧?
作者回复: 双写时加开关,默认关闭双写,上线完成后关闭同步,同时打开开关,在低峰期的话数据丢失的概率不高。再配合数据校验的工作,是可以保证一致性的
2019-10-25431 - mgxian双写方案中 由于新库配置为旧库的从库 此时双写肯定会出现数据重复的问题啊 或者 数据写入失败
作者回复: 双写之前要将同步断掉
2019-10-25414 - 星空老师说的方案,和我们前几个月做的方案整体上很想。不过我们的方案和场景更复杂一点,我们是系统升级。老系统为.Net+SqlServer,新系统是Java+Mysql。业务上由于是直接基于标品二次开发,所以存在新老系统的业务兼容和数据兼容,并不能简单的通过双写就解决问题。我们引入了kafka组件。和两个数据同步服务,两个服务之间商定共同认可的统一业务消息体,互相实时发送增量消息,并解析对方发送来的消息结合自己的业务入库。流量在网关层依据某个hander标识字段去分流,用apollo开关可以随时掌控切换的比例。做到随时能进能退。数据校验,对全量我们采用了业务抽检+总数校验。对增量我们才用了T+1后的增长量校验。为了验证新系统的业务准确性,还在网关层做了流量拷贝,响应对比等
作者回复: 这就更复杂了
2019-12-0912 - 小喵喵老师说的迁移是指的旧库迁移到新库,新旧库的表结构基本一样。但是如果系统重构后的迁移就很难做了。我以前遇到一个大的系统,整个db里面有几千张表。重构后采用微服务的方式,原来的一个db分成了10多个db,还做了分表。有些原来旧库的表也做了拆分,合并,字段的增加、减少等。旧库表中的有些字段名字都重新命名了。这样的数据迁移都是狗血的数据迁移。整个公司组建一个数据迁移团队,包括开发,架构师,技术总监,dba,运维等几百人,数据校验也基本都是人工校验。耗几个月才完成了数据迁移。而且问题一大推。面对如何奇葩的数据迁移,老师有什么好的方案?
作者回复: 数据的同步可以考虑解析binlog来同步 校验就真的没辙了,我之前经历的大的数据迁移都是已月为单位的
2019-10-31310 - 知行合一老师,数据具体怎么校验呢,简单说下常用的校验方式吧,谢谢
作者回复: 比如说从源库随机抽取一定量的数据,从新库中查询看是否一致
2019-10-288 - 任鹏斌老师有个疑问,数据库的双写方案1,2步之间,切换为双写前是不是应该停掉新旧库的同步关系?
作者回复: 是的,是要先停掉同步关系
2019-11-055 - 钱数据迁移目前还没做过,不过面试时曾经被问到过,给的是双写的方案。 关键点: 1:数据校验怎么做? 2:什么时候换成读新库? 3:什么时候不再写旧库? 允许停服务,怎么都好说,不能停服务,选择的时机非常关键,那一个时刻判断出数据已经一致了,怎么判断太关键了,线上有可能做不到完全一致,需要做一些线下补偿。 怎么判断数据是否一致呢?记录条数加抽样比对,允许一定的误差,不如总有误差就永远切不了啦!然后再去线下补偿。
作者回复: 数据校验好了就可以切新库
2020-04-253 - Corner老师您好,关于双写方案有两个疑问需要请教一下。1.数据同时写入两个数据库怎么做对代码的改动比较小呢?有成熟的工具或中间件来做吗?2.新库在同步追上旧库的binlog后,在开始双写时需要断开吗?不然对于新库会有重复的数据。如果新库需要停止对旧库的binlog同步,和双写的开启时机这里怎么做协调呢?
作者回复: 1. 还真没有,其实改动代码也简单 2. 需要断开的,可以在双写的时候加开关,断开同步时立刻打开开关
2019-10-2523 - whiledoing想问一下老师,如果数据的迁移还伴随着领域模型的重构(库表结构差异巨大,单纯基于binlog主从同步无法达到目标,必须业务上实现数据的模型变更,存量迁移和增量同步双写),有没有一些好的实践经验。
作者回复: 先迁移,后重构,不香吗 :) 如果一起做的话 可以基于消息来做,只是会复杂很多
2020-04-142 - la la la目前正在经历的上云,物理机与云都不互通,需要跳板机一层层的跳,乱七八糟一大堆的东西,就几个人搞,太坑了。
作者回复: 我目前也在经历上云,物理机和云的互通应该是上云的第一步吧。。
2019-12-0222
收起评论