【问题标题】:Consistency Level of Cassandra Lightweight transactionsCassandra 轻量级事务的一致性级别
【发布时间】:2014-09-19 03:05:56
【问题描述】:

我了解了 Cassandra 2 的轻量级事务。这种写入的一致性级别总是在 QUORUM 吗?这是否意味着即使我有一个具有 100 个节点的多数据中心设置,也会涉及整个集群的仲裁(所有数据中心的行的大多数副本)?这会不会很慢并且不会影响可用性?

我们可以做到 LOCAL_QUORUM 或 EACH_QUORUM 一致性吗?如果跨多个数据中心复制的数据的写入器始终仅源自特定数据中心,则此方法将是首选。

【问题讨论】:

    标签: transactions cassandra cassandra-2.0 consistency


    【解决方案1】:

    轻量级事务的建议一致性级别是 SERIAL。然而在幕后,SERIAL 甚至比 QUORUM 更糟糕,因为它是一个多阶段的 QUORUM。正如您所说,当您有多个 DC 时,情况可能会变得难以处理——Datastax 估计 “实际上会降到正常的三分之一”

    有一个 LOCAL_SERIAL 非常适合所有 DC 从特定 DC 接收数据的情况。

    在这里您可以找到更多信息:

    LIGHTWEIGHT TRANSACTIONS
    LINEARIZABLE CONSISTENCY

    HTH,卡罗

    【讨论】:

    • 据我了解,SERIAL 一致性级别对读取而不是写入有意义。我仍然不确定轻量级事务中更改一致性级别是否有任何影响。
    【解决方案2】:

    形式上,如果读取的节点和写入的节点一起大于节点的数量(r + w > n),则可以达到的最高一致性是因果一致性。

    如果您在 Cassandra 中使用仲裁读取和写入,您将获得因果一致性。

    这意味着如果您在一个节点 (w1) 上写入并从不同节点 (r1) 读取,然后基于读取 (w2) 进行写入,则称 w2 因果依赖于 w1。一个通常一致的系统将确保所有节点看到 w1,然后看到 w2。这就是 QUORUM 读写所提供的。不属于随意依赖的读取和写入不会以任何特定方式排序。因此我们说这个系统有一个偏序。

    如果您需要执行唯一性检查等操作,则需要执行比较和设置操作。比较和设置操作需要更高级别的一致性:它需要线性化。线性化将操作(读取和写入)的总顺序强加给对象。

    在 Cassandra 中,轻量级事务是您用来确保行线性化的机制,因此也是您在 Cassandra 中进行唯一性检查的方式。其他系统(例如 etcd)允许对整个数据库系统进行线性化,而不仅仅是一行。据说这样的系统具有严格的可序列化性。

    【讨论】:

    • 这是一个漂亮的答案,但同时又极其复杂。
    【解决方案3】:

    实际上,Quorum 将略高于集群复制因子的一半。在实践中,复制因子通常保持较低(3 或 5),以避免浪费空间。

    【讨论】:

      最近更新 更多