互联网系统,经常会有数据迁移的需求。系统从机房迁移到云平台,从一个云平台迁移到另一个云平台,系统重构后表结构发生了变化,分库分表,更换数据库选型等等,很多场景都需要迁移数据。

在互联网行业,很多系统的访问量很高,即便在凌晨两三点也有一定的访问量。由于系统数据迁移,导致服务暂停几分钟,是很难被业务方接受的!本文我们就来聊一下,在用户无感知的前提下,如何设计不停机数据迁移方案!

数据迁移过程我们要注意哪些关键点呢?第一,保证迁移后数据准确不丢失,即每条记录准确而且不丢失记录;第二,不影响用户体验(尤其是访问量高的C端业务需要不停机平滑迁移);第三,保证迁移后的性能和稳定性。

数据迁移方案

挂从库


在主库上建一个从库。从库数据同步完成后,将从库升级成主库(新库),再将流量切到新库。

这种方式适合数据结构不变,而且空闲时间段流量很低,允许停机迁移的场景。一般发生在平台迁移的场景,如从机房迁移到云平台,从一个云平台迁移到另一个云平台。大部分中小型互联网系统,空闲时段访问量很低。在空闲时段,几分钟的停机时间,对用户影响很小,业务方是可以接受的。所以我们可以采用停机迁移的方案。步骤如下:

1,新建从库(新数据库),数据开始从主库向从库同步。

2,数据同步完成后,找一个空闲时间段。为了保证主从数据库数据一致,需要先停掉服务,然后再把从库升级为主库。如果访问数据库用的是域名,直接解析域名到新数据库(从库升级成的主库),如果访问数据库用的是IP,将IP改成新数据库IP。

3,最后启动服务,整个迁移过程完成。

这种迁移方案的优势是迁移成本低,迁移周期短。缺点是,切换数据库过程需要停止服务。

双写


老库和新库同时写入,然后将老数据批量迁移到新库,最后流量切换到新库并关闭老库读写。

这种方式适合数据结构发生变化,不允许停机迁移的场景。一般发生在系统重构时,数据结构会发生变化,如表结构改变或者分库分表等场景。有些大型互联网系统,平常并发量很高,即便是空闲时段也有相当的访问量。几分钟的停机时间,对用户也会有明显的影响,甚至导致一定的用户流失,这对业务方来说是无法接受的。所以我们需要考虑一种用户无感知的不停机迁移方案。

以笔者之前经历的用户系统重构为例,聊一下具体方案。当时的场景是这样的,用户表记录数达到3000万时,系统性能和可维护性变差,于是我们将用户中心从单体工程中拆分出来并做了重构,重新设计了表结构,而且业务方要求不停机上线!下面是我们当时的方案,步骤如下:

  1. 代码准备。在服务层对用户表进行增删改的地方,要同时操作新库和老库,需要修改相应的代码(同时写新库和老库)。准备迁移程序脚本,用于做老数据迁移。准备校验程序脚本,用于校验新库和老库的数据是否一致。

  2. 开启双写,老库和新库同时写入。注意:任何对数据库的增删改都要双写;对于更新操作,如果新库没有相关记录,需要先从老库查出记录,将更新后的记录写入新库;为了保证写入性能,老库写完后,可以采用消息队列异步写入新库。

  3. 利用脚本程序,将某一时间戳之前的老数据迁移到新库。注意:1,时间戳一定要选择开启双写后的时间点(比如开启双写后10分钟的时间点),避免部分老数据被漏掉;2,迁移过程遇到记录冲突直接忽略(因为第2步的更新操作,可能已经把记录拉到了新库);3,迁移过程一定要记录日志,尤其是错误日志,如果有双写失败的情况,我们可以通过日志恢复数据,以此来保证新老库的数据一致。

  4. 第3步完成后,我们还需要通过脚本程序检验数据,看新库数据是否准确以及有没有漏掉的数据

  5. 数据校验没问题后,开启双读,起初给新库放少部分流量,新库和老库同时读取。由于延时问题,新库和老库可能会有少量数据记录不一致的情况,所以新库读不到时需要再读一遍老库。逐步将读流量切到新库,相当于灰度上线的过程。遇到问题可以及时把流量切回老库

  6. 读流量全部切到新库后,关闭老库写入(可以在代码里加上热配置开关),只写新库

  7. 迁移完成,后续可以去掉双写双读相关无用代码。

利用数据同步工具


我们可以看到上面双写的方案比较麻烦,很多数据库写入的地方都需要修改代码。有没有更好的方案呢?

我们还可以利用Canal,DataBus等工具做数据同步。以阿里开源的Canal为例。

上面是Canal的原理图,

1,Canal模拟mysql slave的交互协议,把自己伪装成mysql的从库

2,向mysql master发送dump协议

3. mysql master收到dump协议,发送binary log给slave(canal)

4. canal解析binary log字节流对象,根据应用场景对binary log字节流做相应的处理

所以上面的用户系统数据迁移,就不需要开启双写了,服务层也不需要编写双写的代码,直接用Canal做增量数据同步即可。相应的步骤就变成了:

  1. 代码准备。准备Canal代码,解析binary log字节流对象,并把解析好的用户数据写入新库。准备迁移程序脚本,用于做老数据迁移。准备校验程序脚本,用于校验新库和老库的数据是否一致。

  2. 运行Canal代码,开始增量数据(线上产生的新数据)从老库到新库的同步。

  3. 利用脚本程序,将某一时间戳之前的老数据迁移到新库。注意:1,时间戳一定要选择开始运行Canal程序后的时间点(比如运行Canal代码后10分钟的时间点),避免部分老数据被漏掉;3,迁移过程一定要记录日志,尤其是错误日志,如果有些记录写入失败,我们可以通过日志恢复数据,以此来保证新老库的数据一致。

  4. 第3步完成后,我们还需要通过脚本程序检验数据,看新库数据是否准确以及有没有漏掉的数据

  5. 数据校验没问题后,开启双读,起初给新库放少部分流量,新库和老库同时读取。由于延时问题,新库和老库可能会有少量数据记录不一致的情况,所以新库读不到时需要再读一遍老库。逐步将读流量切到新库,相当于灰度上线的过程。遇到问题可以及时把流量切回老库

  6. 读流量全部切到新库后,将写入流量切到新库(可以在代码里加上热配置开关。注:由于切换过程Canal程序还在运行,仍然能够获取老库的数据变化并同步到新库,所以切换过程不会导致部分老库数据无法同步新库的情况)

  7. 关闭Canal程序

  8. 迁移完成。

此外,对于数据结构不改变的不停机数据迁移,也可以利用Canal处理。除了第3步DBA可以直接利用工具做老数据的迁移,其他步骤基本和上面一样。

希望本文对大家有所帮助。原创不易,如果感觉本文有帮助,有劳转发或点一下“在看”!让更多人收获知识!

作者简介:曾任职于阿里巴巴,每日优鲜等互联网公司,任技术总监,15年电商互联网经历,擅长高并发场景下系统性能和稳定性解决方案。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

数据迁移,不停机上线的正确姿势相关推荐

  1. 神策数据迁移服务正式上线,以服务产品化迎战云迁移难题

    从成立至今,神策数据一直坚持"打造一家技术产品型公司",服务产品化是我们坚持的产品原则.我们希望能将服务作为神策的重要产品面向客户,以帮助客户更好地使用神策的产品. 在日常服务客户 ...

  2. 大数据职业规划的N种正确姿势

    数据相关的职业,大致有3种职业路线,分别是市场调研方向.数据分析/挖掘方向.数据工程师方向,这3条路线,分别有对应的公司和技能树. "不少朋友 非数学/计算机/统计学 专业毕业的朋友走的是这 ...

  3. 一种可以避免数据迁移的分库分表scale-out扩容方式

    原文地址:http://jm-blog.aliapp.com/?p=590 目前绝大多数应用采取的两种分库分表规则 mod方式 dayofweek系列日期方式(所有星期1的数据在一个库/表,或所有?月 ...

  4. mysql如何不停机迁移_如何实现真正的不停机数据迁移?

    各位周三好. 明天是大年三十了,西瓜哥也要过年了.今年是最后一天探讨存储技术.正愁不知道和大家分享啥,收到一个网友的投稿,简述如何实现不停机迁移数据的一个比较好的方法,决定选登出来,供大家参考. -- ...

  5. 5个学习大数据的正确姿势

    数据科学这个新领域发展迅速的同时也有着较大的人才缺口,还有其可观的薪资吸引了无数人.小编分享学习大数据的5个正确姿势: 一.学习动机 数据科学是一个广泛而模糊的领域,这使得它很难学习.没有动力,你最终 ...

  6. 参加大数据培训的正确姿势

    参加大数据培训的正确姿势,说起大数据想必大家并不陌生!现如今,大数据技术已深入到人们生活的方方面面.我们无时无刻不获益于大数据为我们提供的便宜!作为我们生活中重要的技术支撑,很多互联网界的前辈,大佬, ...

  7. 20G数据告诉你,这才是吃鸡的正确姿势

    据某分析机构的研究表明,截止2018年4月,火爆全球的<绝地求生>收入已超10亿美元,其中有40%是中国的玩家.虽然国服还没遥遥无期,但作为游戏爱好者的小文也还是加入了吃鸡的大部队当中,作 ...

  8. oracle到pg不停机增量迁移,研究 Oracle 到 PostgreSQL 的数据迁移 – 以 pgloader 为例 – Phy 的博客...

    一点实习成果,过程中学了很多东西,就放出来吧,欢迎交流指正. pgloader 介绍 一个开源的工具,用来把数据从其他地方导入到 PostgreSQL 写入 PostgreSQL 的时候用的 COPY ...

  9. 聚焦东风汽车,解锁企业上云的正确姿势

    近年来,企业上云已经逐渐成为一种趋势,这不仅仅是企业业务发展的自身需求,也是国家政策层面的要求,早在2017年年底,信息化和软件服务业司司长谢少锋在介绍<深化"互联网+先进制造业&qu ...

最新文章

  1. numpy resize
  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板和static
  3. python学习:语句
  4. 无影云电脑居家办公最佳实践(AD域账号)
  5. POJ 2312 Battle City 优先队列+BFS
  6. 精益软件过程中七大浪费的应对之道
  7. Swift之 vm10虚拟机安装Mac OS X10.10教程
  8. 前端学习(688):断点调试
  9. network---written test
  10. 微信内测新功能:公众号们脖子一凉...
  11. mysql三高讲解(二)2.9: mysql示例数据库sakia database的使用
  12. Oracle在plsql上数据类型是nvarchar2(2)表的字段,查询时最后一位不显示
  13. 董明珠今晚开启抖音直播首秀;传苹果将去掉 iPhone 闪电接口;PyTorch 1.5 发布 | 极客头条...
  14. Velocity-模板引擎(代码生成等)
  15. iOS 8 自适应 Cell
  16. 自适应图片九宫格 css,高度自适应的九宫格效果
  17. [转载] 七龙珠第一部——第016话 寻找石头的功夫
  18. kindle自定义屏保之自定义字帖
  19. Sql Server——Sql Server中进行查询操作时提示“对象名无效”
  20. 教育类电影:《爆裂鼓手》

热门文章

  1. Kconfig文件结构(图文)简介
  2. FFMPEG分析比较细的文章
  3. HALCON示例程序board.hdev检测电路板焊锡有无程序剖析
  4. ipv4地址是几位二进制数_几张思维导图,让你清楚的知道ip地址怎么回事?
  5. wordpress html音乐,WordPress引用百度Ting音乐方法
  6. sunday java_Sunday算法:最快的字符串匹配算法
  7. matlab利用霍夫,基于matlab的霍夫变换
  8. 1-9-假期训练心得(dp+bfs)
  9. Python(21)_input用户交互
  10. 如何把两个查询语句合成一条 语句