在cassandra中设计分区所需的建议

Suggestion required to design partitioning in cassandra

我必须为在接下来的 24 个月内通过多个供应商获得的数百万 material 的客户设计数据库。因此,数据库将在接下来的 24 个月内每天存储特定供应商提供的每个 material 的价格。所以我们保留过去的数据。现在查找将发生在:

  1. 查找供应商在客户指定日期的 material 价格。
  2. 查找供应商在客户的一段时间内 material 的价格。

我可以认为主键为:

  1. 分区键:(客户 Id,material Id,供应商 Id,日期) -- 这会导致性能问题吗,因为它会在 运行 中产生如此多的分区?
  2. Partition Key: (customer Id, material Id, supplier Id, monthbucket), 聚类键: date -- monthbucket 将按月在同一分区上存储 material 的数据,并将 2020 年 2 月日期的值类似于“202002”。

另一个问题是如何确保我的数据在节点之间均匀分布。

注:

  1. 客户、material、供应商和日期的组合是唯一的。
  2. 两个客户可以有相似的 material ID。

要点: 1. 一些客户可能拥有非常小的数据集,而另一些客户可能拥有庞大的数据。由于日期是所有客户的常量字段,因此我们可以如何在分区之间均匀分布数据。此外,material ID 在不同客户之间可以相同,因为存在内部表示(可能是数字或字母数字)

  1. 每个客户的供应商数量和 material id 在 1 - 20 之间变化。 你有什么建议或问题吗?

谢谢。

这取决于每个客户有多少供应商。因为您总是对客户 ID 和 material ID 有查询,所以我建议至少将这些列制作成分区键。如果你有太多的供应商,你也可以把它移到分区键中。而且我会避免使用每月存储桶 - 这会使查询变得困难。

因此您可以使用以下主键:

  1. ((customer, material, supplier), date)
  2. ((customer, material) supplier, date)

both 将允许有两个查询:

  1. select * from table where customer = ... and material = ... and supplier = ... and date = ...
  2. select * from table where customer = ... and material = ... and supplier = ... and date >= start and date <= end

但我建议使用第一个分区不会太大,也不会太小。