是否可以仅从复杂因子为3的Cassandra集群中的单个节点读取数据?

时间:2016-04-08 17:10:50

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

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

是否可以仅从单个节点读取?

2 个答案:

答案 0 :(得分:3)

您使用的是令牌感知负载均衡政策吗?

如果你是,你正在查询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)]'

答案 1 :(得分:2)

  

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

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

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

对于一致性级别> = QUORUM,协调员将要求来自最快节点的数据,也要求来自其他副本的摘要

从客户端,如果您选择适当的负载平衡策略(例如 TokenAwareStrategy ),客户端将始终在使用一致性级别 ONE