目前我正在使用具有多个节点的 Cassandra 集群,
场景:在插入记录时,我需要确保将特定行插入到指定节点。我可以通过创建自定义分区来处理这个问题吗?或者是否有任何分区器可用于处理此类事情?
这是因为在向我的集群添加新节点时,如果出现溢出或数据过多,所有即将到来的插入都应该在新节点中完成。所以我需要上述场景才能正常工作。卡桑德拉有可能吗?
提前致谢。
目前我正在使用具有多个节点的 Cassandra 集群,
场景:在插入记录时,我需要确保将特定行插入到指定节点。我可以通过创建自定义分区来处理这个问题吗?或者是否有任何分区器可用于处理此类事情?
这是因为在向我的集群添加新节点时,如果出现溢出或数据过多,所有即将到来的插入都应该在新节点中完成。所以我需要上述场景才能正常工作。卡桑德拉有可能吗?
提前致谢。
是的,您可以通过在字段中提供org.apache.cassandra.dht.IPartitioner
类名的实现和引用来实现。conf/cassandra.yaml
partitioner:
你不想这样做。这是一个非常糟糕的主意。
效果将是您的新节点将被完全敲打,而您的所有旧节点什么都不做。您的性能将受到新节点的限制。其次,除非您的复制因子为 1,否则您的新行将被写入多个节点 - 这就是您想要的。
我建议多阅读 datastax.com 上的 Cassandra 文档。
很抱歉告诉你这个,但在我看来,你的解决方案是你可以对 cassandra 做的最糟糕的事情。
不过庆幸的是,Cassandra 1.2 已经引入了 VNodes http://www.datastax.com/dev/blog/virtual-nodes-in-cassandra-1-2
这应该可以在集群中插入一个新节点以更快地减轻全局负载,而不会影响新节点(请记住,新节点除了在启动时进行写入和读取之外还有很多工作要做)。您只需要对令牌环(使用 Vnodes)的初始设置保持聪明,以更快地插入新闻节点。
您的方法与使用手动分片 MySQL 服务器的公司所做的非常相似。手动分片是您尝试使用 Cassandra 等系统解决的主要问题。
我见过两种情况下 cassandra 无法应对负载:
您的整个集群过载,在这种情况下引入新节点是唯一的出路。在这种情况下,VNode 是您的朋友。这主要是因为您低估了应用程序的负载。使集群更大或使实例更大,这是您的选择。
您在集群中有一个节点正在被特别敲击:这表明您的应用程序正在做一些非常错误的事情,即写入一个(或很少)硬编码的密钥。这将使所有读取和写入(针对该密钥)落在一个节点上并使其过载,直到崩溃,集群的其余部分将尝试为它承担负载(最坏的情况是一切都崩溃了,最好的情况是你会看到一个大的性能下降)。
解决方案是将您的硬编码密钥存储到许多子密钥中(足以确保它们会落在整个集群中,我建议生成它们的哈希并使用 nodetools 检查它们会落在哪里)。
最后一种情况无法通过 sysops 解决方案解决,必须通过返回应用程序的代码来修复,该应用程序正在敲击该密钥并修复它。
顺便说一句,最后一种情况正是您将实施的解决方案会发生的情况。单个 cassandra 实例与它的大小(内存大小)一样好,它们并非无敌。事实上,cassandra 集群在没有单点故障(如果使用正确的话)方面是如此惊人,这就是为什么 cassandra 可以用于处理大量工作负载的原因。不要自己插入那个单点故障。