2、数据单向同步:
Otter的双向同步主要包含两种:双向同步、双A同步。这两个概念在otter的页面上是通过是否有配置主站点来区分的。有配置主站点的话就是双A同步,否则是双向同步。双A同步会有数据回环的问题,双向同步不会。
目前稽核系统使用的是双向同步,主要是使用场景是表。对于西咸集群缺少且不能进行采集的数据源,通过亦庄集群进行采集到亦庄HDFS中,然后采集结束后,再新增一个文件转移任务到接口机,文件转移完毕后调用执行在西咸集群上的quickjob,对接口机上文件的采集入库到西咸的HDFS。首先通过Otter把稽核系统的的quickjob配置信息由28MySQL数据库同步至西咸的134MySQL数据库中。在调用西咸侧的quickjob时,实际是通过程序去修改28MySQL数据库的quickjob的状态(状态变为0),然后把状态同步至134MySQL数据库中(状态变为0),去触发quickjob的执行(状态由0变为3),在执行完毕后,程序会修改134MySQL数据库quickjob的状态为执行完毕(状态由3变为1),然后把执行完毕的状态同步回28MySQL数据库中,方便下次再次在28MySQL去触发该quickjob的执行。
若表不使用双向同步,28MySQL库的quickjob的状态变为0后,quickjob在134MySQL数据库中后续的状态变化都不再接收,始终为0,当下一次在28MySQL再次触发时,状态还是修改为0,对于28MySQL库中这一条数据的变化是状态由0变为0,实际是没有变化,因此就不会同步这条数据到134MySQL数据库中,就无法调用西咸集群中的quickjob的执行。
三、Otter原理探索 原理描述:图1 Otter原理概览
Otter主要是基于开源产品canal,通过canal获取数据库的binlog日志的数据库操作信息。
管理系统架构:manager+node,node节点中通过S(select)与canal接入,然后进行ETC(extract/transform/load)数据提取转换和加载,node节点将同步状态反馈到manager上,manager运行时推送同步到node节点。基于Zookeeper,解决分布式调度问题,允许多个node节点之间协同工作。
Canal原理:图2 Canal原理示意图
Canal基于数据库增量日志解析以及MySQL主从复制原理。
Master将改变记录到二进制日志(binlog)中。
Canal模拟MySQL Slave的交互协议,伪装自己为MySQL Slave,向MySQL Master发送dump协议。
MySQL Master收到dump请求,开始推送binlog给Slave(canal)。
Canal解析binlog对象(原始为byte流), 拷贝到自己的中继日志(relay log)。
Slave重做relay log中的事件,将改变反应到自己的数据库中,实现数据的同步。
四、Otter数据入库算法数据合并: 1.insert + insert -> insert ( 数据迁移+数据增量场景) 2.insert + update -> insert (update 字段合并到insert) 3.insert + delete -> delete 4.update + insert -> insert ( 数据迁移+数据增量场景) 5.update + update -> update 6.update + delete -> delete 7.delete + insert -> insert 8.delete + update -> update ( 数据迁移+数据增量场景) 9.delete + delete -> delete insert/update 行记录,执行merge sql,解决重复数据执行 合并算法执行后,单pk主键只有一条记录,减少并行load算法的复杂性(比如batch合并,并行/串行等处理) 数据入库算法: 入库算法采取了按pk hash并行载入+batch合并的优化 1 、打散原始数据库事务,预处理数据,合并insert/update/delete数据(参见合并算法),然后按照table +pk进行并行(相同table的数据,先执行delete,后执行insert/update,串行保证,解决唯一性约束数据变更问题),相同table的sql会进行batch合并处理。 2 、提供table权重定义,根据权重定义不同支持"业务上类事务功能",并行中同时有串行权重控制。