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

use*_*445 2 data-modeling cassandra nosql datastax

我正在研究Cassandra数据模型来存储用户上传的记录.

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

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

我尝试过使用Datastax时间序列建议,但即使我有年,月,日,小时列,也可能会出现热点.

CREATE TABLE uploads (
    user_id text
   ,rec_id timeuuid
   ,rec_key text
   ,rec_value text
   ,PRIMARY KEY (user_id, rec_id)
);   
Run Code Online (Sandbox Code Playgroud)

用例是:

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

Jim*_*yer 6

一些可能的想法:

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

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

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