数据库实时同步和复制

jopen 8年前
 

谈到这个概念的时候,最容易想到的就是数据库本身的异地灾备,通过数据库的实时同步和复制,在A地出现机房故障和问题的时候可以平滑快速的迁移到B地。虽然这种远程数据复制和同步存在一定的延迟,但是基本已经可以满足业务连续性的需求。

谈到数据库的实时复制,一般会谈到一个重要产品,即Oracle公司的GoldenGate,该软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步、双活。GoldenGate可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制。

GoldenGate是一种基于软件的数据复制方式,它从数据库的日志解析数据的变化(数据量只有日志的四分之一左右)。该将数据变化转化为自己的格式,直接通过TCP/IP网络传输,无需依赖于数据库自身的传递方式,而且可以通过高达9:1的压缩率对数据进行压缩,可以大大降低带宽需求。在目标端,GoldenGate TDM可以通过交易重组,分批加载等技术手段大大加快数据投递的速度和效率,降低目标系统的资源占用,可以在亚秒级实现大量数据的复制。

在任何实时数据同步和复制中,需要考虑如下几个关键问题:

事务一致性:在复制目标端需要按照源端相同的事务环境进行提交,确保目标上数据一致性。

检查点机制:在抽取和负责时都需要记录检查点位置,确保网络故障或GG本身故障下仍然能够完整复制。

可靠数据传输:需要保证数据传输的完整性,请求和应答,同时提供数据加密和传输过程中的压缩。

对于数据实时同步和复制工具,其核心是需要基于日志来实现,这一方面是可以实现准实时的数据同步,一方面是基于日志实现不会要求数据库本身在设计和实现中带来任何额外的约束。我们也看到有些基于数据库表设计增加触发器或存储过程来实现的数据库复制,这些本身都是损耗了性能和增加了复杂度。

对于数据库的实时同步和复制,阿里巴巴专门有一个开源项目,即otter来实现分布式数据库的同步复制,其核心思想仍然是通过获取数据库的增量数据日志,来进行准实时的同步复制。因此otter本身又依赖于另外一个开源项目即canal,该项目重点则是获取增量数据库同步日志信息。

当前otter的重点是实现mysql间的数据库同步复制,其实这个在前面我一些文档里面谈到基于mysql数据库的dual-master架构的时候已经谈到过,基本即利用的类似技术来实现两个mysql数据库间的双向同步数据库复制。要注意这个双向本身指既可以A->B,也可以从 B->A,在某个时间节点本身是单向的。

对于otter的功能和支持的数据库比GoldenGate要少得多,除了支持mysql数据库间的实时数据同步和复制外,还支持 mysql->oracle的单向数据同步和复制。但是不支持oracle->mysql的数据同步和复制。但是otter本身提供了一个很好的开源框架,我们可以基于该框架扩展对其它数据库的支持。

在扩展的时候有一个重点,即数据库本身是否提供了增量数据日志,对于mysql数据库容易实现其主要原因还是mysql数据库提供了相当方便的 binlog日志功能,这些log日志本身就很方面的转换为朝目标端执行的sql语句。而对于常见的数据库,在网上搜索下,可以看到一些做法。

对于oracle,重点是监控oracle的redo log,即在线重做日志和归档日志。对于一些商用产品可以直接监控到redo log,仅仅依赖于该文件而不耗费其它资源。而如果我们来实现,则常用的方法还是基于oracle logminer来对redo log进行解析。虽然性能上稍微有差异,但是基本可以达到准实时的数据库解析和同步,可参考:

http://www.cnblogs.com/qiangqiang/archive/2010/10/21/1857429.html

http://blog.itpub.net/90618/viewspace-660550/

对于Sql Server数据库的日志分析,首先可以看到网上有一个专门的商业工具,即log explorer,这个工具可以用来做sql server数据库的日志解析和分析。其中对于事务,检查点等都有详细的记录。其次可以使用fn_dblog解析Sql Server的数据库日志,网上有专门的方法在这里不展开,现在还没有具体测试过,但是整个方法思路是没有问题的。

而对于sql server 之间的数据库同步和复制,则sql server本身就提供有方便的基于快照或基于事务的数据库同步复制工具,只需要经过简单的配置即可以实现。正因为这个原因,我们也看到,对于sql server数据库本身在日志解析和分析方面开放出来的能力本身是相当较弱的。

随着国家对自主研发数据库和中间件技术的大力支持,当前还没一个能够实现国产数据库如人大金仓,达梦数据库同国外的oracle ,sql server数据库间的数据实时同步和复制工具。对于这类工具是可以基于开源otter产品的思路来进行定制开发和实现的,但是前提还是各个数据库厂家需要开放相应的日志采集和处理能力。