关键字:
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"
}
源端数据库表定义:

目标端配置
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"
}
}
}
源端数据库表定义:

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


目标端数据库数据更新:


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




