Ale*_*ndr 5 replication consistency cluster-computing database-replication cassandra
我知道Cassandra具有不同的读取一致性级别但我没有看到一致性级别,它允许仅通过密钥从一个节点读取数据.我的意思是如果我们有一个复制因子为3的集群,那么我们将在读取时始终询问所有节点.即使我们选择一致性级别,我们也会询问所有节点,但是等待来自任何节点的第一个响应.这就是为什么我们在读取时不仅要加载一个节点而是加载3个(带有协调器节点的4个节点).我认为即使我们设置了更大的复制因子,我们也无法真正提高读取性能.
是否可以仅从单个节点读取?
您是否使用令牌感知负载平衡策略?
如果是,并且您正在以 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)
归档时间: |
|
查看次数: |
1223 次 |
最近记录: |