【问题标题】:Is it possible to read data only from a single node in a Cassandra cluster with a replication factor of 3?是否可以仅从复制因子为 3 的 Cassandra 集群中的单个节点读取数据?
【发布时间】:2016-04-08 17:10:50
【问题描述】:

我知道 Cassandra 具有不同的读取一致性级别,但我还没有看到允许仅从一个节点按键读取数据的一致性级别。我的意思是,如果我们有一个复制因子为 3 的集群,那么我们在读取时总是会询问所有节点。即使我们选择一个一致性级别,我们也会询问所有节点但等待来自任何节点的第一个响应。这就是为什么我们在读取时不仅会加载一个节点,还会加载 3 个(4 个带有协调节点)。我认为即使我们设置更大的复制因子,我们也无法真正提高读取性能。

真的可以只从单个节点读取吗?

【问题讨论】:

    标签: cassandra cluster-computing replication database-replication consistency


    【解决方案1】:

    您是否使用令牌感知负载平衡策略?

    如果您是,并且您正在查询 LOCAL_ONE/ONE 的一致性,读取查询应该只联系单个节点。

    阅读文章Ideology and Testing of a Resilient Driver。在其中,您会注意到使用 TokenAwarePolicy 具有以下效果:

    “对于单个数据中心的情况,TokenAwarePolicy 选择主副本作为选定的协调器,希望通过避免典型的协调器-副本跳跃来减少延迟。”

    所以这就是发生的事情。假设我有一个用于跟踪Kerbalnauts 的表,并且我想获取“Bill”的所有数据。我会使用这样的查询:

    SELECT * FROM kerbalnauts WHERE name='Bill';
    

    驱动程序将我的分区键值(名称)散列为 4639906948852899531 的标记(SELECT token(name) FROM kerbalnauts WHERE name='Bill'; 返回该值)。如果我使用的是 6 节点集群,那么我的主要令牌范围将如下所示:

    node   start range              end range
    1)     9223372036854775808 to  -9223372036854775808
    2)    -9223372036854775807 to  -5534023222112865485
    3)    -5534023222112865484 to  -1844674407370955162
    4)    -1844674407370955161 to   1844674407370955161
    5)     1844674407370955162 to   5534023222112865484
    6)     5534023222112865485 to   9223372036854775807
    

    由于节点 5 负责包含分区键“Bill”的令牌范围,我的查询将被发送到节点 5。因为我正在阅读 LOCAL_ONE 的一致性,因此无需联系另一个节点,结果将返回给客户端...只命中一个节点。

    注意:令牌范围计算如下:

    python -c'print [str(((2**64 /5) * i) - 2**63) for i in range(6)]'
    

    【讨论】:

    • 哇!谢谢你的澄清。我是否正确理解,如果我们增加复制因子,那么我们会线性增加读取吞吐量?
    • @Alexandr 关于这个想法有很多相互矛盾的信息。当然,它会增加您的可用性。但至于吞吐量,这里有一个问题的链接,该问题似乎证实了相反的情况(表明较高的射频 降低 吞吐量,它链接到一个答案表明与 相反的问题那 ...我会让你自己决定):stackoverflow.com/questions/27084341/…
    【解决方案2】:

    我的意思是,如果我们有一个复制因子为 3 的集群,那么我们在读取时总是会询问所有节点

    错误,一致性级别 ONE 协调器选择最快的节点(延迟最低的节点)来请求数据。

    它如何知道哪个副本最快?通过保留每个节点的内部延迟统计信息。

    在一致性级别 >= QUORUM 的情况下,协调器将从最快的节点请求数据,并且还会从其他副本请求摘要

    从客户端来看,如果您选择适当的负载平衡策略(例如 TokenAwareStrategy),则客户端在使用一致性级别 ONE 时将始终联系主副本

    【讨论】:

    • 在 ONE 阅读 RF 为 3 时,澄清关于“始终询问所有节点”的声明做得很好。这对我来说也不正确。
    猜你喜欢
    • 2016-05-06
    • 2018-07-16
    • 2019-06-28
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2017-04-13
    相关资源
    最近更新 更多