【问题标题】:Cassandra Schema To Cache Application DataCassandra Schema 缓存应用程序数据
【发布时间】:2013-10-28 01:35:41
【问题描述】:

我有一个程序执行一些相当密集的计算,我想将这些计算的结果缓存在 Cassandra 表中。这样做的最佳架构是什么?

目前,我正在使用以下架构:

CREATE TABLE raw_data_cache (
    id uuid,
    buckets int,
    start_time timestamp,
    end_time timestamp,
    time timestamp,
    data list<float>,
    PRIMARY KEY(id,buckets,start_time,end_time,time)
) with GC_Grace_Seconds=1;

id是数据源的id,bucketsstart_timeend_time是处理参数。 Time 是每列唯一的“键”。 data 是时序数据值。

要将数据插入表中,我使用标准插入和超时:

INSERT INTO raw_data_cache (id,buckets,start_time,end_time,time,data) VALUES
(?,?,?,?,?,?) USING TTL 360;

这个架构的问题是我最终会得到一致的读取超时,我认为这是由于墓碑的数量:Read 0 live and 3777400 tombstoned cells(取自 cqlsh 中的“跟踪”)。

我可以使用nodetool 摆脱所有这些,但我不想每隔几分钟就这样做。有没有更好的架构或用法可以改善这种情况?

编辑raw_data_cache 是用于存储raw_data 的处理版本的表。除了list&lt;floats&gt; 之外,我在存储raw_data 时遵循了似乎是传统智慧(但那是因为我每次有几个不同的输入,我想一次获得所有输入)。以下是基本时间序列:

CREATE TABLE raw_data(
   id uuid,
   time timestamp,
   data list<float>,
   PRIMARY KEY (id, time)
);

我使用raw_data_cache 的目标是在几个小时内保存一个较小的、经过处理的 raw_data 版本。

【问题讨论】:

    标签: cassandra schema cql3


    【解决方案1】:

    我认为您的数据模型并没有真正针对这种用法进行优化。我认为您应该使用更多基于时间序列的方法。包含要缓存的每个时间段的列。我不是 100% 确定,但认为 GC_Grace_Seconds=1 可能不是您真正想要的。

    这是 Cassandra 数据建模的最佳资源之一:http://planetcassandra.org/blog/post/getting-started-with-time-series-data-modeling。此外,还有 3 个同一作者关于该主题的视频。

    如果您想优化以首先获取最新项目,您可以执行以下操作:

    CREATE TABLE raw_data(
       id uuid,
       time timestamp,
       data list<float>,
       PRIMARY KEY (id, time)
    ) WITH CLUSTERING ORDER BY (event_time DESC);
    

    这将首先生成最近的事件,这在缓存中很有帮助。如果您想要基于小时的存储桶。您可以执行之前在包含小时“2013-10-27 12”的日期示例中执行的相同技巧,它将所有时间集中在该存储桶中。因此,也许您可​​以尝试以下方法:

    CREATE TABLE summarized_data_cache(
        id uuid,
        time_bucket text,
        time timestamp,
        data list<float>,
        PRIMARY KEY ((id, time_bucket), time)
    );
    

    这样写起来很快,检索起来也很快,因为所有内容都将存储在一个宽行中。

    【讨论】:

    • 我在有关上下文的问题中添加了更多信息。 raw_data_cache(或等价物)需要存储处理后的 raw_data 版本,该版本是根据您共享的链接建模的。谢谢!
    • 嗯。感谢 (( ), ) 主键结构。这似乎减少了 20% 左右的阅读时间。至于具体情况,划分是任意的(没有小时、分钟或秒的划分),所以我不能预先打破它。并且总是一次读取整个缓存(针对特定主键)。
    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2011-07-26
    • 2012-03-26
    • 2018-06-07
    相关资源
    最近更新 更多