我计划将数据从现有数据库(Postgres(迁移到Cassandra。以下是该系统的简要概述:
- 当前数据集大小约为 20 亿
- 每个数据点代表一个事件。此事件的属性为 -
user_id
、event_name
、timestamp
- 这些数据来自一组有限的来源 - 为了简单起见,我们假设 3 个不同的来源 S1、S2、S3 - 所有这些都在推动一个 Kafka 主题。此 cassandra 微服务正在使用本主题中的数据。
- 来自 S1、S2 和 S3 的数据速率不同。假设 S1 每分钟为单个用户推送 1 个事件,S2 每 15 分钟为每个用户推送 1 个事件,S3 每 1 小时为每个用户推送一个事件。
- 此系统应支持两种类型的查询
- 获取给定用户的最新事件
- 获取给定用户和日期范围的事件列表(此数据范围的差异最多为 30 天(
我正在尝试使用几种不同的方法对这些数据进行建模。
- 将单个用户的数据分区为每月存储桶。对于此附加参数
timestamp_year
,将添加timestamp_month
。timestamp
使用群集密钥。- 优点:写入延迟小于 10 毫秒。最大分区大小约为~60MB(适用于Cassandra 3.11(。获取最新事件在不到 10 毫秒(99.999 个百分位数(内正常工作。
- 缺点:获取月级数据很慢,因为从单个分区读取的数据太多。如果我限制要获取的记录数(假设 10000(,延迟会改善。分区大小是不均匀的,因为来自 3 个不同源的数据速率不同。
我尝试使用每周存储桶而不是每月存储桶和分页来改进其他参数。但这是我无法解决的问题分区大小是不统一的,因为来自 3 个不同来源的数据速率不同。
如何在这样的数据模型中保持分区大小一致(几乎(?欢迎提出想法。
这是一个经典问题,没有简单的解决方案可以使分区大小统一。如果可以预测每个用户的引入速率,则可能可以具有不同的用户存储桶,例如高、中和低引入用户。
根据类型,时间范围会有所不同。对于高引入用户,分区表示一天,对于低引入用户,分区表示一个月。
为了加快对高引入用户的月查询速度,可以运行 30 天的并行查询,看看它是否有助于优化查询时间。