Cassandra 卡桑德拉-数据建模时间序列-避免“;热点;?
我正在研究一个Cassandra数据模型来存储用户上传的记录 潜在的问题是,一些用户可能会在5分钟内上传50-100k行,这可能会导致partton密钥(user_id)出现“热点”。(Datastax建议,如果每个分区超过10k行,则重新考虑数据模型) 如何避免在短时间内分区键上有太多记录 我尝试过使用,但即使我有年、月、日、小时列,热点仍然可能出现Cassandra 卡桑德拉-数据建模时间序列-避免“;热点;?,cassandra,data-modeling,datastax,nosql,Cassandra,Data Modeling,Datastax,Nosql,我正在研究一个Cassandra数据模型来存储用户上传的记录 潜在的问题是,一些用户可能会在5分钟内上传50-100k行,这可能会导致partton密钥(user_id)出现“热点”。(Datastax建议,如果每个分区超过10k行,则重新考虑数据模型) 如何避免在短时间内分区键上有太多记录 我尝试过使用,但即使我有年、月、日、小时列,热点仍然可能出现 CREATE TABLE uploads ( user_id text ,rec_id timeuuid ,rec_key
CREATE TABLE uploads (
user_id text
,rec_id timeuuid
,rec_key text
,rec_value text
,PRIMARY KEY (user_id, rec_id)
);
用例包括:
- 按用户id获取所有上载记录
- 按日期范围搜索上载记录 射程
- 使用复合分区键,而不仅仅是用户id。分区键的第二部分可以是1到n之间的随机数。例如,如果n为5,那么您的上载将分布在每个用户的五个分区上,而不是一个分区。缺点是当您进行读取时,必须重复n次才能读取所有分区
- 使用rec_id作为分区键,有一个单独的表来处理传入的上传。这将在所有可用节点上平均分配上载负载。然后,为了将该数据放入以user_id作为分区键的表中,定期运行spark作业以提取新的上载,并以单个分区可以处理的速率将它们添加到基于user_id的表中
- 修改前端以限制单个用户上载记录的速率。如果只有少数用户以足够高的速率上传,导致出现问题,那么限制他们可能比修改整个体系结构更容易
- 一些可能的想法:
您能否发布一个您可能尝试的示例查询?这将有助于确定一个有用的时间段。1)从上传中选择rec_id、rec_key、rec_value,其中user_id='fred';2) 在方法1中,从上传中选择rec_id、rec_key、rec_value,其中user_id='fred'和rec_id>=maxtimeuid('2015-01-01 00:00+0000')和rec_id