数据库同步的一些想法

数据同步的关键在于捕获数据变化,提取数据,网络传输至接收落地。一般的,数据库内部机制以集群的方式,通过复制进行同步,当然也有的提供更高级的服务。下面以 Oracle 和 MySQL 为例,说明数据库内部有哪些机制可以发现数据变化。

捕获数据变化

  • 触发器,这是最简单直接的方式,优点是编程简单,缺点是具有一定的侵入性,此外还要注意 MySQL 5.7 之前一个表不支持多个触发器;

  • Oracle Streams - 一个灵活的复制工具,它能捕获 DML 和 DDL 操作,通过网络传输变更,原理是基于 redo log 日志,分析出变更的数据提供给捕获进程,Oracle 11g JDBC 就提供了数据库变更捕获的 API 支持;

  • Oracle Materialized View - 物化视图,也可用于复制数据,Oracle 通过在对主表进行更改后刷新物化视图的数据,刷新方法有增量(快速刷新)和完全,也可按需或定期刷新;

  • MySQL binlog - 记录了所有 DML 和 DDL 语句,主要用于主从复制和数据恢复。基于日志分析、挖掘数据变化,可减少系统开销,不具有侵入性。

利用 Java 实现思路

有时候数据库提供的同步满足不了需求,一些场景需要使用应用程序来同步数据,比如信息整合,网间数据交换,不只是数据库同步,部分也有文件同步的需求。

基于触发器的实现

通常将表的增删改记录到一个中间表中,应用程序定时扫描中间表,抽取数据。

基于日志的实现

难点在于如何通过应用程序发现数据变化和日志解析。

  • 对于 MySQL 它的协议和日志格式都是开源的,可通过伪装成从节点,与主节点通信来获取变化数据的日志,解析还原成 SQL 再次执行,达到复制的目的;
  • 对于 Oracle,虽然高版本已经提供了 API,但为了通用性,还是得实现日志的解析,只不过它的日志说明文档有限,需要大量的测试寻找规律,此外,数据变化也可通过检查 checkpoint 来得知。

文件同步

文件变化的监控,无非就是大小和修改时间的比较,这个和平台关联比较大,比如文件拷贝,Linux 下文件大小一直变化,而 Windows 下则直接是实际大小。还有多进程并行读写文件的问题,Windows 文件系统默认进程独占文件,同时只能有一个进程读写,而 Linux 下的文件默认不是强制锁定,对强制锁定也支持有限,况且用户使用的 Linux 版本也比较多样化,也只能在应用层面进行控制。

小结

整体来讲,实现一个同步软件,技术上难度不大,一些细节可能要花费时间琢磨,更多的是关注性能和可扩展性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章