【问题标题】:Suggestion required to design partitioning in cassandra在 cassandra 中设计分区所需的建议
【发布时间】:2020-02-10 14:03:17
【问题描述】:

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

  1. 查找供应商截至客户特定日期的材料价格。
  2. 查找供应商在客户一段时间内的材料价格。

我可以认为主键为:

  1. 分区键:(客户 ID、物料 ID、供应商 ID、日期) -- 这是否会导致性能问题,因为从长远来看它会产生如此多的分区?
  2. Partition Key: (customer Id, material Id, supplier Id, monthbucket), clustering key: date --monthbucket 将按月在同一分区上存储材料的数据,并将 2020 年 2 月日期的值类似于“202002”。

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

注意:

  1. 客户、材料、供应商和日期的组合是独一无二的。
  2. 两个客户可以有相似的材料 ID。

关键点: 1. 一些客户可能拥有非常小的数据集,而另一些客户可能拥有庞大的数据。由于日期是所有客户的常量字段,我们可以在多大程度上均匀地跨分区分配数据。此外,不同客户之间的材料 ID 可以相同,因为存在内部表示(可能是数字或字母数字)

  1. 每个客户和材料 ID 的供应商数量从 1 到 20 不等。 您有什么建议或问题吗?

谢谢。

【问题讨论】:

    标签: design-patterns cassandra database-partitioning


    【解决方案1】:

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

    所以你可以使用以下主键:

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

    两者都允许同时进行两个查询:

    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

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

    【讨论】:

    • 非常感谢,Alex 的建议真的很有帮助。只是为了回答您的问题:“这取决于每个客户有多少供应商” - 每个客户的供应商数量和材料 ID 的数量从 1 到 20 不等。此外,有些客户的数据集可能非常小,而其他客户则可以拥有大量数据。我们如何在分区之间均匀分布数据,因为日期是所有客户的常量字段
    • 如果每个客户/材料最多有 20 个供应商,那么您可以将其从分区键移动到集群列 - 每个分区最多有 14k 行。如果您有很多客户和材料 - 那么这不是问题,因为每个组合都会生成不同的分区键,并且数据将分布在节点上
    • 谢谢,亚历克斯我明白了。假设我只需要提供#1 项目,即“查找供应商在客户特定日期的材料价格”。那么你应该在分区键中包含日期吗?那么分区数会影响数据库性能吗?
    • 我建议不要将date 放入分区键,因为您将无法使用日期范围进行查询。通常分区的数量会影响一些事情,例如内存消耗,因为如果我们有更多的分区,我们需要更多的内存用于布隆过滤器......此外,非常小的行并不总是对性能最佳
    • 谢谢,Alex 我明白你的意思了。还有一件事,我有客户 ID 作为数字值,例如 1,2,3,4,....100(我们称之为租户 ID),材料 ID 是特定于客户的字母数字(这意味着数百万它们最终将具有相似数字的项目)。这是否会以类似的哈希键结束,从而根据分区键组合进入单个节点)。在节点之间平均分配数据不是问题吗?或者 Cassandra 有一些智能来根据可用磁盘空间分配节点。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 2011-11-27
    • 2015-08-29
    • 2012-01-09
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多