【问题标题】:Cassandra data model approachCassandra 数据模型方法
【发布时间】:2012-03-13 21:03:59
【问题描述】:

请原谅我问了一些可能在其他地方解释过的问题,但我在 Cassandra 中设计数据模型时遇到了问题。

我正在存储交易。这些交易每个都有一个来源(用户)、一个时间戳和一些相关的关键字。我需要能够在给定来源和日期范围以及(可选)关键字的情况下找到交易。 Cassandra 很有吸引力,因为我需要存储数十亿笔交易。

我一直找不到解释如何做这类事情的资源。我最初的想法包括有几个 CF——一个事务 CF、一个关键字事务 CF、一个 source_transaction CF,可能还有一个 day_transaction CF(或类似的东西)。这将使查找基于上述任何一项的交易变得非常简单,但它似乎不会让我搜索上述所有项目。

有什么想法吗?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    首先考虑您的查询,然后考虑您的数据模型。在规划数据模型时,请阅读 herehere 作为帮助。

    cf : transactions
    rowkey : source/uuid (suggestion)
      cn : source  
      cv : UTF8
      cn : keyword
      cv : UTF8
      cn : date
      cv : DateType
      cn : time
      cv : DateType
    
    
    cf : keywords
    rowkey : keyword
       cn : source
       cv : UTF8
    

    您将有一个称为事务的标准列族和一些列名 (cn) 及其对应的列值 (cv)。这些事务中的每一个都由行键标识。另一个标准列族是关键字,其中行键是关键字。

    您可以按来源、时间戳或关键字进行搜索,但您需要index 才能使查询正常工作。例如上面的建议数据结构,你可以这样做:

    • 获取源等于“”的所有事务 获取源 = '' 的交易
    • 获取来源等于 '' 和您的日期 > '' 的所有交易 获取 source = '' 和 date > '' 的交易;
    • 获取日期 x 的所有交易 获取日期 = '' 的交易;
    • 根据关键字获取所有源名称 获取关键字['keyword'];

    【讨论】:

    • 我来这里是为了问一个类似的问题,我也达到了这个解决方案,但我对它不满意,因为偶尔会提到“热点”,在那里你可以收到很多数据来自单个“源”并且由于它是分区键,因此所有数据都将转到单个节点。我一直想知道这是否可以避免,同时又不会失去像“source='foo' and time > t0 and time
    • OP提出的这个问题发生在很久以前,即使是上面的cassandra-cli,目前也不赞成。首选方法是通过 cqlsh 使用。话虽如此,我不知道您对热点的印象如何,如果您希望将数据存储到不同的服务器中,请尝试在密钥上进行一些更改,例如key1||foo, key1||bar 所以散列这将是不同的并且存储在不同的服务器中?但是我们有每个节点负载大约 300-400GB 稳定的生产数据.. 热点?在你提到之前,我什至没有注意到也没有打扰它。
    • 我刚才提到了cqlsh,所以你应该看看cql spec 3.0及以后的版本,cassandra 1.2和2.0版本在cql支持方面有很大的改进。尝试阅读 cassandra.apache.org/doc/cql3/CQL.htmldatastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0 。我不知道你的确切问题是什么,但我希望你能根据我的 cmets 得到想法,你可以继续前进。
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多