关于Couchbase和其他NoSQL数据库,我听到的最常见问题是如何为记录生成唯一键,或更具体地说,是如何复制通用关系数据库的AUTO INCREMENT功能。

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

关于这个问题,我的问题是我无法解决复制方面我所预见的巨大问题。

考虑您有一个由三个Couchbase节点组成的集群,并且正在存储一个请求日志。您想要键入此日志的 key ,以便创建一个名为“requeSTLog_counter”的条目。

现在说我们有4个Web节点,每个Web节点每秒接收20个请求,并且每个节点都需要记录为“request::{ID})”。那是80请求每秒。

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

现在,复制将解决此问题,并且基本上最新的将获胜。但是您现在丢失了一个请求的记录。

那么,这是否意味着在现实中您需要一种更好的键控重要数据的方法,并且在NoSQL集群环境中应避免使用绝对值的自动增量和唯一键的生成?

或者-作为 key 生成过程的一部分,您可以做些什么,以使此过程100%可靠。

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

谢谢。

麦克风

最佳答案

首先,根据couchbase documentation函数,incrementdecremant在集群中是“原子的”。因此,如果使用它们来生成“自动增量”,则所有功能都可以正常工作。

但是,如果要确保在将新项目保存到沙发床时不会覆盖现有项(例如“BOTH Couchbase实例可能会返回1501”的情况),则可以将存储操作与StoreMode.Add一起使用。因此,如果您同时调用couchbase.store(StoreMode.Add, "request:1501",value),一个请求将成功完成,其他请求将失败,您可以捕获此“失败”并尝试再次重复该存储操作(通过获取新 key 的新自动递增ID)

关于nosql - 使用增量计数器在Couchbase集群中生成唯一 key ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18675527/

10-13 08:22