mysql之DTS的那些事
最近才考虑数据库迁移,想起了之前做DTS踩过的那些坑。
基于数据库迁移,比如从源A库迁移到源B库,包括但不限于数据库上云。
数据库迁移方案有两种场景:
(1)、停机迁移方案
这种方案是允许停服的场景,通过mysqldump就搞定了,就不说了。
(2)、在线不停机方案
这种场景方案中,我们采用先在线整库迁移,然后在通过binlog在线DTS对齐数据。
步骤如下:
1、源数据库采用ROW模式,开启binlog权限
2、需要一个源库的全局schema查询用户,获取源数据库的schema同步到目标库
3、选取某个时间点的BINLOG OFFSET做标记,然后通过JDBC同步整个库表数据到目标库,直至完毕。
4、通过netty服务单线程读取源库BINLOG数据,从上一步标记的offset位置开始读取,读入kafka。
5、多线程消费kafka数据到目标库,直至同步到最新的binlog数据,迁移完成。
第二种方案中遇到的那些坑:
1、最好选取源库的一个只读库做为同步数据的源库,这样不影响源库线上业务
2、多线程消费kafka时,容易出现binlog顺序错乱的问题,目前采用按表写partition的方式,指定partitions消费,避免顺序错乱,但带来的新问题就是kafka的各partitions数据倾斜问题。
3、目前解析binlog同步数据时,DDL和DML操作没有特殊分别处理,如果数据量比较 大时,DDL很容易超时,导致此DDL之后同步的binlog都有问题,需要重新同步
4、同步binlog时,指定时间窗口大小,记录同步时的binlog位置到zk上,如果需要重新同步数据,可能会导致一部分binlog重复同步。如果窗口过小,zk也扛不住
5、遇到没有主键或唯一性限制的表,重复同步,会导致数据重复
6、若遇到同步blob相关类型时,若二进制数据过大,可能导致同步失败
7、同步服务的部署问题,源库和目标库都需要开公网IP。
8、同步服务的效率和源库、目标库的网络带宽,数据库配置息息相关
最新文章
- python安装、模块安装
- easyui Datagrid查询报错Uncaught TypeError:Cannot read property 'length' of undefined
- [转]Part1: Understanding !PTE , Part 1: Let’s get physical
- 【C#】让DataGridView输入中实时更新数据源中的计算列
- bzoj2219: 数论之神
- Python基础、collections补充
- Java写的爬虫的基本程序
- ofbiz进击 第一节。 新建自己的webapp项目
- node.js 安装、图文详解
- Android中的多线程
- CSDN首页>; 移动开发 直接拿来用!最火的Android开源项目(完结篇)
- java 引用类型及作用
- logstash multiline 把文件处理为单个 event
- 对REST的一些理解
- IntelliJ IDEA光标变粗 backspace无法删除内容解决方法
- 三天STL与pbds(平板电视)
- python基础语法及知识点总结
- Python有趣时刻,这些代码让你大呼";卧槽,怎么会这样";
- linux命令学习之:ifup/ifdown
- sql分组排序取top