【问题标题】:create a custom partitioner in cassandra to index the record to specific nodes在 cassandra 中创建一个自定义分区器以将记录索引到特定节点
【发布时间】:2015-05-12 03:00:16
【问题描述】:

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

场景:在插入记录时,我需要确保将特定行插入到指定节点。我可以通过创建自定义分区来处理这个问题吗?或者有没有可用的分区器来处理这些事情?

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

提前致谢。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        不过庆幸的是,Cassandra 1.2 引入了 VNodes http://www.datastax.com/dev/blog/virtual-nodes-in-cassandra-1-2

        这应该可以在集群中插入一个新节点以更快地减轻全局负载,而不会影响新节点(请记住,新节点除了在启动时进行写入和读取之外还有很多工作要做) .您只需对令牌环(使用 Vnodes)的初始设置保持聪明,以更快地插入新闻节点。

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

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

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

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

        顺便说一句,最后一种情况正是您将实施的解决方案会发生的情况。单个 cassandra 实例与它的大小(内存大小)一样好,它们并非无敌。事实上,cassandra 集群在没有单点故障(如果使用正确的话)方面是如此惊人,这就是为什么 cassandra 可以用于处理大量工作负载的原因。不要自己插入那个单点故障。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-03
          • 2018-04-06
          相关资源
          最近更新 更多