Cassandra数据建模blob

问题描述 投票:0回答:1

我正在考虑使用cassandra来存储我的数据。我有一个server_id,start_time,end_time,messages_blob。

CREATE TABLE messages (
    server_id uuid,
    start bigint,
    end bigint,
    messages_blob blob,

    PRIMARY KEY ((server_id), start,end)
) WITH CLUSTERING ORDER BY (start,end);

我有两种类型的查询:

  1. 在开始时间> 100并且开始时间<300时获取所有server_ids和messages_blob。
  2. 一次获取所有messages_blob的一堆server_ids。

以上架构可以帮我做到吗?我需要非常快速地在这个表中放入数十亿条记录,并在发生所有插入后进行读取。与写入相比,读取查询不是太多,但我需要尽快恢复数据。

sql cassandra nosql data-modeling
1个回答
0
投票

使用此表结构,您只能执行第二个查询 - 您只需要分别对每个server_id执行查询,最好通过异步API执行。

对于第一个查询,此表结构将不起作用,因为Cassandra需要知道分区键(server_id)来执行查询 - 否则它将需要一个完整的扫描,当您在表中有足够的数据时将超时。

要执行此查询,您有多种选择。

添加另一个将start作为分区键的表,并且您可以在第一个表中存储记录的主键。像这样的东西:

create table lookup (start bigint, server_id uuid, end bigint, 
   primary key(start, server_id, end));

这将要求您将数据写入2个表,或者您可以使用物化视图执行此任务(尽管如果您使用OSS Cassandra可能会有问题,因为它有很多错误)。但是你需要注意查找表的分区大小。

使用Spark扫描表 - 因为你有start作为第一个聚类列,然后Spark将能够执行谓词下推,并且过滤将在Casasndra内部发生。但它比使用查找表要慢得多。

另外,要非常小心blob - Cassandra不能很好地处理大blob,所以如果你的blob大小超过1Mb,你需要将它们分成多个部分,或者(更好)将它们存储在文件系统中或者其他一些存储,比如S3,并且只保留Cassandra中的元数据。

© www.soinside.com 2019 - 2024. All rights reserved.