首页 > 解决方案 > Cassandra 数据建模 - 识别最佳行键

问题描述

我有一个平台,各种应用程序都放了笔记,笔记由 标识note_id,应用程序由 标识,app_key两者都是唯一的,我所有的查询都仅限于单个应用程序键,我不需要跨多个应用程序查询笔记.note_idapp_key

现在我必须选择一个主键。

如果我只选择app_key作为分区键集群键note_id,就会有很宽的行。也就是说,单个应用程序的所有笔记都将分组在一个分区中。app_key

所以:

  1. 查找所有notes一个app将是高效的(单分区查找)。
  2. 找到一个noteapp是有效的。
  3. 删除所有notes一个app将是高效的。
  4. 删除一个noteapp有效的。

但是,不能保证行的宽度notes,即单个app可以拥有的数量没有限制。数据分布将是不均匀的。所有notesapp都将在一个分区中,因此app拥有大量notes将创建一个巨大的分区,从而导致热点

现在让我们检查选项 B,分区将是app_keynote_key

在这种情况下,分区数app将取决于notes它将拥有的数量

  1. 查找所有notesapp不可能)

  2. 查找其中note一个app(假设查找分区很快)

  3. 删除所有notesapp不可能)

  4. 删除单note条速度很快(假设同上)


所以我的问题是:

标签: cassandra

解决方案


我的建议是您根据吞吐量将您划分为基于时间的存储桶(例如:每天/每周/每月/每年),这样您就不会受到宽行分区的影响。

例如,在每日分区的情况下,您的分区键将是 (app-key, insert_day)..这里 insert_day 是日期,例如 8-8-2018-00:00:00:000 ....

现在,当通过应用程序键读取所有笔记时,您需要从当天迭代到您不再找到数据的日子。删除也是如此。选择存储桶以减少迭代次数。

note-id (集群键)你可以把它的类型 time-uuid (它将从插入日期生成)..现在当涉及到通过 note-id 和 appkey 选择时.. 你可以计算所需的插入 -从节点 ID 值开始的日期(即,note-id -> insert-date ->insert-day)


推荐阅读