Cassandra 中针对时序工作负载动态拆分宽分区 笔记

Cassandra 中针对时序工作负载动态拆分宽分区

Netflix 的 TimeSeries Abstraction 利用 Apache Cassandra 作为存储,以毫秒级延迟摄入和查询 PB 级的时序事件数据。宽分区(即单个分区随时间累积大量事件)对时序工作负载构成重大挑战,导致 Cassandra 集群中出现高读取延迟、超时、CPU 利用率上升以及垃圾回收停顿。为此,TimeSeries 数据被划分为离散的时间块,形成可管理的段。初始的预配策略依赖用户指定的工作负载特征和蒙特卡洛模拟来确定最优的基础设施和分区配置。然而,当工作负载未知、估算不准确、随时间演变或包含数据异常值时,该方法证明不足。为自动化调整,引入了后台工作进程,用于监控分区直方图,并根据观测到的数据密度动态重新划分未来的时间片。这种时间片重划分策略在大多数数据表现出类似宽分区行为时,能有效降低读取延迟和超时。然而,该策略并未解决仅少数 ID 在表中呈现宽分区的场景。针对此类情况,以及当调用方即使面临较高延迟也需要获取全部数据时,开发了按 ID 的动态分区。该异步流水线在读取操作期间检测宽分区,并将其透明地分割为最优大小。该过程包括检测、规划与分割,以及通过重定向查询至分割后的分区来服务读取请求。检测发生在读取操作超过配置的字节阈值时,此时会向 Kafka 发出事件。系统最初专注于不可变分区以简化实现。规划阶段读取整个分区以生成分割计划,并利用检查点机制处理故障。分割涉及将数据划分委托给特定策略,例如将更多事件桶分配给时间桶。验证分割至关重要,通过校验和确保数据完整性后再标记分割完成。最后,TimeSeries 服务器使用内存中的布隆过滤器高效地将读取查询重定向至分割后的分区,使得该重定向对调用方而言几乎不可见。
CdXz5zHNQW_JhVMWuRvRR.png