【问题标题】:Data consistency across nodes in NOSQLNOSQL 中跨节点的数据一致性
【发布时间】:2017-11-23 04:31:53
【问题描述】:

这是一个设计级别的问题,

我有一个节点设置,例如节点 N1、N2 和 N3,我的应用程序和数据库(目前认为是 Cassandra)在所有 3 个节点中运行。

我需要为以下场景提供数据一致性,有人可以提供答案吗?

  • 线程 (T1) 尝试编辑节点 N1 中的数据
  • 线程 (T2) 尝试从节点 N2 编辑相同的数据
  • 只有一次写入应该成功

在这种情况下,Cassandra 会发生什么?

有没有办法通过应用程序/Cassandra 数据库提供并发?或者任何算法?

除了 Cassandra 中的 LWT。

【问题讨论】:

  • Cassandra 将一行分成几列。如果在同一行但在不同的列上有多个更新,则不会有问题,因为更新将是独立的。当线程更改相同的列单元格时会出现问题。在这种情况下,最后一次写入获胜。每个突变(更新、删除)都有一个与之关联的时间戳,Cassandra 将选择最近的时间戳。阅读这些内容可能会有所帮助 stackoverflow.com/questions/34898693/…datastax.com/dev/blog/why-cassandra-doesnt-need-vector-clocks
  • 谢谢@Horia,我明白这一点,但我想知道在应用程序中是否有更好的技术来处理它以提供并发性?
  • 为什么 LWT 不适合你?
  • 写入时存在很多性能问题,不支持分区。您对应用层并发有什么建议吗?
  • @Harry 只要您只读取/写入一个分区,就不会出现任何大的性能问题。因此,在您只写一个值的情况下,这很好。因此,您想要的正是 Oresztesz 在下面回答的内容。您想使用 CL=QUORUM 因为大多数节点将始终具有最新值。与 LWT 配对将确保数据在写入时不会更改。

标签: cassandra nosql consistency data-consistency


【解决方案1】:

Cassandra 提供tunable consistency。在您的情况下,这仅意味着,如果您为写入提供 CL=QUORUM,它将同步到 3 个节点中的 2 个。读取将与CL=QUORUM 一致,因为您将从 3 个节点中的 2 个节点获得结果,因此存在重叠。

对于写入,Cassandra 提供了最后写入获胜机制。这意味着独立于一致性级别,阅读器将看到 T1 或 T2 线程的写入,具体取决于读取发生的时间。稍后读者只会看到最新的写入。

如果你想要锁定机制,你可以在你的应用层使用offline concurrency patterns,比如optimistic或者pessimistic offline lock。 一些持久性管理框架提供了开箱即用的这些模式实现。

【讨论】:

  • 谢谢你的意见,你能回答这两个问题吗,我无法得到以下两个操作,1)假设节点 N1、节点 N2 和节点 N3 是我的节点设置与复制因子为“3”,写入一致性为“3”,读取一致性为“1”如果写入正在进行(假设它在节点 1 中成功完成并在节点 2 中继续),将会发生什么。
  • 注意:我知道它可以通过在 Quorum 中写入来工作,就像在节点 N1 中写入并在节点 N2 中复制仲裁然后到节点 N3。在持续写入期间,如果同一行发生另一个 READ / WRITE,LTW 会解决问题吗?如何解决?示例:如果我使用带有 IF 语句的更新,它会阻止节点上的所有写入和读取吗? 2) IF 语句是否是 LWT 的唯一指示
  • @SimonFontanaOscarsson
  • @Harry 我不确定我是否得到了你的第一个问题。没有什么叫做写一致性或读一致性。一致性级别 (CL) 是您在会话中为客户端设置的内容。因此,如果您希望 CL 3 用于写入,而 CL 1 用于读取,那么您必须在每次操作之前在客户端上进行更改。在大多数情况下,我也不认为 CL 3 或 ALL 是一个好的 CL,因为这会使您在 Cassandra 中的可用性降低。一个常见的误解是 CL 意味着您只能在那么多节点上读/写。这适用于读取,但不适用于写入。 Cassandra 将始终尝试写入所有节点
  • 但是只要节点的CL响应成功,操作就会成功。想象一下,您有 CL ALL 用于写入操作,并且一个节点出现故障或负载过重,现在您根本无法写入任何数据。 Cassandra 有其他机制来确保在该节点可用时仍然会复制丢失的数据,这是通过提示和修复来完成的。这些是需要理解的重要概念。
猜你喜欢
  • 2015-07-08
  • 1970-01-01
  • 2012-05-08
  • 2012-10-03
  • 2015-01-09
  • 2014-01-24
  • 2017-10-29
  • 2020-09-18
  • 1970-01-01
相关资源
最近更新 更多