6

所以我在这里看到 Cassandra 没有自动负载平衡,这在使用有序分区器时会出现(一组行的某个常见值范围将存储在相对较少的机器上,然后这些机器将服务于大多数查询)。
设计 Cassandra 数据模型的最佳实践是什么?

我对 Cassandra 及其工作原理仍然很陌生。如何避免这个问题,以便范围查询仍然是可能的?我并没有真正得到关于将哈希附加到键的上述答案(链接的 url)的想法。

4

3 回答 3

8

如另一篇文章所述,Cassandra 0.5 支持半自动负载平衡,您所要做的就是告诉节点进行负载平衡,它会自动移动到令牌环上更繁忙的地方。

这在http://wiki.apache.org/cassandra/Operations中有介绍

于 2009-12-17T15:02:40.203 回答
4

我认为这个问题最好在 cassandra-user 邮件列表中处理;那就是人们所在的地方。

Cassandra 还没有自动负载平衡,但在不久的将来它可能会这样做。0.5 分支现在可能能够做到这一点。

本质上,当您在已经运行的系统上引导节点时,它应该在环中找到一个能够实现最佳负载平衡的位置并将其自身放置在那里。如果您一次添加一个节点(即在添加另一个节点之前等待一个节点完成引导),这应该可以很好地工作,前提是您的密钥分配不会随着时间的推移而发生太大变化。

但是,您的密钥可能会随着时间而改变(特别是如果它们是基于时间的),因此您可能需要一种解决方法。

这取决于您要进行范围扫描的内容。如果您只需要对密钥的一部分进行范围扫描,则可以对您不想进行范围扫描的位进行哈希处理,并将其用作密钥的第一部分

我将在这里使用术语“分区”来指代您不想进行范围扫描的键部分

function makeWholeKey(partition, key) {
   return concat(make_hash(partition), partition, key);
}

现在,如果您想对给定分区内的键进行范围扫描,您可以在 makeWholeKey(p,start) 和 makeWholeKey(p,end) 之间进行范围扫描

但是如果你想扫描分区,你就不走运了。

但是您可以使您的节点具有在 make_hash() 输出范围内均匀分布的令牌,并且您将获得均匀分布的数据(假设您有足够的分区,它不会全部聚集在一两个哈希值上)

于 2009-11-20T12:18:51.683 回答
1

跨集群的数据分区由以下partitioner 参数控制cassandra.yaml

partitioner: org.apache.cassandra.dht.Murmur3Partitioner

使用Murmur3Partitioner将为 Row Key 生成随机哈希码并执行负载平衡。

使用 Cassandra 2.0,您可以在单个服务器中存储多个令牌 (256),这也有助于负载平衡。使用它不是很好的做法,OrderPreservingPartitioner并且已被弃用。

于 2014-02-20T08:24:51.557 回答