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成功,然后才能重建。