我正在考虑使用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);
我有两种类型的查询:
以上架构可以帮我做到吗?我需要非常快速地在这个表中放入数十亿条记录,并在发生所有插入后进行读取。与写入相比,读取查询不是太多,但我需要尽快恢复数据。
使用此表结构,您只能执行第二个查询 - 您只需要分别对每个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中的元数据。