【问题标题】:Cassandra tunable consistency with multiple clientsCassandra 与多个客户端的可调一致性
【发布时间】:2015-02-04 13:03:40
【问题描述】:

我一直在观看 Datastax Cassandra 教程,但我有一个关于可调一致性的问题。他们显示的等式是if (nodes_read + nodes_written) > replication_factor,那么我们就有了直接的一致性。仅当有一个客户端连接到数据库时,这似乎才是正确的。如果我们有多个客户,我看不出这个等式如何仍然成立。这里的假设是我们只有一个客户吗?谢谢你。

【问题讨论】:

    标签: cassandra datastax-enterprise datastax


    【解决方案1】:

    不,这与客户数量无关。

    例如,只要您在读取和写入 quorum,就可以保证是一致的。请记住,在 Cassandra 中,最后一次写入获胜。因此,换句话说,您可以保证不会读取过时的数据。

    不过不要把这个等式走得太远

    我很少看到除一一或法定人数之外的配置。 write 1 read ALL 之类的东西在理论上是一致的,但是如果你失败了,那么一致性有什么价值呢?

    还要确保运行 NTP。

    【讨论】:

    • “如果你情绪低落,那么一致性有什么价值?”加上我的一个。这太棒了(而且非常正确)。
    【解决方案2】:

    客户数量无关紧要。一致性在于数据而不是客户端或客户端数量。

    如果有 100 个客户端,每个客户端根据 (nodes_read + nodes_written) > replication_factor 执行写入和读取,那么在这种情况下,您仍然可以非常确定所有客户端都会立即看到一致性。

    您认为为什么许多客户会改变这个等式?

    您会立即看到一致性的原因之一是:

    1. 只有在写入“n”个节点成功后,写入才会成功
    2. 仅当“n”个节点回复时读取才会成功。返回的数据是与最新时间戳关联的数据。

    为了澄清您对多个节点的评论,让我们考虑两种情况。

    案例 1。 假设有 3 个节点,复制因子为 3

    1. 假设客户端 1 正在写入 CL = 2 的数据。这将确保只有在 2 个节点上写入成功后才能写入成功

    2. 现在,如果客户端使用 CL=2 执行读取,则至少有一个写入节点会回复。因此立即获得一致性。

    案例 2:

    1. 假设客户端正在使用 CL=1 写入数据。这将确保只有 1 次写入成功。

    现在问题来了,如果您对其中一个没有数据的节点执行读取操作会怎样。

    1. 要满足公式,您必须使用 CL=3 执行读取。这意味着所有 3 个节点都会触发读取。现在 3 个节点必须响应。其中一个节点有数据,另外 2 个没有。最高时间戳获胜,因此节点 1 获胜。因此返回数据。

    没有过时的数据

    案例 3: 1. 假设使用 CL=3 执行写入。在这种情况下,我们只有在 3 个副本节点中有数据时才能成功。

    现在问题出现了,如果您在其中一个没有数据的节点上执行读取操作会怎样。但是由于 CL 为 3,所有节点都会有成功写入的数据

    1. 在任何节点上读取成功。

    【讨论】:

    • 请纠正我的推理:复制因子为三,写入一致性为三,读取一致性为一。这应该让我们从等式中得到一致的读数。客户端 1 开始写入 3 个节点,但在此过程中,客户端 2 从一个尚未写入的节点读取数据。由于读一致性为 1,客户端 2 返回过时数据。我认为即时一致性包括当前更新数据的假设是否错误?
    • @worker1138 请参阅我的回答中的案例 1 和案例 2
    • 感谢您的回答。我同意在您概述的场景中,等式适用于即时一致性。但我仍然不相信我的方案不会返回过时的数据。
    • @worker1138 为什么会这样?我非常确定可以保证立即的一致性
    • 我指的是我在评论中概述的场景。
    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 2012-01-14
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    • 2018-09-06
    相关资源
    最近更新 更多