2013-04-04 51 views
2

目前我使用几个节点卡桑德拉集群,创建自定义分区索引记录到特定节点

方案:虽然插入,我需要确保特定行得到插入记录到指定的节点。我可以处理这是创建一个自定义分区?或者是否有任何分区器可用于处理此类事情?

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

在此先感谢。

回答

0

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

效果将会是你的新节点将被完全敲击,而你的所有旧节点什么都不做。您的性能将受到新节点的性能的限制。其次,除非您的复制因子是1,否则您的新行将写入多个节点 - 这正是您想要的。

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

0

不好意思告诉你这个,但你的解决方案对我来说似乎是你可以对卡珊德拉做的最糟糕的事情。

但庆幸,卡桑德拉1.2推出了虚拟节点http://www.datastax.com/dev/blog/virtual-nodes-in-cassandra-1-2

这应该使集群中插入新的节点,以减轻全球负载不锤击新节点(请记住,新的节点有很多有点快当你提出时,除了接受写入和读取之外,还要做)。您只需要对令牌环的初始设置(使用Vnodes)进行智能化即可更快地插入新闻节点。

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

我见过卡桑德拉两种情况不能够应付负载:

  1. 你的整个集群是在这种情况下,带来了新的节点是唯一出路超载。在这种情况下,VNodes是你的朋友。这主要是因为你低估了你的应用程序的负载。使集群更大或者让实例更大,这是您的选择。

  2. 集群中有一个节点正在遭受特别的攻击:这表示您的应用正在做一些非常错误的事情,这是写入一个(或很少)硬编码密钥的。这将使所有的读写操作(对于该密钥)落在一个节点上,并将其重载直到崩溃,并且群集的其余部分将尝试为其加载(最糟糕的情况是一切都会下降,最好的情况是您会看到一个大的性能下降)。
    解决这个问题的方法是将硬编码的密钥分成许多子密钥(足以确保它们会落入整个群集,我建议生成它们的散列并检查nodetools的位置)。
    这最后一种情况在sysops解决方案中是无法解决的,必须通过回到正在锤击该密钥并修复它的应用程序的代码来解决。

顺便说一句,最后一种情况就是您要实施的解决方案。一个cassandra实例和它的大小一样好(内存大小),它们不是无敌的。 cassandra集群在没有单点故障(如果使用正确)的情况下如此惊人的事实是cassandra可用于处理巨大工作负载的原因。不要自己插入单点故障。

0

是的,你可以通过提供一个org.apache.cassandra.dht.IPartitioner的实现并在partitioner:字段中引用conf/cassandra.yaml中的类名。