我知道 Cassandra 有不同的读取一致性级别,但我还没有看到一种一致性级别允许仅从一个节点按键读取数据。我的意思是,如果我们有一个复制因子为 3 的集群,那么我们在读取时总是会询问所有节点。即使我们选择一致性级别 1,我们也会询问所有节点,但等待任何节点的第一个响应。这就是为什么我们在读取时不仅会加载一个节点,还会加载 3 个节点(4 个节点带有协调器节点)。我认为即使我们设置更大的复制因子,我们也无法真正提高读取性能。
是否可以真正只从单个节点读取?
您是否使用令牌感知负载平衡策略?
如果你是,and如果您正在以 LOCAL_ONE/ONE 的一致性进行查询,则读取查询应仅联系单个节点。
给个文章弹性驾驶员的意识形态和测试 http://www.datastax.com/dev/blog/ideology-and-testing-of-a-resilient-driver一读。在其中,您会注意到使用 TokenAwarePolicy 具有以下效果:
“对于单个数据中心的情况,TokenAwarePolicy 选择主副本作为所选协调器,希望通过避免典型的协调器-副本跳跃来减少延迟。”
所以这就是发生的事情。假设我有一张表来跟踪坎巴拉人 http://wiki.kerbalspaceprogram.com/wiki/Kerbonaut,我想获取“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)]'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)