结构设计
介绍一种跨数据库的数据同步技术,在很多离线应用里面会用到。
先看看数据库er图:
sync_trace
记录当前数据库逻辑表数据的增、删、改操作。
table_name
字符串,逻辑表名称
record_id
整数,逻辑表数据记录主键值,在同步设计里面,每个支持同步的数据表必须有唯一的主键字段,并且为Integer类型。
insert_time
时间,数据记录添加时间
update_time
时间,数据记录更新时间
delete_time
时间,数据记录删除时间
table_name和record_id构成联合主键保证唯一性。
sync_stamp
记录最近一次数据同步的时间。
uuid
字符串,每一个同步主机的数据库uuid
sync_time
时间,最近一次同步时间
sync_conf
记录当前同步数据库的配置。
uuid
UUID, 当前数据库唯一标识。
min
整数,当前数据库逻辑表主键最小值。
max
整数,当前数据库逻辑表主键最大值。
逻辑表
被同步的数据表称为逻辑表用下面的结构:
id
逻辑表主键,一般使用整数或长整数,这个值对应的就是sync_trace里面的record_id。
c1, c2, c3 …
逻辑表的其他数据字段。
同步算法
逻辑表ID生成
逻辑表的主键ID通过sync_conf的配置来生成,而不使用数据库自带的sequence,数据库自带的sequence可能导致两个支持同步的数据库之间生成的ID有冲突,同步之后会导致数据混乱。
sync_conf的[min, max]在不同的数据库上配置不同的并且不交叠的范围,比如A配置为[1, 100000000], B配置为[100000001, 20000000],这样所有A上面的逻辑表ID为1到100000000,B为100000001到20000000,A和B生成的ID永远不冲突。
使用这种ID生成算法相对使用UUID的好处是可以使用16位、32位或者64位的整数作为逻辑表ID,这样多个逻辑表之间关联查询效率会比较高。
假设逻辑表为tb_xxx,取出tb_xxx中在[min, max]之间的ID最大值+1就是新ID,使用下面的sql语句生成ID:
select max(id)+1 from tb_xxx where id >= @min and id < @max
|
同步流程
考虑src和dst的数据库。
<同步删除记录>子过程
<同步更新记录>子过程
<同步添加记录>子过程
同步删除、更新、添加子过程顺序不能颠倒,完成三个子过程后,将src和dst呼唤再执行一次上面的操作,完成整个数据同步。
在实际使用中为了提高效率,可以记录src在dst中的最近一次同步时间,下次同步操作时,只需要从这个时间点开始进行同步,而忽略更早的sync_trace的记录,就是所谓的增量同步。
同步过程没有涉及到具体的数据库功能,所以只要逻辑表的字段不使用数据库特有的数据类型,并且有数据库驱动支持,可以在不同类型数据库之间实现同步。
阅读(1731) | 评论(0) | 转发(0) |