cassandra - 如何配置 Cassandra TimeWindowCompactionStrategy
问题描述
我在 1-7 天后的时间序列数据TTLs
(取决于用例)。数据是不可变的,并按时间戳 ( cluster by timestamp
) 排序 - 数据在“写入时”加盖时间戳(因此新数据时间戳应始终是渐进式的)
分区大小不应超过 10K 项目 - 通常要少得多(最多10MB
为 10k 项目)。
我没有找到任何关于如何配置压缩策略(要考虑哪些参数)的好的文档,所以我决定这样做:
compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '7', 'compaction_window_unit': 'DAYS'}
绝对不确定这是正确的
KPI
我应该考虑什么?
解决方案
没有一个正确的答案:
由于您的配置,如果数据是在过去 7 天内插入的,则数据将被压缩在一起。TWCS 最大的优点是它可以在不读取它们的情况下使整个 SSTable 过期,因为它知道 SSTable 中的所有数据都已经过期。
在这种情况下,您在 1 天内 TTLd 的数据还不能过期,因为它将在 7 天的窗口中集中在一起。在最坏的情况下,您的 SSTable 将在 7 天窗口的末尾插入一个突变,因此整个 SSTable 将再保留 7 天,直到该突变过期。
这听起来不太理想,但至少您将能够从单个 SSTable 为该窗口中的所有数据读取提供服务。反过来,例如,您可以将窗口设置为一天。这将使您的数据过期得更快,但是对于存活 7 天的数据,您现在将接触 7 个 SSTables 而不是一个。
概括:
更大的时间窗口:更慢的到期时间,更快的实时数据读取速度更小的时间窗口:更快的到期时间,更慢的实时数据读取速度。
就像生活中的大多数事情一样,真相就在中间!虽然这两个选项都可以工作——而且您现在了解了权衡,但最好的窗口可能在 1 和 7 的中间。
推荐阅读
- ios - 弹出 iOS UINavigationController 时如何调用方法?
- html - 孩子不尊重其父母的大小 SwiftUI
- linux - .Net Core 3.1 是否具有检测 GPIO 引脚更改的事件驱动方法?
- python - 如何在python的polyglot中用本地目录覆盖下载器目录
- angular-material - Angular 材质表为每条记录增加一行,同时实现 Angular 9 中的行代码扩展
- bash - 如何从输入中查找用户并在不存在时创建用户
- kubernetes - 如何确保 pod 的可访问性
- c# - 有没有办法以编程方式使用任何 google 站点 api 在 google 站点中添加站点通知一次性消息?
- node.js - 保护后端 API 端点(MERN 应用程序)
- paypal - PayPal 根据使用情况向用户收费