在cassandra中创建自定义分区程序,以将记录索引到特定节点

时间:2013-04-04 11:04:53

标签: cassandra

目前我正在使用带有多个节点的Cassandra集群,

场景:插入记录时,我需要确保将特定行插入到指定节点。我可以处理这个创建自定义分区吗?或者是否有任何分区可以处理这些事情?

这是因为如果存在溢出或太多数据,在向集群添加新节点时,所有即将到来的插入都应该在新节点中完成。所以我需要上面的场景才能工作。 Cassandra有可能吗?

提前致谢。

3 个答案:

答案 0 :(得分:1)

很抱歉告诉你这件事,但在我看来你的解决方案是你对cassandra做的最糟糕的事情。

但是很高兴,Cassandra 1.2引入了VNodes http://www.datastax.com/dev/blog/virtual-nodes-in-cassandra-1-2

这应该会在集群中插入一个新节点,以便在不敲定新节点的情况下更快地减轻全局负载(请记住,新节点除了在执行写入和读取时还有很多工作要做) 。您只需聪明一下您对令牌环的初始设置(使用Vnodes),以便更快地插入新闻节点。

您的方法与使用手动分片MySQL服务器的公司所采取的方法非常相似。手动分片是您尝试使用Cassandra等系统解决的主要问题。

我见过两例cassandra无法应对负载:

  1. 您的整个群集都是重载,在这种情况下,引入新节点是唯一的出路。在这种情况下,VNodes是你的朋友。这主要是因为你低估了app的负载。使群集更大或使实例更大,这是您的选择。

  2. 群集中有一个节点特别受到攻击:这表明您的应用正在做一些非常错误的事情,即写入一个(或极少数)硬编码密钥。这将使所有读取和写入(针对该密钥)落在一个节点上并使其超载直到崩溃,并且群集的其余部分将尝试为其承担负载(最坏的情况一切都会下降,最好的情况是你会看到一个大的表现不佳) 解决方案是将硬编码密钥存储到许多子密钥中(足以确保它们落在整个集群中,我建议生成它们的散列并检查nodetools它们将落在哪里)。 /> 最后一种情况是使用sysops解决方案无法解决的,必须通过返回应用程序代码修复该密钥并修复它来解决。

  3. 顺便说一句,最后一种情况正是你要实现的解决方案会发生什么。单个cassandra实例与它的大小(内存wize)一样好,它们不是无敌的。事实上,cassandra集群在没有单点故障(如果使用正确)方面如此惊人,这就是为什么cassandra可以用来承担巨大的工作量。不要自己插入单点故障。

答案 1 :(得分:1)

是的,您可以提供org.apache.cassandra.dht.IPartitioner的实施,并在conf/cassandra.yaml字段的partitioner:引用该类名称。

答案 2 :(得分:0)

你不想这样做。这是一个非常糟糕的主意。

效果将是您的新节点将被完全锤击,而您的所有旧节点都不执行任何操作。您的性能将受到新节点的性能限制。其次,除非您的复制因子为1,否则您的新行将被写入多个节点 - 这就是您想要的。

我建议您在datastax.com上阅读Cassandra文档。