【问题标题】:Is Cassandra / ScyllaDB capable of handling millions of very wide data rows?Cassandra / ScyllaDB 是否能够处理数百万非常宽的数据行?
【发布时间】:2022-07-17 17:25:45
【问题描述】:

我们公司出现了一种新的业务需求,其中需要通过在线流程访问相对“大”的数据集(典型延迟高达 1 秒)。只有一个键具有高粒度/数以千万计的行数,并且预期的列/字段/值列数可能会超过数十万。

键列在所有值列之间共享,因此键值存储虽然可扩展,但在这里似乎相当浪费。对如此广泛的数据集使用 Cassandra / ScyllaDB(我们逐渐缩小搜索范围),同时理想地减少一半的数据存储需求(通过只存储一次公共密钥)是否有希望?

  • 重新设计数据库,拆分表,在许多理想情况下遵循一些规则将它们连接起来
  • 我不能重新设计它 - 商业用户可以但宁愿不......但我确实将问题缩小到 Cassandra/ScyllaDB(以解决最终选民对民意调查的担忧)。
  • 每个数据库都有限制,因为表的宽度使处理变得更加复杂和资源消耗。至于人类在大多数情况下无法处理那么多列,要弄清楚逻辑。因此,请使用 uuid 或您拥有的任何内容作为新表的连接列,以扩展第一个太大的表。
  • 我同意,它可能可以在关系数据库中实现,但想象一下复杂性......出于效率原因,每个这样的小表必须保持在 500 列以下,这要求数据维护人员将这 100k 字典分成至少 200表...

标签: database cassandra nosql storage scylla


【解决方案1】:

如果我正确理解你的用例,你的用例将有数千万分区(你所说的行),每个都会有数十万个不同的值(每个都是一个聚类行在现代 CQL 中 - CQL 不再支持未架构的宽行)。对于 Scylla 和 Cassandra 来说,这是一个相当合理的数据集。

但我想补充一点,我不确定您希望节省的存储空间是否真的存在。是的,Scylla/Cas​​sandra 不需要多次存储分区键,但除非分区键很长,否则与将数据存储在磁盘上的其他开销相比,这通常可以忽略不计。

您应该考虑的另一件事是您的预期查询。你将如何从这个数据库中读取数据?如果您要读取特定键的所有 100,000 列,或者它们的连续范围,那么您描述的数据模型是完美的。但是,如果预期的用例是您总是计划阅读单身的来自特定键的列,则此数据模型效率低下 - 从长分区中间读取随机访问比从短分区读取值慢。

【讨论】:

  • 该用例实际上是一个在线功能商店。我们已经有了一个,用 Redis 正确实现,但是这里 Redis 会占用太多内存,因为这里的键必须与唯一 ID 的范围一样长(不允许聚合)。我知道在功能商店中使用唯一 ID 很奇怪,但这是出于交叉销售的目的,将大多数数据丰富的产品的精确(非聚合)每个客户的功能转移到数据贫乏的产品中。
  • 是的,查询效率是一个非常有效的考虑因素。这就是排除 MinIO 的原因(在没有任何并发​​的情况下进行的测试表明,10 万次连续读取需要 1 小时而不是 < 1 秒)。但就像我们现有的基于 Redis 的功能存储一样,在这种情况下,传入的请求也将包含所有必要的查找键(这里:只有一个 - 唯一的客户 ID),这将允许一次查询所有 100k 值(假设我们设法正确地表示这个数据量)。
  • @nadav-harel:在成功的 PoC 之后,我刚刚提出了一个关于最佳数据结构的后续问题,您可能还会对此感兴趣:stackoverflow.com/questions/73015140/…
  • 至于查询效率,我刚刚在综合测试中验证,如果你的超时预算是 1 秒,那么 Cassandra 可以扩展到数十万(整数)列(共享相同的键),全部放入同一个宽表中,无论分区/行数如何 - 至少最多 1 百万。行。事实上,数据加载时间(来自 CSV 文件)被证明是这里的瓶颈...... dsbulk 需要数十个小时才能加载 10k(2 列)CSV 文件和 100 万。行。
  • 上传 10 GB 的数据不应花费“数十小时”(如果我正确理解您的数字)。我不知道“dsbulk”(我不熟悉)是否非常慢,或者是非常慢的 Cassandra(我更喜欢速度更快的 Scylla,但要充分披露——我是 Scylla 开发人员)。
猜你喜欢
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-07
相关资源
最近更新 更多