高并发系统设计40问
唐扬
美图公司技术专家
立即订阅
9202 人已学习
课程目录
已更新 38 讲 / 共 40 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习高并发系统设计?
免费
基础篇 (6讲)
01 | 高并发系统:它的通用设计方法是什么?
02 | 架构分层:我们为什么一定要这么做?
免费
03 | 系统设计目标(一):如何提升系统性能?
04 | 系统设计目标(二):系统怎样做到高可用?
05 | 系统设计目标(三):如何让系统易于扩展?
06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
演进篇 · 数据库篇 (5讲)
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
10 | 发号器:如何保证分库分表后ID的全局唯一性?
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
演进篇 · 缓存篇 (6讲)
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
14 | 缓存的使用姿势(二):缓存如何做到高可用?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
16 | CDN:静态资源如何加速?
加餐 | 数据的迁移应该如何做?
演进篇 · 消息队列篇 (6讲)
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
18 | 消息投递:如何保证消息仅仅被消费一次?
19 | 消息队列:如何降低消息队列系统中消息的延迟?
20 | 面试现场第二期:当问到项目经历时,面试官究竟想要了解什么?
用户故事 | 从“心”出发,我还有无数个可能
期中测试 | 10道高并发系统设计题目自测
演进篇 · 分布式服务篇 (9讲)
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
22 | 微服务架构:微服务化后,系统架构要如何改造?
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
24 | 注册中心:分布式系统如何寻址?
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
26 | 负载均衡:怎样提升系统的横向扩展能力?
27 | API网关:系统的门面要如何做呢?
28 | 多机房部署:跨地域的分布式系统如何做?
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
演进篇 · 维护篇 (5讲)
30 | 给系统加上眼睛:服务端监控要怎么做?
31 | 应用性能管理:用户的使用体验应该如何监控?
32 | 压力测试:怎样设计全链路压力测试平台?
33 | 配置管理:成千上万的配置项要如何管理?
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
高并发系统设计40问
登录|注册

加餐 | 数据的迁移应该如何做?

唐扬 2019-10-25
你好,我是唐扬。
在“数据库优化方案(二):写入数据量增加时,如何实现分库分表?”中我曾经提到,由于 MySQL 不像 MongoDB 那样支持数据的 Auto Sharding(自动分片),所以无论是将 MySQL 单库拆分成多个数据库,还是由于数据存储的瓶颈,不得不将多个数据库拆分成更多的数据库时,你都要考虑如何做数据的迁移。
其实,在实际工作中,不只是对数据库拆分时会做数据迁移,很多场景都需要你给出数据迁移的方案,比如说某一天,你的老板想要将应用从自建机房迁移到云上,那么你就要考虑将所有自建机房中的数据,包括 MySQL,Redis,消息队列等组件中的数据,全部迁移到云上,这无论对哪种规模的公司来说都是一项浩瀚的工程,所以你需要在迁移之前,准备完善的迁移方案。
“数据的迁移”的问题比较重要,也比较繁琐,也是开发和运维同学关注的重点。在课程更新的过程中,我看到有很多同学,比如 @每天晒白牙,@枫叶 11,@撒旦的堕落等等,在留言区询问如何做数据迁移,所以我策划了一期加餐,准备从数据库迁移和缓存迁移两个方面,带你掌握数据迁移的方法,也带你了解数据迁移过程中,需要注意的关键点,尽量让你避免踩坑。

如何平滑地迁移数据库中的数据

取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《高并发系统设计40问》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(23)

  • 约书亚
    a. @_CountingStars的问题提到“双写”方案中主从同步和双写冲突的问题,的回答是双写之前要将同步断掉。
    假设我们在夜间进行操作,不考虑主从延迟过高的情况。
    但是,”断掉同步“与”有双写代码的应用,被部署上线能正常执行双写“这两个操作之间,时机也不会配合特别完美吧?
    如果先断掉同步,就意味着有可能从库丢掉部分数据。
    如果先上线新代码,就意味着短时间内数据要么冲突,要么对于不幂等的操作,数据变成双份了?
    b.双写方案的一种隐患是新旧二库在遇到同一资源的并发操作时,执行顺序有可能不一样,进而结果就不一样。这种情况在实践中还要考虑么?
    c.另外我还疑问,现代的应用部署都是基于灰度的,在写操作的代码发生切换时(从双写到写新库,或者从写旧库到写新库),做灰度发布都会带来问题吧?

    作者回复: 双写时加开关,默认关闭双写,上线完成后关闭同步,同时打开开关,在低峰期的话数据丢失的概率不高。再配合数据校验的工作,是可以保证一致性的

    2019-10-25
    10
  • _CountingStars
    双写方案中 由于新库配置为旧库的从库 此时双写肯定会出现数据重复的问题啊 或者 数据写入失败

    作者回复: 双写之前要将同步断掉

    2019-10-25
    2
    3
  • 任鹏斌
    老师有个疑问,数据库的双写方案1,2步之间,切换为双写前是不是应该停掉新旧库的同步关系?

    作者回复: 是的,是要先停掉同步关系

    2019-11-05
    1
  • 小喵喵
    老师说的迁移是指的旧库迁移到新库,新旧库的表结构基本一样。但是如果系统重构后的迁移就很难做了。我以前遇到一个大的系统,整个db里面有几千张表。重构后采用微服务的方式,原来的一个db分成了10多个db,还做了分表。有些原来旧库的表也做了拆分,合并,字段的增加、减少等。旧库表中的有些字段名字都重新命名了。这样的数据迁移都是狗血的数据迁移。整个公司组建一个数据迁移团队,包括开发,架构师,技术总监,dba,运维等几百人,数据校验也基本都是人工校验。耗几个月才完成了数据迁移。而且问题一大推。面对如何奇葩的数据迁移,老师有什么好的方案?

    作者回复: 数据的同步可以考虑解析binlog来同步

    校验就真的没辙了,我之前经历的大的数据迁移都是已月为单位的

    2019-10-31
    1
  • 知行合一
    老师,数据具体怎么校验呢,简单说下常用的校验方式吧,谢谢

    作者回复: 比如说从源库随机抽取一定量的数据,从新库中查询看是否一致

    2019-10-28
    1
  • Victor
    业务不做改造的话,无论哪种方案,要想新老环境数据一致,都需要短暂的禁写。即使是业务层做改造,按不同的模块双写数据库,同时MySQL新老环境相互同步,但在具体切换的时候,也要考虑主从延迟,从这点来看,其实还是会有一段时间的禁写。
    2019-10-26
    1
  • Corner
    老师您好,关于双写方案有两个疑问需要请教一下。1.数据同时写入两个数据库怎么做对代码的改动比较小呢?有成熟的工具或中间件来做吗?2.新库在同步追上旧库的binlog后,在开始双写时需要断开吗?不然对于新库会有重复的数据。如果新库需要停止对旧库的binlog同步,和双写的开启时机这里怎么做协调呢?

    作者回复: 1. 还真没有,其实改动代码也简单
    2. 需要断开的,可以在双写的时候加开关,断开同步时立刻打开开关

    2019-10-25
    1
    1
  • 星空
    老师说的方案,和我们前几个月做的方案整体上很想。不过我们的方案和场景更复杂一点,我们是系统升级。老系统为.Net+SqlServer,新系统是Java+Mysql。业务上由于是直接基于标品二次开发,所以存在新老系统的业务兼容和数据兼容,并不能简单的通过双写就解决问题。我们引入了kafka组件。和两个数据同步服务,两个服务之间商定共同认可的统一业务消息体,互相实时发送增量消息,并解析对方发送来的消息结合自己的业务入库。流量在网关层依据某个hander标识字段去分流,用apollo开关可以随时掌控切换的比例。做到随时能进能退。数据校验,对全量我们采用了业务抽检+总数校验。对增量我们才用了T+1后的增长量校验。为了验证新系统的业务准确性,还在网关层做了流量拷贝,响应对比等

    作者回复: 这就更复杂了

    2019-12-09
  • 小水
    老师,应该如何做数据库的切流量呢?是在应用层做个全局的计数吗?然后 10/100,40/100这么切分吗?您在场景用是如何做的呢?
    2019-12-05
  • la la la
    目前正在经历的上云,物理机与云都不互通,需要跳板机一层层的跳,乱七八糟一大堆的东西,就几个人搞,太坑了。

    作者回复: 我目前也在经历上云,物理机和云的互通应该是上云的第一步吧。。

    2019-12-02
    1
  • 吴青
    老师有个疑问, 关于"双写之前要将同步断掉", 什么时候将同步断掉呢?这个是怎样判断同步差不多,可以关闭同步,打开双写的

    作者回复: 主从延迟是可以监控的,可以看主从没有延迟了就可以断掉同步了

    2019-11-30
  • 布小丫学编程
    基于双写的方案我总结了2种实现:
    1、基于同步写新库和旧库方案
    在写入数据的时候,同步写入旧库数据,异步写入新库数据。
    数据校验,对部分数据进行校验(最容易出问题的地方,需要提前准备好脚本)。
    使用灰度发布方式将读流量切换到新库。
    观察几天没问题后,可以改成只写新库。
    2、基于Canal的迁移方案
    将新库配置为源库的从库,同步数据。比如使用Canal同步数据。
    数据校验,对部分数据进行校验(最容易出问题的地方,需要提前准备好脚本)。
    使用灰度发布方式将读流量切换到新库。
    暂停应用,将新库作为主库写入,使用Canal同步到旧库。
    观察几天没问题后,撤销Canal的同步。
    2019-11-16
  • 圣城小石匠
    老师,假如原有系统架构不满足业务,需要升级系统架构和业务,如何做到平滑切换,回滚,节约成本呢?
    2019-11-15
  • Keith
    你好, 关于"双写之前要将同步断掉", 什么时候将同步断掉呢? 数据在不断的写入, 在将同步断掉之后和开启双写之前如果有数据写入如何处理?

    作者回复: 所以要做数据的校验和补写,一般双写会加开关,在断掉同步时马上打开双写开关,时间窗口短,数据丢失的不会很多。

    2019-10-27
  • jack
    没做过数据迁移的工作,有收获!请教老师一个问题,在“双写”方案中,获取binlog增量日志,异步写入新库,如查多个线程消费,如何保证binlog日志有序写入新库呢?难道对binlog日志进行业务改造?

    作者回复: 这个一般对数据不会有那么强烈的需求吧

    2019-10-26
  • 彼得.林
    请问老师,双写中较验的核心逻辑是怎么样的?
    2019-10-26
  • 不经意间
    记录错误日志的想法挺好的
    2019-10-25
  • longslee
    打卡。老师你好,最后的10%流量方式,可能会要等的时间比较长吧?能否10%运行一段时间后,逐步提高流量比例,这样更快热到90%?

    作者回复: 是会等待比较长的时间,如果缓存热了一段时间可以考虑提高流量比例,核心是看专线的带宽和延迟情况对于应用的影响

    2019-10-25
  • 刺猬
    双写方案一部分流量切换到新库时,这部分流量写入时也需要写旧库
    2019-10-25
  • Liush
    有一点疑问就是:在数据迁移时如何做到不停机,按照我的理解就是,在数据迁移前上线一个应用记录每次insert的或者update的语句,然后将旧库中的数据同步到新库,同步完成后再读取前面记录的日志来保证新库和旧库数据的同步,在决定完全迁移到新库的时候先停掉旧库的写入,再将应用的数据源迁移到新库(这一步保证日志的状态完全和新库同步)。还有一点就是主从同步如果用mysql的自带的主从来做,好像要保持新库和旧库数据的同步,才能开启主从,那这是否意味着需要将旧库的写入停止,等旧库数据完全迁移到新库时再开启旧库写入功能?(因为需要让新旧库数据保持一致后才能做主从)
    2019-10-25
    1
收起评论
23
返回
顶部