【问题标题】:Can I have rows ordered by key and partitioned randomly?我可以按键排序并随机分区吗?
【发布时间】:2013-01-05 04:54:53
【问题描述】:

例如,如果我处理大量事务 [timestamp (key)、value、trader,..],我希望进行随机分区以实现负载平衡。

但是为了查询,我希望这些事务按每个节点上的时间戳排序,以便在过去 5 分钟(或其他时间)内完成所有事务并使用 MapReduce 合并总数会非常快.

如果我使用随机分区器,为什么 cassandra 会对文件中的键进行随机排序?

Q1:有解决办法吗?我可以使用索引,但这并不理想。

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

【问题讨论】:

    标签: nosql cassandra


    【解决方案1】:

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

    Random Partitioner 使用Consistent Hashing 将行键存储在随机节点上,以便以后找到它们。它基本上生成真实行键的哈希(这是BigInteger),并在环中找到负责这个哈希的节点(它在这个节点的范围内)。

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

    • 节点 1 = initial_token: 0
    • 节点 2 = initial_token: 100
    • 节点 3 = initial_token: 200
    • 节点 4 = initial_token: 300

    行键“value1”的哈希值是 23,所以它将存储在节点 1 上

    行键“value2”的哈希值为 123,因此将存储在节点 2 上

    为了解决您的问题,您需要编写手动索引,二级索引可能不是完美的想法 - 它有一些限制(低肉质)

    【讨论】:

    • 我使用散列分区进行负载平衡,但在您的示例中,如果我想插入行键“value3”和散列 119,它将在节点 2 上插入“value2”之前,我希望它是在“value2”之后的节点 2 上。为什么键不能在单个节点上排序?不将排序策略和分区策略相互独立的原因是什么?你能详细说明一下吗?谢谢。
    • 我有一个狡猾的解决方法,但它真的很糟糕,添加额外的节点并不容易。我所做的是:对于 5 个节点,我的密钥是 MD5(timestamp) mod 5:timestamp。第一个字节用于分区,因此我在每个节点上都进行了负载平衡和数据排序。不幸的是很难添加额外的节点。
    • 好吧... Cassandra 选择了简单而有效的解决方案——这就是我认为这个想法背后没有更多的东西。您可以通过创建宽行在单个节点中排序键 - 在这种情况下,列名是排序的。您的时间戳解决方案将无法扩展 - 正如您已经看到的那样。我会重新设计你的模型——创建反向索引并使用非规范化——这真的不是很难;)
    • 看看这个:research.google.com/archive/bigtable.html,或者考虑使用 MongoDB
    • 感谢 Maciej,我重新​​设计了我的模型并确实引入了一些非规范化,现在它可以完美运行,在每个节点上都有负载平衡和排序事务!如果您有兴趣,我明天可以分享我的解决方案。
    猜你喜欢
    • 2017-04-09
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多