Nosql 我可以按键排序并随机分区行吗?

Nosql 我可以按键排序并随机分区行吗?,nosql,cassandra,Nosql,Cassandra,例如,如果我处理很多事务[时间戳(key)、值、交易者等等],为了负载平衡,我希望使用随机分区 但为了便于查询,我希望这些事务按每个节点上的时间戳排序,这样就可以很快地完成过去5分钟(或其他时间段)内的所有事务,并使用MapReduce合并总数 如果我使用random partitioner,为什么cassandra会对文件中的键进行随机排序 Q1:是否有解决方法?我可以使用索引,但它并不理想 Q2。出于好奇,我想知道为什么一个节点中的密钥排序与分区策略有关?节点是Cassandra,它们是环形

例如,如果我处理很多事务[时间戳(key)、值、交易者等等],为了负载平衡,我希望使用随机分区

但为了便于查询,我希望这些事务按每个节点上的时间戳排序,这样就可以很快地完成过去5分钟(或其他时间段)内的所有事务,并使用MapReduce合并总数

如果我使用random partitioner,为什么cassandra会对文件中的键进行随机排序

Q1:是否有解决方法?我可以使用索引,但它并不理想


Q2。出于好奇,我想知道为什么一个节点中的密钥排序与分区策略有关?

节点是Cassandra,它们是环形的,环中的每个节点负责密钥范围(数据集)。其思想是,在环中的所有节点上平均分配数据,另外独立执行每个写入操作,这样我们就不需要跟踪最后的更新来平衡环中的数据

Random Partitioner用于在随机节点上存储行键并在以后查找它们。它基本上生成实行键的散列(这是BigInteger),并在环中查找负责该散列的节点(在该节点的范围内)

例如,环中有4个节点(为了保持简单,我将使用较小的数字):

  • 节点1=初始\u令牌:0
  • 节点2=初始_令牌:100
  • 节点3=初始\u令牌:200
  • 节点4=初始\u令牌:300
行键“value1”的哈希值为23,因此它将存储在节点1上

行键“value2”的散列给出123,因此它将存储在节点2上


为了解决您的问题,您需要编写手动索引,而辅助索引可能不是一个完美的主意-它有一些限制(低真实性)

我使用哈希分区进行负载平衡,但在您的示例中,如果我想用哈希119插入行键“value3”,它将插入节点2上的“value2”之前我希望它位于节点2的“value2”之后。为什么不能在单个节点上订购密钥?为什么不采用相互独立的排序策略和分区策略?你能详细说明一下吗?谢谢。我有一个不可靠的解决方法,但它真的很糟糕,而且不容易添加额外的节点。我所做的是:对于5个节点,我的密钥是MD5(timestamp)mod 5:timestamp。第一个字节用于分区,所以我可以在每个节点上进行负载平衡和数据排序。不幸的是,添加额外的节点非常困难。嗯。。。卡桑德拉选择了简单而有效的解决方案——这就是我认为这个想法背后没有更多的东西。通过创建宽行,您可以在单个节点中拥有已排序的键—在本例中,列名已排序。您的带有时间戳的解决方案将无法扩展—正如您已经看到的那样。我会重新设计您的模型-创建反向索引并使用非规范化-这真的不是很难;)检查这一点:或者,也许考虑使用MangoDB感谢MaCIEJ,我重新设计了我的模型,确实引入了一些非规范化,现在它工作得很好,在每个节点上都有负载平衡和排序事务。如果你感兴趣,我可以明天分享我的解决方案。