cassandra数据建模blob

q8l4jmvw  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(403)

我正在考虑使用cassandra来存储我的数据。我有一个服务器id,开始时间,结束时间,消息。

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);

我有两种类型的查询:
在开始时间>100和开始时间<300时获取所有服务器ID和消息\u blob。
一次获取一堆服务器ID的所有消息。
上面的模式能帮我吗?我需要很快地将数十亿条记录放入这个表中,并在所有插入发生后进行读取。与写操作相比,读取查询并不太多,但我需要尽快返回数据。

3qpi33ja

3qpi33ja1#

使用这个表结构,您只能执行第二个查询—您只需要对每个表执行查询 server_id 另外,最好通过异步api。
对于第一个查询,这个表结构不起作用,因为cassandra需要知道分区键( server_id )执行查询-否则需要进行完全扫描,当表中有足够的数据时,扫描将超时。
要执行此查询,您有几个选择。
添加另一个将具有 start 作为分区键,您可以在第一个表中存储记录的主键。像这样:

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

这将要求您将数据写入两个表中,或者您可以使用materialized view来执行此任务(尽管如果您使用oss cassandra可能会有问题,因为它有很多bug)。但您需要小心查找表的分区大小。
使用spark扫描table-因为你有 start 作为第一个集群列,spark将能够执行 predicate 下推,并且过滤将在casasndra内部进行。但这比使用查找表要慢得多。
另外,对blob要非常小心-cassandra不能很好地处理大blob,所以如果有大小超过1mb的blob,则需要将它们拆分为多个部分,或者(更好)将它们存储在文件系统或其他存储设备(如s3)上,并只保留cassandra的元数据。

相关问题