Cassandra 数据建模 blob

Cassandra data modeling blob

我正在考虑使用 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_id 和 messages_blob。
  2. 一次获取一堆 server_id 的所有 messages_blob。

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

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

对于第一次查询,此 table 结构将不起作用,因为 Cassandra 需要知道分区键 (server_id) 才能执行查询 - 否则它将需要全扫描,当您在 table 中有足够的数据。

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

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

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

这将需要您将数据写入 2 tables,或者您可以使用物化视图来完成此任务(尽管如果您使用 OSS Cassandra 可能会有问题,因为它有很多错误) ).但是您需要注意该查找的分区大小 table.

使用 Spark 扫描 table - 因为您将 start 作为第一个聚类列,然后 Spark 将能够执行谓词下推,并且过滤将在 Casasndra 内部进行。但它会比使用查找 table.

慢得多

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