一、UTS服务简介
UTS时间戳服务器是一款基于国家标准时间源,利用PKI、数字签名技术来检测完善数据库同步行为时间可信性的安全产品,广泛应用于“互联网+金融”领域。
时间戳(timestamp)是SqlServer特有的一个字段类型,当表的行数据新增或修改后,该字段会自动更新为最新的数值。
SqlServer的timestamp存储的其实是一个int64,并不是时间或者日期类型(比如mysql的timestamp)。
凡是数据新增和修改操作能引起数值变大的字段,我们都可以称之为时间戳字段,包括bigint,number,datetime,binary(8)等。
二、工作原理
我们通过比对源和目标表中,所有时间戳字段的差异,就可以判断出源头发生了何种数据操作(DML)。从而通过UTS时间戳机制自动进行数据库同步完善工作。
例如:我们现在有一个源表:
主键 name(varchar(20)) | 时间戳(bigint) |
Hello | 1001 |
World | 1003 |
①源表数据库同步之后,得到目标表一:
主键 name(varchar(20)) | 时间戳(bigint) |
Hello | 1001 |
对比目标表一和源表,发现缺少时间戳1003的记录,说明源表发生了insert新增操作(也有可能是目标误删除了记录);
②源表数据库同步之后,得到目标表二:
主键 name(varchar(20)) | 时间戳(bigint) |
Hello | 1001 |
World | 1002 |
对比目标表一和源表,目标表二多了一条时间戳1002的数据,但少了一条1003的数据,两者主键一致,说明源表发生了update更新操作;
③源表数据库同步之后,得到目标表三:
主键 name(varchar(20)) | 时间戳(bigint) |
Hello | 1001 |
World | 1003 |
Test | 1004 |
对比目标表一和源表,目标表三比源表多了一条时间戳为1004的数据,说明源头发生了delete删除操作。
……
以上种种情形,我们通过时间戳服务,对比源表和目标表时间戳序列的差异,随时发现数据DML操作,不需要额外的日志系统辅助,自动智能解决一切传输问题,传给目标表精确的数据库。
我们知道时间戳字段应当满足如下特性:
①时间戳字段的值必须是正数,且像时间一样正向增长的,不能回退;
②同一张表中时间戳字段的值尽可能的是唯一的;
③数据发生插入或更新时,该条记录的时间戳字段的值尽可能成为全表最大。
MSSQL数据的timestamp类型就具有这种特性,能够很好的支持UTS的数据传输同步。对于数据源不是MSSQL数据库的,尽可能使用某种机制确保作为时间戳字段的值满足上述特性。(如触发器的实现方式)
下图是MSSQL的一张表,开始时只有3条数据。
当插入一条记录后,插入的这条记录的时间戳字段的值就成为全表最大的值了,这样通过目标表比对最大,最小时间戳和数据总数,很快就能够知道新增的记录数是id为4的数据。
当数据源发生更新后,更新ID为1的数据,这时这条记录的时间戳由原来的全表最小变成了全表最大,通过比对目标表和源表的最大最小值,很容易就找出ID为1的记录发生了更新,uts就能够将更新的数据同步到目标表。
三、产品优势
相比较传统有逻辑缺陷的日志体系,时间戳机制“冗灾容错”,绝对不会丢失数据。
传统日志体系(缺点) | 时间戳机制(优势) |
当网络故障、数据库异常或者某种写入失败出现后,日志系统将面临丢失数据风险,还有其他层出不穷的异常。 | 时间戳机制通过比对源和目标的时间戳序列差异,随时可以发现数据DML操作,不需要额外的日志系统辅助,智能自动解决一切传输问题。 |
当目标表发生误操作,比如删除了数据,日志体系很难补齐缺失的数据。 |