Cassandra - 处理大数据量的分区和桶

Cassandra - Handling partition and bucket for large data size

我们有一个应用程序读取文件并在 Cassandra 数据库中插入数据的要求,但是 table 白天一次可以增长到 300+ MB。 table 将具有以下结构

create table if not exists orders (
id uuid,
record text,
status varchar,
create_date timestamp,
modified_date timestamp,
primary key (status, create_date));

'Status' 列可以具有值 [Started, Completed, Done] 根据 Internet 上的几个文档,如果小于 100 MB,则 READ 性能最佳,并且应该在修改最少的列上使用索引(因此我不能使用 'status' 列作为索引)。此外,如果我使用带有 TWCS 的存储桶作为分钟,那么将会有很多存储桶并且可能会产生影响。

那么,如何更好地利用分区 and/or 桶来跨分区均匀插入并读取具有适当状态的记录。

提前致谢。

从评论中的讨论来看,您似乎正在尝试将 Cassandra 用作队列,这是一个很大的反模式。
虽然您可以存储有关您在 Cassandra 中完成的操作的数据,但您应该为队列寻找类似 Kafka 或 RabbitMQ 的东西。

它可能看起来像这样:

  1. 应用程序 1 copies/generates 记录 A;
  2. 应用程序1将A的路径添加到队列中;
  3. 应用程序 1 根据文件 id/path 向分区中的 cassandra 更新(其他列可以是日期、复制时间、文件哈希等信息);
  4. 应用程序2读取队列,找到A,处理它并判断它是失败还是完成;
  5. 应用程序 2 向 cassandra 更新有关处理的信息,包括状态。你也可以有失败原因之类的东西;
  6. 如果失败那么你可以写path/id到另一个主题。

所以总而言之,不要尝试将 Cassandra 用作队列,这是全球公认的反模式。您可以而且应该使用 Cassandra 来保存您所做工作的日志,可能包括处理结果(如果适用)、文件的处理方式、结果等等。
根据您进一步需要如何读取和使用 Cassandra 中的数据,您可以考虑使用基于文件来源、文件类型等内容的分区和存储桶。如果没有,您可以将其按唯一值分区就像我在你的 table 中看到的 UUID。然后你可能会根据它来获取有关它的信息。

希望对您有所帮助,
干杯!