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

Is it possible to read data only from a single node in a Cassandra cluster with a replication factor of 3?

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

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

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

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

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

"For cases with a single datacenter, the TokenAwarePolicy chooses the primary replica to be the chosen coordinator in hopes of cutting down latency by avoiding the typical coordinator-replica hop."

事情是这样的。假设我有一个 table 用于跟踪 Kerbalnauts,我想获取 "Bill." 的所有数据 我会使用这样的查询:

SELECT * FROM kerbalnauts WHERE name='Bill';

驱动程序将我的分区键值(名称)散列为 4639906948852899531 的令牌(SELECT token(name) FROM kerbalnauts WHERE name='Bill'; returns 该值)。如果我使用 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)]'

I mean if we have a cluster with a replication factor of 3 then we will always ask all nodes when we read

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

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

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

请求摘要

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