Nosql 在Couchbase集群中使用增量计数器生成唯一密钥

Nosql 在Couchbase集群中使用增量计数器生成唯一密钥,nosql,couchbase,Nosql,Couchbase,关于Couchbase和其他NoSQL数据库,我听到的最常见的问题是如何为记录生成唯一键,或者更具体地说,如何复制公共关系数据库的自动增量功能 Couchbase中经常提到的解决方案是increment函数,在该函数中,您可以对数字键调用increment,它将按顺序生成一个新的唯一数字 关于这一点,我的问题是,当涉及到复制时,我无法回避我所预见的巨大问题 假设您有一个由三个Couchbase节点组成的集群,并且您正在存储一个请求日志。您希望键入此日志,以便创建一个名为“requestlog\u

关于Couchbase和其他NoSQL数据库,我听到的最常见的问题是如何为记录生成唯一键,或者更具体地说,如何复制公共关系数据库的自动增量功能

Couchbase中经常提到的解决方案是increment函数,在该函数中,您可以对数字键调用increment,它将按顺序生成一个新的唯一数字

关于这一点,我的问题是,当涉及到复制时,我无法回避我所预见的巨大问题

假设您有一个由三个Couchbase节点组成的集群,并且您正在存储一个请求日志。您希望键入此日志,以便创建一个名为“requestlog\u counter”的条目

现在假设我们有4个web节点,每个节点每秒接收20个请求,每个请求都需要记录为“request::{ID}”。每秒80个请求

假设节点1和节点3有一点点网络延迟,但它们都在同一时间接收这40个请求中的一个。您的脚本增加请求计数器(在本例中,假设当前为1500)并获取ID。现在两个Couchbase实例都有可能将1501返回到web节点1和3,并且两个服务器现在都将尝试将它们正在处理的请求存储为“request:1501”

现在,复制将解决这一问题,基本上最新的复制将获胜。但是你现在已经丢失了一个请求的记录

那么,这是否意味着,在现实中,您需要一种更好的方法来为重要数据设置关键帧,并且在NoSQL集群环境中应该避免使用自动递增绝对值和唯一密钥生成

或者-作为密钥生成过程的一部分,您是否可以做一些事情,使其100%可靠

也请考虑使用跨数据中心复制的多集群环境。

谢谢


Mike

首先,根据couchbase的说法,
递增
递减
在集群中是“原子”的。因此,如果您使用它们来生成“自动增量”,所有这些都应该可以正常工作


但是,如果您希望在couchbase中保存新项目时,不会覆盖现有项目(如“两个couchbase实例都可能返回1501”),则可以将store操作与
StoreMode.Add一起使用。因此,如果您同时调用“代码> CoucBase.Stury(SturMoD.Advd):请求:1501,value)/代码>,一个请求将以成功结束,另一个将失败,并且您可以捕获这个“失败”并尝试再次重复该存储操作(随着新的AutoPosiid ID用于新键)

请考虑跨数据中心复制示例。假设DC1和DC2之间的链路中断5秒钟,在此期间,DC1和DC2各自接收并处理200个请求。我们的auto inc现在发生了什么?自动增量都增加到1700,两个DC都使用这些ID存储了记录?然后发生了什么?在这种情况下,store命令不会失败,因此,无论是原子还是非原子,该操作都会导致数据一致性出现相当糟糕的情况??正如我所说,增量在一个集群中是原子的。如果您计划使用XDCR,则需要在“自动增量”中添加类似集群id的内容。即
请求::
请求::
。在这种情况下,即使您得到两个相同的自动递增id,您的密钥也将是唯一的,因为它将具有唯一的
集群id
。但是,对我来说,如果我需要XDCR,我只需要使用GUI,添加时间戳之类的东西来对值进行排序,而不关心原子操作。我假设在提问时可能会出现这种情况,我相信将来从RDB转向NoSQL时,其他人也会问同样的问题。或者更可能发生的是,有人不会考虑这一点,一旦他们引入XDCR,它就会崩溃。希望这能解释他们出了什么问题,并为他们提供解决问题的方法。感谢m03geek的确认和建议。