一直在搜索特定信息但找不到;请原谅我在这方面的新意。
我将尝试使用SymmetricsDS复制Firebird数据库。这是一个ERP数据库;在我看来,将有1个主人和2个奴隶。我将有2个从属服务器,它们将在本地工作,本地机器将它们作为客户端连接。
比如说我是本地奴隶的客户1.我正在创建一个新客户,它将自动获得客户ID 100.同时本地奴隶(服务器)2的客户创建一个新客户,它采用相同的客户ID。现在这两个奴隶同步到主人;会有冲突。
我知道这听起来很不错;你知道你无法隐藏它。
防止这种情况的最佳方法是什么;而不是解决?
答案 0 :(得分:2)
我认为没有一种“最好的”方法。这取决于系统特定的细节什么效果最好...无论如何,一些选项是:
使用UUID作为客户ID。从版本2.5开始,Firebird内置了对generating and converting UUIDs的支持。
在每个本地从站上初始化客户ID序列,以便由其生成的ID不与其他从站重叠。即如果您使用32位整数作为PK并且需要最多两个从站,则将最高位专用作“从站ID”。这意味着在第一个奴隶上你从零开始序列,而在第二个你从2147483648(bin 1000 0000 0000 0000 0000 0000 0000 0000
)开始它。有关如何设置序列的起始值,请参阅ALTER SEQUENCE语句。
您可以拥有一个生成ID的服务。每当奴隶需要客户的身份证时,它就会从特殊服务中获取。为了帮助提高性能,可能需要在补丁中请求新ID并将其缓存以供以后使用。
答案 1 :(得分:0)
我认为系统是遗留的,你没有能力改变它的工作方式。在类似的场合,我已经解决了这个问题,让每个从站生成序列。我在主节点上的symmetricDs中添加了一个写过滤器,它将拦截来自从站的每次推送,并为每个从站添加一个唯一的前缀。如果在将数据路由到每个从站后必须将数据同步回从站,则向对称从站添加写过滤器,以剥离添加的前缀。
例如,最大从站数为99.假设从站1创建一个序列198976,假设序列长度为10,使用slave的ID,pad将序列保留为零并添加从站id作为前缀:(0)100198976。如果从机17生成相同的序列,主节点的过滤器会将其更改为1700198976。
如果在主设备上更改了相同的数据并且必须将其发送回生成它的从设备,则从设备上的写入过滤器将剥离前两个数字(在一个数字从设备ID的情况下,在左边填充为0之后) )。来自master(0)100198976的Slave 1序列将再次成为198976;来自主人1700198976的奴隶17的序列将成为198976。
如果已在从属设备上使用了ID列的整个长度,请通过加宽它来更改主列上的列以适应从属ID的宽度