有什么策略可以避免数据库同步当中的冲突问题?
以postgresql为例,同步两个数据库A和B,这两个数据库都是可读可写的。这样就有一个问题,A库中某个表的sequence变掉了,B库中的没变。下一次B库中的做添加操作。系统就会报错,因为A库的表已经同步到B库,那个ID值已存在,但是B库这个表的sequence并没有更新。
请问如何才能有效避免这种情况?
冲突 技巧 数据库同步 sequence PostgreSQL 数据库
一桶小海豹
10 years, 4 months ago
Answers
大多数情况下,你不需要同步sequences(序列),除非你的slaves不是只读的,或者你希望你的slaves能够做failover。如果你确实是想同步sequences。那么也不复杂,以bucardo为例,你可以把sequences作为tables来处理:将他们添加至goat table,然后在herd中使用,最后添加至你的sync中。
如果是使用的多个master模式,那么,最好的解决方案并不是同步sequences,而是确保sequence number在不同的数据库中是不一样的。这样,在做添加记录时,就不可能冲突。通常,有3种方式:
- 交叉存储:数据库A, 定义sequence START WITH 1 INCREMENT BY 2。 数据库B, 定义sequence START WITH 2 INCREMENT BY 2。这样,两个数据库的序列号就不可能一样了。
- 不同范围: 比如,数据库A的序列号 START WITH 1, 数据库B的序列号 START WITH 100000000。这种方法的缺点是,有一天,A最终能达到B的值,虽然你可以将这个值定义为最大的99999999。
- 定制序列号: 这种方式,需要写一个函数,让1个或多个数据库调用,然后由函数分配一个序列号,这时序列号的同步,就被程序控制。
ICEking
answered 10 years, 4 months ago