所以我在这里看到Cassandra没有自动负载平衡,这在使用有序分区器时会被看到(一组行的某些常见值范围将存储在相对较少的机器上,然后这些机器将服务于大多数(查询) What's The Best Practice In Designing A Cassandra Data Model?
我还是Cassandra的新手以及它是如何运作的。如何避免这个问题,以便仍然可以进行范围查询?我没有真正得到关于向键附加哈希的上述答案(链接网址)。
答案 0 :(得分:8)
正如另一篇文章所述,Cassandra 0.5支持半自动负载均衡,你需要做的就是告诉节点负载均衡,它会自动移动到令牌环上更加繁忙的地方。
中介绍了这一点答案 1 :(得分:4)
我认为这个问题最好在cassandra-user邮件列表中使用;这就是人们所在的地方。
Cassandra没有自动负载平衡但是但它可能在不久的将来也会这样做。 0.5分支现在可以做到这一点。
基本上当你在已经运行的系统上引导一个节点时,它应该在环中找到一个最佳负载平衡并放在那里的点。如果您一次添加一个节点(即等待一个节点在添加另一个节点之前完成引导),这应该可以正常工作,前提是您的密钥分发不会随着时间的推移而发生太大变化。
但是,您的密钥可能会随着时间而变化(特别是如果它们是基于时间的),因此您可能需要一种解决方法。
这取决于您想要扫描范围。如果您只需要扫描密钥的 PART 范围,则可以散列您不想进行范围扫描的位,并将其用作密钥的第一部分。
我在这里使用术语“分区”来指代您不想扫描范围的键部分
function makeWholeKey(partition, key) {
return concat(make_hash(partition), partition, key);
}
现在,如果您想要扫描给定分区中的键,您可以在makeWholeKey(p,start)和makeWholeKey(p,end)之间进行范围扫描
但是如果你想扫描分区,那你就不走运了。
但是你可以让你的节点拥有均匀分布在make_hash()输出范围内的令牌,并且你将得到均匀分布的数据(假设你有足够的分区,并不是所有的分区都聚集在一两个哈希值)
答案 2 :(得分:1)
跨群集对数据进行分区由partitioner
中的cassandra.yaml
参数控制:
partitioner: org.apache.cassandra.dht.Murmur3Partitioner
使用Murmur3Partitioner
将为Row Key生成随机哈希码并执行负载平衡。
使用Cassandra 2.0,您可以在单个服务器中存储多个令牌(256),这也有助于负载平衡。使用OrderPreservingPartitioner
并不推荐使用是不太好的做法。