喝茶聊方案:分库分表方案之数据迁移

标签: 喝茶 数据 | 发表时间:2021-03-25 15:02 | 作者:热茶
出处:https://juejin.cn/tag/%E6%9E%B6%E6%9E%84

迁移方案概览

分库分表需要从单库迁移到分片库,这就涉及到迁移工作.那怎么迁移?看了下有这几种迁移方式

  • 停机迁移
  • 利用数据库主从同步迁移
  • 开发写程序迁移

停机迁移

停机迁移简要说下,就是说提前准备一个流量少的时间点,提前发布好公告服务停机,然后把数据从单片库搬运到分片库后,再启动新的读写分片库的服务就完了.这里有几个缺点

  • 需要运维,开发和测试都在场,协同成本比较高
  • 影响用户使用
  • 不做额外处理的话,为了保证数据完整,需要所有服务停机后再做数据搬运,数据较多的情况下数据搬运有一定时间消耗
  • 如果读写分片服务的程序有问题,项目需要停服务回滚不说,新数据要还原回去,还要写程序从分片库同步回单片库.

其中比较要紧的是数据不方便还原.如果新数据有问题能立刻切回原数据就好了.

利用主从同步迁移

网上有方案说,成倍扩容,利用mysql主从同步来进行数据搬运.然后停服务切换.

双写程序迁移

双写就是说需要向单片库和分片库分别写一份数据,然后也需要找个流量少的时间点将流量切换到分片库, 这里涉及这几件事

双写(增量同步)

image.png 这里同步包括增量和全量同步

  • 利用双写程序,进行增量同步数据,这里能保证insert的新增数据单库和分片库一致

历史数据迁移与比对(全量同步)

image.png

  • 利用迁移程序进行全量迁移,将单库老数据迁移到分片数据库.

image.png

  • 利用比较程序,发现全量迁移过程中单片库数据的变动:比较程序扫描单片库数据和分片库数据差异. 如果有差异需要以单片库为准,把数据同步到分片库. 扫描可以是全量+增量扫描
  • 扫描发现的差异数据,利用迁移程序进行增量迁移,直到数据一致

切读流量

image.png

  • 迁移完成后,比对程序可以定时跑一定时间内的数据,用于发现异常导致的数据不一致情况,经过一定时间比对无问题后,找个流量少的时间段,将开关切换为读写都为分片库,另外再双写单片库(保证可回滚)

下线双写

image.png

  • 经过一段时间观察可以下线单库,注意下线相关无用代码.保证程序只读写分片库
  • 注意原单库binlog程序迁移
  • 下线双写相关代码

双写程序迁移细节

讲一下上面步骤中涉及的几个程序

  • 双写程序
  • 迁移程序
  • 比较程序
  • 切换开关

双写程序

双写可以通过aop实现,或者利用binlog同步来实现

迁移程序

  • 多线程迁移
  • 支持覆盖迁移(以单库为准)
  • 支持指定迁移时间范围,支持指定订单号迁移
  • 记录迁移过程中失败的单号(打印日志即可),支持失败单重新迁移
  • 用的中间件方式迁移不支持批量insert,就只能单个insert.

比较程序注意

因为双写程序期间,原单库数据可能变动,所以需要有比较程序来发现不同。
比较程序注意

  • 以单库为准,注意update变动外,也要注意delete变动,或者少迁移数据的情况。比如说同一单子,单库单子关联4件商品,但是分片库同步时候出问题,没有这个单子或单子没关关联任何商品,或单子只关联3件商品都是有问题的
  • 注意数据库默认生成的日期,不能使用全等于,可以比较误差3秒内
  • 字段过多导致比较慢可以只比较业务上会变动的数据。这个需要分析业务字段,需要对业务熟悉才可以

切换开关

可以参考以下来做热切换开关

单库,分片库读写开关
第一位标识读:单库读 0 分片库读 1
第二位标识写:单库写 0 单库分片库写 1 分片库写 2
比如:
默认:单库读,单库写 -> 0,0
上分片库双写:单库读 ,单库和分片库写-> 0,1
读流量切分片库:分片库读, 单库和分片库写 -> 1,1
下掉单库写:分片库读 ,分片库写 ->1,2


双写程序迁移优缺点

优点:
迁移流程由开发自己操控,可控性强.
发现不同步数据可以自行再次同步
不需要dba同时配合
缺点:
自行编码有开发和测试成本

最后

欢迎评论区留言拍砖/纠错/建议/提问/等等

相关 [喝茶 数据] 推荐:

喝茶聊方案:分库分表方案之数据迁移

- - 掘金 架构
分库分表需要从单库迁移到分片库,这就涉及到迁移工作.那怎么迁移?看了下有这几种迁移方式. 停机迁移简要说下,就是说提前准备一个流量少的时间点,提前发布好公告服务停机,然后把数据从单片库搬运到分片库后,再启动新的读写分片库的服务就完了.这里有几个缺点. 需要运维,开发和测试都在场,协同成本比较高. 不做额外处理的话,为了保证数据完整,需要所有服务停机后再做数据搬运,数据较多的情况下数据搬运有一定时间消耗.

被喝茶

- Chen Ze - 吴虹飞 颠倒众生的糊涂
今天在今日美术馆正在采访陈丹青. 我说,请等等,请给我一点时间和他沟通. 我说,麻烦你找一个帅一点的人来跟我说话. 对方在电话里笑;我特别想认识你. 我走时,陈丹青用力拥抱了一下我. 我有点害羞起来,歪歪扭扭罗圈腿往外走. 他一直送到门口,在后面大笑:走路这么怪. 我递上杂志名片,他们惊讶说,你不是唱歌的吗.

爱艾未未 -Love Ai Weiwei: 阿飞姑娘:被喝茶

- 立里 - loveaiww.blogspot.com
今天在今日美术馆正在采访陈丹青. 我说,请等等,请给我一点时间和他沟通. 我说,麻烦你找一个帅一点的人来跟我说话. 对方在电话里笑;我特别想认识你. 我走时,陈丹青用力拥抱了一下我. 我有点害羞起来,歪歪扭扭罗圈腿往外走. 他一直送到门口,在后面大笑:走路这么怪. 我递上杂志名片,他们惊讶说,你不是唱歌的吗.

数据仓库

- Ran - Linux@SOHU
翻译:马少兵、曾怀东、朱翊然、林业. 尽管服务器存储、处理能力得到有效的提高,以及服务器价格的降低,让人们能够负担起大量的服务器,但是商业软件应用和监控工具快速的增加,还是使得人们被大量的数据所困扰. 在数据仓库领域中的许多系统管理员、应用开发者,以及初级数据库管理员发现,他们正在处理“海量数据”-不管你准备与否-都会有好多不熟悉的术语,概念或工具.

数据抽取

- - 数据库 - ITeye博客
转自: http://wiki.mbalib.com/wiki/%E6%95%B0%E6%8D%AE%E6%8A%BD%E5%8F%96#.   数据抽取是指从源数据源系统抽取目的数据源系统需要的. 实际应用中,数据源较多采用的是. 数据迁移或数据复制,它将数据源中的表或视图的数据原封不动的从数 据库中抽取出来,并转换成自己的ETL 工具可以识别的格式.

数据库sharding

- - 数据库 - ITeye博客
当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确地知道需要访问的数据表以及查询参数,借助这些信息可以直接定位到目标shard上,而不必像框架那样需要对SQL进行解析然后再依据配置的规则进行路由. 另一个优势是不会受ORM框架的制约.

数据脱敏

- - IT瘾-bigdata
作者|李呈祥,其中部分内容由十一城补充. 数据脱敏(Data Masking),又称数据漂白、数据去隐私化或数据变形. 百度百科对数据脱敏的定义为:指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据 的可靠保护. 这样,就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集.

数据分析之如何用数据?

- - 互联网分析沙龙
光知道怎么看数据,还是不成,你得熟悉这些数据拿到手上之后怎么去用它,怎么让数据显示出来它本身的威力来. 第一个部分,是看历史数据,发现规律. 以社区中的活动和电商中的促销为例,这些都是常见的活动,活动做得好的话有意想不到的效果. 在做这样的活动,最好是拿到前一个月或者两个月的历史数据. 对电商来说,从这里面要去分析各个品类的销售情况,那个品类销量最大,那个品类销量最小,每月或者每周的平均增长率和符合增长率是多少.

excel数据导入mysql数据库

- - 互联网 - ITeye博客
1、excel另存为txt.       选中将要导出的数据列,然后另存为选择其它格式=>文本文件(制表符分割). E:\项目\fblike\game_code_san.txt. 2、txt导入到mysql数据库. load data infile 'E:\\项目\\fblike\\game_code_san.txt' into table game_code_san(code).

数据批量导入Oracle数据库

- - Oracle - 数据库 - ITeye博客
今天学习了一个新的东西,觉得还挺有意思的,也是从别出COPY 的,. SQL*LOADER是大型数据. 仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL). 现在,我们抛开其理论不谈,用实例来使. 您快速掌握SQL*LOADER的使用方法.   首先,我们认识一下SQL*LOADER.