假设我们有一个带有 ID、CONTENT 和 TIMESTAMP 的分布式表。 ID 是 hash(CONTENT) 并且 CONTENT 具有足够的确定性,可以在系统的多个位置依次输入。
假设现实生活中发生了一件大事。就像有人赢得了奥运会。然后,它会以一条记录的形式进入该数据库,该记录除了时间戳外始终看起来相同。由于每台机器以略有不同的延迟观察事件。
所以。当机器同步这个分布式表时,他们会想“我们已经有了这个确切的 ID!它也不是同一行!我们应该怎么做!?”。我想以以下形式给他们答案:bool compare(row a, row b)
或者,最好是 row merge(row a, row b)
。
有人知道怎么做吗?我只能找到与合并两个不同表相关的“合并”内容,而实际上这是相同表,只是分布式的。
对我来说,这对于使我的系统“最终保持一致”非常重要。我想利用 postgresql 的分布式数据库机制,因为它们非常可靠,我不想重写它们。
最佳答案
PostgreSQL 没有“分布式数据库”特性。您不能重写它们或避免重写它们,因为它们不存在,我很好奇您从哪里获得可靠性信息。
我能想到的最接近的tihng是a 3rd party addon called Bucardo ,它通过冲突解决进行多主复制。
您也可能想到了 Postgres-XC ,但该项目旨在生成一个同步、一致、透明的多主集群,因此一开始就没有冲突解决方案。
还有Rubyrep;我对它的了解还不够,无法确定它是否满足您的需求。
将来 PostgreSQL 将支持类似于您所描述的内容,使用 logical replication / bi-directional replication ,但它目前是 pre-alpha 质量,并且可能最快登陆 PostgreSQL 9.5。
关于sql - 分布式postgresql ID冲突处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21497117/