暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

金仓KingbaseFlysync 高可用功能-冲突处理功能配置与说明

原创 KFS补给站 2024-11-04
310

关键字:

KingbaseFlysync、KFS、同步程序、replicator、高可用、flysync.ini、冲突处理、冲突类型、双写

1.名词定义

  • 双写:在同步软件进行数据同步的同时,有其他业务在向目标端数据库进行写操作
  • before image:中间数据文件中在记录Update或者Delete语句时的old tuple的值,即用来作为WHERE条件的值
    冲突处理:KFS在进行数据同步时,当同步源数据库表数据和目标数据库中的数据不一致时,源端数据库在不一致的记录上所做的 DML 操作同步到目标数据库,KFS目标端在执行同步操作时,可能会执行失败。在数据同步失败的情况下,根据相应的处理策略对数据同步操作 做进一步的处理,以完成本次数据同步的过程,我们称之为数据冲突处理

2.使用场景介绍

KingbaseFlySync在多个源端往同一目标端进行数据汇聚等涉及双写的同步场景中,不可避免的存在着双写造成的数据冲突,进而影响业务连续性和数据准确性。针对这一实际业务场景,KingbaseFlySync能够对目标端入库的冲突进行识别并根据配置完成冲突处理,从而保证实时同步业务的连续性和源端、目标端数据库数据的一致性。

3.功能描述

KingbaseFlySync对于双写场景下的冲突处理,可以分为冲突识别和冲突处理两部分:

  • 冲突识别能力分为主动的冲突检测和被动的冲突捕获:
    A、主动的冲突检测通过中间日志文件(KUFL)中记录的指定列的数据和目标端数据库中对应列的数据进行对比,来发现数据的不一致,从而检测出冲突的产生
    B、被动冲突捕获主要是依赖于错误处理能力,当数据入库时发生异常,将异常进行捕获,若符合预先配置好的规则,则将异常识别为冲突并进行处理
  • 冲突处理可以对以下的五种冲突场景进行处理。
    1.Insert时的唯一约束冲突
    2.Update时因数据不存在导致的冲突
    3.Update时,数据存在,但是before image的一列或多列和数据库当前值不一致的冲突
    4.Delete时因数据不存在导致的冲突
    5.Delete时,数据存在,但是before image的一列或多列和数据库当前值不一致的冲突

4.配置使用方式介绍

  • 源端配置过滤器
    flysync.ini中的配置
property = replicator.extractor.dbms.beforeColsFile=/home/hes/beforeColsRule.json
property = replicator.extractor.dbms.getBeforeCols=true
json配置:
[hes@h0-167 ~]$ cat beforeColsRule.json
{
  			"mytest.table_test1":"id ",
  			"mytest.table_test2":"id,A"  #用来进行比对的列,可以写多个
}

注意:这个配置文件中不能使用通配符,每个表必须单独配置(格式是:模式名、表名、列名),且大小写必须和数据库中一致

  • 目标端配置过滤器
    flysync.ini中的配置:
property = replicator.applier.dbms.conflictResolve=true
property = replicator.applier.dbms.beforeColsFile=/home/hes/conflictResolveRule.json
property = replicator.applier.dbms.optimizeRowEvents=false
conflictResolveRule.json配置:
[hes@wjg161 ~]$ cat conflictResolveRule.json
{
 			"DEFAULT": "DISCARD",
  			"*test.tabl*": #模式名.表名 可以有通配符
  			{
    			"DETECTACTION":"UPDATE,DELETE",
				"COMPARECOLS":"id",
    			"RESOLVERULE":
   				 {
     				 "INSERTROWEXISTS":"USEMINEQ:id", 
"UPDATEROWEXISTS":"USEMINEQ: id",
      				"UPDATEROWMISSING":"DISCARD ",
      				"DELETEROWEXISTS":"DISCARD",
      				"DELETEROWMISSING":"DISCARD"
    				}
  				}
}

相关配置项解释如下:

  • DEFAULT: 默认的处理规则,当各自单独的rule无法生效时,使用默认规则进行处理,只能配置DISCARD,IGNORE,OVERWRITE中的规则
  • DETECTACTION:要进行冲突检测的DML类型,可填UPDATE、DELELTE或者2者都填
  • COMPARECOLS:要进行比较的列,默认包含主键,不需手动填写主键。对于用以比较的列,类型仅支持整型、浮点型、时间类型。
  • RESOLVERULE:对冲突的处理规则,
    A、冲突分为5种(具体含义见功能描述中介绍的5种冲突场景)
  • INSERTROWEXISTS
  • UPDATEROWEXISTS
  • UPDATEROWMISSING
  • DELETEROWEXISTS
  • DELETEROWMISSING
    B、冲突处理可以执行的处理策略。
  • USEMAX:col:如果col在中间文件中的值大于目标库的值,则执行对应的操作:
    1)INSERTROWEXISTS:以中间文件的值为准,将插入变为更新。
    2)UPDATEROWEXISTS:以中间文件中的值为准更新
  • USEMAXEQ:col:大于等于,满足条件后的处理方式同USEMAX:col
  • USEMIN:col:小于,满足条件后的处理方式同USEMAX:col
  • USEMINEQ :col:小于等于,满足条件后的处理方式同USEMAX:col
  • DISCARD:忽略,并将冲突数据记录
  • OVERWRITE:以中间文件中的数据为准进行重写
    1)INSERTROWEXISTS配置重写,会将INSERT改为UPDATE语句进行重写
    2)UPDATEROWMISSING/DELETEROWMISSING冲突,无法重写,直接IGNORE
  • IGNORE:忽略跳过
    C、每种冲突支持的策略如下:
  • INSERTROWEXISTS 支持全部规则
  • UPDATEROWEXISTS 支持全部规则
  • UPDATEROWMISSING:只支持DISCARD,IGNORE,OVERWRITE会直接转变成IGNORE规则
  • DELETEROWMISSING 只支持DISCARD,IGNORE,OVERWRITE会直接转变成IGNORE规则
  • DELETEROWEXISTS 只支持DISCARD,IGNORE,OVERWRITE

5.示例

5.1源端配置

flysync.ini配置文件示例:

[defaults]
install-directory = /home/oracle/slavenode
profile-script = ~/.bash_profile
rmi-port = 11000
	
[servicename]
………
#冲突处理
property = replicator.extractor.dbms.beforeColsFile=/home/oracle/slavenode/filters-config/beforeColsRule.json
property = replicator.extractor.dbms.getBeforeCols=true
beforeColsRule.json配置文件示例:
[oracle@oracle30 ~]$ cat /home/oracle/slavenode/filters-config/beforeColsRule.json
{
        "TPCC.TESTA":"ID"
}

源端数据库表定义:
图片.png

目标端配置

flysync.ini配置文件示例:

[defaults]
install-directory = /home/hes/slavenode
profile-script = ~/.bash_profile
rmi-port = 11000
	
[servicename]
………
#冲突处理
property=replicator.applier.dbms.optimizeRowEvents=false
property = replicator.applier.dbms.conflictResolve=true
property = replicator.applier.dbms.beforeColsFile=/home/hes/slavenode/filters-config/conflictResolveRule.json

conflictResolveRule.json配置文件示例:
	[hes@v8r6 ~]$ cat /home/hes/slavenode/filters-config/conflictResolveRule.json
{
  		"DEFAULT": "OVERWRITE",
  		"public.testa":
 		 {
    		"DETECTACTION":"UPDATE,DELETE",
    		"COMPARECOLS":"id",
    		"RESOLVERULE":
   		 	{
      			"INSERTROWEXISTS":"USEMINEQ:id",
      			"UPDATEROWEXISTS":"USEMINEQ:id",
      			"UPDATEROWMISSING":"DISCARD",
      			"DELETEROWEXISTS":"DISCARD",
      			"DELETEROWMISSING":"DISCARD"
   		 	}
 	 	}
}

源端数据库表定义:
图片.png

冲突处理效果

在此示例中,目标端已经存在主键为11的数据(11,11),此时源端再次插入主键为11的数据(11,123)。
目标端入库时KFS会判断存在主键冲突,然后根据冲突处理中"INSERTROWEXISTS":"USEMINEQ:id"配置的规则,将INSERT操作变更为UPDATE操作,所以目标端最终数据会更新为(11,123)。
KFS处理冲突完成后,会继续解析后续的事务,就保证了实时同步业务的连续性,并保障了源端、目标端数据库数据的一致性。

源端插入数据:
图片.png
图片.png

目标端数据库数据更新:

图片.png
图片.png

最后修改时间:2024-11-04 18:24:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论