Cassandra - 数据建模时间序列 - 避免“热点”?

时间:2015-07-03 16:15:49

标签: cassandra data-modeling datastax nosql

我正在使用Cassandra数据模型来存储用户上传的记录。

潜在的问题是,一些用户可能在5分钟内上传50-100k行,这可能导致分区键(user_id)的“热点”。 (如果每个分区超过10k行,则Datastax建议重新考虑数据模型。)

如何在短时间内避免在分区键上记录太多?

我尝试使用Time Series suggestions from Datastax,但即使我有年,月,日,小时列,也可能会出现热点。

CREATE TABLE uploads (
    user_id text
   ,rec_id timeuuid
   ,rec_key text
   ,rec_value text
   ,PRIMARY KEY (user_id, rec_id)
);   

用例是:

  • 按user_id
  • 获取所有上传记录
  • 按日期范围搜索上传记录 范围

1 个答案:

答案 0 :(得分:5)

一些可能的想法:

  1. 使用复合分区键而不仅仅是user_id。分区键的第二部分可以是从1到n的随机数。例如,如果n为5,那么您的上传将分布在每个用户的五个分区上,而不是一个。缺点是当你进行读取时,你必须重复n次以读取所有分区。

  2. 使用rec_id作为分区键,有一个单独的表来处理传入的上传。这将在所有可用节点上平均分配上载的负载。然后,使用user_id作为分区键将数据放入表中,定期运行spark作业以提取新的上载,并以单个分区可以处理的速率将它们添加到基于user_id的表中。

  3. 修改前端以限制单个用户上传记录的速率。如果只有少数用户以足够高的速率上传以引起问题,则可能更容易限制它们而不是修改整个架构。