Chinaunix首页 | 论坛 | 博客
  • 博客访问: 85913
  • 博文数量: 5
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 180
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-29 11:47
文章分类
文章存档

2010年(5)

我的朋友

分类: 数据库开发技术

2010-01-25 12:43:53

结构设计

介绍一种跨数据库的数据同步技术,在很多离线应用里面会用到。
先看看数据库er图:

sync_trace

 

记录当前数据库逻辑表数据的增、删、改操作。
table_name
字符串,逻辑表名称
record_id
整数,逻辑表数据记录主键值,在同步设计里面,每个支持同步的数据表必须有唯一的主键字段,并且为Integer类型。
insert_time
时间,数据记录添加时间
update_time
时间,数据记录更新时间
delete_time
时间,数据记录删除时间
table_namerecord_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上面的逻辑表ID1100000000B10000000120000000AB生成的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

 

同步流程

考虑srcdst的数据库。

<同步删除记录>子过程

<同步更新记录>子过程

<同步添加记录>子过程

同步删除、更新、添加子过程顺序不能颠倒,完成三个子过程后,将srcdst呼唤再执行一次上面的操作,完成整个数据同步。
 
在实际使用中为了提高效率,可以记录srcdst中的最近一次同步时间,下次同步操作时,只需要从这个时间点开始进行同步,而忽略更早的sync_trace的记录,就是所谓的增量同步。
 
同步过程没有涉及到具体的数据库功能,所以只要逻辑表的字段不使用数据库特有的数据类型,并且有数据库驱动支持,可以在不同类型数据库之间实现同步。

阅读(1682) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~