Couchbase增量值XDCR

Couchbase增量值XDCR,couchbase,Couchbase,如果我在couchbase中存储类似数组的结构,如下所示: mykey = 3 key_1 = 47 key_2 = 11 key_3 = 17 我的更新过程是这样的: a = increment(mykey) set key_a = 42 这是否适用于跨多个数据中心复制的bucket?有更好的方法吗 我认为,不同数据中心上的两个客户端可能会同时调用increment,获得相同的值,然后将相同的键设置为不同的值。如果使用XDCR,则可能出现键重复的情况。即使在设置之前检查值(使用couchb

如果我在couchbase中存储类似数组的结构,如下所示:

mykey = 3
key_1 = 47
key_2 = 11
key_3 = 17
我的更新过程是这样的:

a = increment(mykey)
set key_a = 42
这是否适用于跨多个数据中心复制的bucket?有更好的方法吗


我认为,不同数据中心上的两个客户端可能会同时调用increment,获得相同的值,然后将相同的键设置为不同的值。

如果使用XDCR,则可能出现键重复的情况。即使在设置之前检查值(使用couchbase.add操作),它也可以生成两个相同的键

在集群中,Couchbase服务器在同一级别提供了强大的一致性 文档级别。另一方面,XDCR还提供最终的 集群间的一致性。内置的冲突解决方案将选择 如果使用相同的文档,则两个集群上的“获胜者”相同 在两个集群上都发生了变异。如果发生冲突,文档将与 更新最多的将被视为“赢家”。如果相同的文档 在源和目标上更新相同的次数, 其他元数据,如数字序列、CAS值、文档 标志和到期TTL值用于选择“获胜者”。XDCR 跨集群应用相同的规则以确保 保持一致性

为了避免这种情况,couchbase建议存储一些关于数据中心/集群的信息,或者使用像GUID这样的唯一键。我认为第二种方式不是首选,所以您可以通过添加数据中心位置作为密钥前缀来实现第一种方式,并在应用程序端处理它们:

US-east.mykey_1
US-west.mykey_1

使用特定于数据中心的前缀可能会重复so?是的。我在手册的某个地方读过这个,但我不记得在哪里给你一个链接。通常,可以通过两种方式提供唯一键(使用XDCR):使用GUID或使用数据中心前缀。还有另一种方法:您可以提供一个集中式的顺序ID源,但这会扼杀高可用性的想法。我也想到了这一点,让一个集群完成所有增量()。然而,我和一个负责spotify的cassandra安装的人谈过,他们的数据中心“一天有几次”彼此断开连接。数据中心前缀解决方案可能是最好的,因为我没有任何适用于此数据结构的合理GUID。当GUID有意义时,应该明确使用它们!