数据库同步的现状
前言
我一直对数据库之间的实时同步有着浓厚的兴趣,也想自己构筑一个数据库同步系统。主要原因是一直觉得随着系统的发展,系统中的数据难免需要异构。也正是Martin在《Nosql 精粹》中说的,如何选择数据库,取决于你想要如何查询数据。下文我们以Source代指源数据库,Sink代指目标数据库。
一个理想的数据库同步系统,可以做到对任何表格(无主键限制)对应数据同步,一条不多,一条不少。但正如我在 https://www.jianshu.com/p/7defaa460543 文章中提到的,针对无主键,无业务约束的数据,我有一个悲伤的结论,分布式场景下,针对无主键,无业务约束的数据,谁也难言绝对的端到端一次。
在实际使用中,想要做到这一点,除非将Source和Sink进行全量对比,在有大数据量的情况下,很难做到实时同步。比较可行的方案是先用至少一次
的语义同步数据到Sink
,然后再定期对比数据,修正数据。类似大数据处理中的lamda架构。
我现在想构筑的是一个,在有主键,或者至少有联合主键,业务约束的场景下(或者数据库底层有ID),能够做到一条不多,一条不少的系统。
开源工具简述
这些天了解到,开源的工具能用的有: DataX,Flume等,我还没有仔细分析,我现在只仔细看了看DataX,后面对其他组件有认识理解再刷新。
仅仅针对DataX而言,至少在商用生产环境,该组件在高可用离开箱即用还有一些距离,这方面做的比较好的开源软件有,Pulsar,Flink等,做到了宕机可以自愈, 单进程宕机不影响集群工作。聊聊dataX的集群部署方案,且不论工作进程宕机后,worker之间能否互相接力。一旦datax_admin故障,就只能人工处理了。
我觉得,开源组件距离生产环境高可用,还是有一些距离.
理想的整个流程分为增量同步和全量同步
数据库全量同步流程概述
两种常见的方式:
- 导入MysqlDump文件
- 全盘扫描表的方式
Mysql-全量Dump
将Mysql的Dump文件导入工具
Mysql-全量扫描
全量扫描Mysql中的数据
数据库增量同步流程概述
参考 https://blog.csdn.net/mochou111/article/details/80995156
四种方式
- 全量对比得出增量数据
- 基于日志文件读取增量数据
- 基于建触发器获取增量数据
- 基于时间字段切分数据