我正在使用Cassandra数据模型来存储用户上传的记录。
潜在的问题是,某些用户可能会在5分钟内上传50-100k行,这可能会导致分区密钥(user_id)出现“热点”。 (Datastax建议对每个分区超过10k的行重新考虑数据模型)。
如何避免在短时间内在分区键上有太多记录?
我已经尝试过使用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获取所有上传记录
按日期范围搜索上传记录
范围
最佳答案
一些可能的想法:
使用复合分区键,而不只是user_id。分区键的第二部分可以是1到n之间的随机数。例如,如果n为5,则您的上传内容将分散到每个用户五个分区中,而不只是一个。缺点是,当您读取数据时,必须重复n次才能读取所有分区。
有一个单独的表,以rec_id作为分区键来处理传入的上载。这会将上传的负载平均分配到所有可用节点上。然后,要以user_id作为分区键将数据放入表中,请定期运行spark作业以提取新上载,并以单个分区可以处理的速率将它们添加到基于user_id的表中。
修改前端以限制单个用户可以上传记录的速率。如果只有少数用户以足够高的速率上载而导致问题,那么限制他们而不是修改整个体系结构可能会更容易。
关于cassandra - Cassandra-数据建模时间序列-避免“热点”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31210871/