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

Ale*_*ndr 5 replication consistency cluster-computing database-replication cassandra

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

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

Aar*_*ron 5

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

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

阅读文章《弹性驱动程序的意识形态和测试》 。在其中,您会注意到使用 TokenAwarePolicy 具有以下效果:

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

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

SELECT * FROM kerbalnauts WHERE name='Bill';
Run Code Online (Sandbox Code Playgroud)

驱动程序将我的分区键值(名称)哈希为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
Run Code Online (Sandbox Code Playgroud)

由于节点 5 负责包含分区键“Bill”的令牌范围,因此我的查询将发送到节点 5。由于我以 LOCAL_ONE 的一致性进行读取,因此不需要联系另一个节点,并且结果将返回给客户端...仅命中单个节点。

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

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