Cassandra - 数据建模时间序列 - 避免 "Hot Spots"?
Cassandra - Data Modeling Time Series - Avoiding "Hot Spots"?
我正在研究 Cassandra 数据模型来存储用户上传的记录。
潜在的问题是,一些用户可能会在 5 分钟内上传 50-100k 行,这可能导致分区键 (user_id) 的 "hot spot"。 (如果每个分区超过 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
获取所有上传记录
- 按日期范围搜索上传记录
范围
一些可能的想法:
使用复合分区键而不是 user_id。分区键的第二部分可以是从 1 到 n 的随机数。例如,如果 n 是 5,那么您的上传将分布在每个用户的五个分区上,而不是只有一个。缺点是当你读的时候,你必须重复n次才能读完所有的分区。
有一个单独的 table 来处理传入的上传,使用 rec_id 作为分区键。这将在所有可用节点上平均分配上传负载。然后将该数据放入 table 并使用 user_id 作为分区键,定期 运行 一个 spark 作业来提取新的上传并将它们添加到基于 user_id 的 table 以单个分区可以处理的速率。
修改您的前端以限制单个用户上传记录的速度。如果只有少数用户以足够高的速度上传导致问题,限制他们可能比修改整个架构更容易。
我正在研究 Cassandra 数据模型来存储用户上传的记录。
潜在的问题是,一些用户可能会在 5 分钟内上传 50-100k 行,这可能导致分区键 (user_id) 的 "hot spot"。 (如果每个分区超过 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 获取所有上传记录
- 按日期范围搜索上传记录 范围
一些可能的想法:
使用复合分区键而不是 user_id。分区键的第二部分可以是从 1 到 n 的随机数。例如,如果 n 是 5,那么您的上传将分布在每个用户的五个分区上,而不是只有一个。缺点是当你读的时候,你必须重复n次才能读完所有的分区。
有一个单独的 table 来处理传入的上传,使用 rec_id 作为分区键。这将在所有可用节点上平均分配上传负载。然后将该数据放入 table 并使用 user_id 作为分区键,定期 运行 一个 spark 作业来提取新的上传并将它们添加到基于 user_id 的 table 以单个分区可以处理的速率。
修改您的前端以限制单个用户上传记录的速度。如果只有少数用户以足够高的速度上传导致问题,限制他们可能比修改整个架构更容易。