ER复制的原理和机制介绍

ER数据复制的简单示意如下,还有人画过更复杂的一个图,我就不在这里展示了,意思到了即可。

ER复制的原理和机制介绍

ER复制的数据流向如下,虽然枯燥,请学习ER的同学务必牢记:

日志抓取组件就是snoopy组件,用于读取逻辑日志并把逻辑日志记录放入grouper组件。

grouper组件用于估算用于复制的日志记录,并把这些日志用于分组放到消息里面来---按照事务原始的顺序。

grouper组件把分组好的消息放入发送队列。在特定的情况下,发送队列的转储这些消息到磁盘上用于临时存储。

发送队列通过ER的网络把这些消息传输到ER的目标端;

复制的消息被放入ER目标端的接受队列中;

数据同步组件在目标端应用这些事务,如果有必要就会执行冲突解决策略;

日志被成功应用的消息发送给ACK队列;

ACK的消息被发送给源端。

 

ER复制的内容是什么?

1、ER复制的内容是row image,来源于逻辑日志,但是ER复制一定不是逻辑日志,请各位同学务必记住。在这点上和RSS|HDR都是不一样的。

2、row image包含了在源端的操作涉及的数据行以及在这些数据行的DML操作是什么。句话需要深刻理解!!!为什么呢?

比如源端有100条数据,目标端有200掉数据;在源端执行delete from tabname;在目标端应该怎么呢?其实在目标端只删除在源端删除的100行。换言之,如果源端的100行,根本就不存在于目标端的200行中,则目标端的200行数据是不会被删除的。

发送队列:

ER在内存中存储了需要传送到目标端的复制数据。如果复制队列满了,ER就需要把发送队列的交易记录转储到dbspaces上,把发送队列的数据行转储到sbspaces上。

接受队列:

ER会存储复制数据在内存中直到目标端反馈回ACK的消息。如果接受队列被一个大事务填满了,ER就会转储接受队列的事务头和复制记录到dbspaces上,转储接受队列的行数据到sbspace上。

ER存储数据在一个源端的可回收的发送队列里面,目标端应用或拒绝应用的时候会发送ACK消息出来。

在复制的过程中,如果目标端不可用,则源端的事务会继续执行。等目标端恢复之后,源端会继续从在目标端应用成功的日志位置开始重新发送事务。

 

注意:

只有在目标端应用成功或应用失败之后,目标端才会返回ACK消息的。

如果你想重建复制相关项,重建的名称和原来的名称一致,你必须要先在所有的节点上执行执行cdr check queue成功,然后才能重建。