【问题标题】:How do key/value stores manage concurrency?键/值存储如何管理并发?
【发布时间】:2017-12-01 05:23:18
【问题描述】:

我读过很多文章说键值存储只需要两个操作:

  • set(key, value)
  • get(key)

这对于单个进程来说很好,但是当你有多个进程时,键值存储如何管理并发?我原以为需要用于 compare-and-swap 样式并发的版本号(例如,无符号整数)。例如,这两个操作将是:

  • set(key, value, version),其中version条件 - 不匹配会导致并发错误,成功匹配会导致增量。
  • get(key)(返回 valueversion)。

【问题讨论】:

  • 大多数键/值结构在所有操作上都不是线程安全的。避免数据竞争取决于用户。
  • 通过使用互斥锁等来避免数据竞争?这在具有共享 KV 存储的不同机器上是不可能的。
  • 对于共享 KV 存储,它们的工作方式类似于数据库,并且通常具有不同级别的竞争处理机制。你必须检查他们的具体文件。您的版本号解决方案可能是其中之一,但真正的实现要复杂得多。
  • @amirouche 经过大量阅读,我发现了大量的方法。除了 MVCC 和锁定,还有向量时钟、时间戳等,以及各种单主和多主(repair-on-read)场景的组合。由于应用程序“协调”(或“选择”)多个版本,读取时修复对于关键(例如财务)数据是危险的,这允许丢弃已提交数据。 ROR 非常适合会话、购物车等,但绝对不适用于单一来源的真实数据。
  • @magnus 请回答您自己的问题 :)

标签: concurrency key-value atomic key-value-store


【解决方案1】:

有两种设计。有些使用锁,有些使用MultiVersion Concurrency Control

MVCC 实现无锁并发。可以总结为:

  • 单次读取,数据库返回最新版本的数据
  • 在一次写入中,数据库为数据添加一个新版本
  • 在读/写并发请求的情况下,读取获取数据的最新版本,即当前写入之前的数据。
  • 在写/写并发请求的情况下,我认为其中一个写被放弃,稍后重放。

【讨论】:

    猜你喜欢
    • 2022-11-08
    • 1970-01-01
    • 2013-10-17
    • 2012-08-17
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多