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