跳到主要内容

分层存储

旧窗口会被压缩成列式块并移至旁边的表,SELECT 会自动合并读取它们。应用程序无需知道数据是否已被压缩。

쓰기 ──▶ [ 핫 구간 ] ── hot_window 경과 ──▶ [ 콜드 청크 ] ── cold_window 경과 ──▶ 삭제
행 저장 <테이블>__chunks
◀────── SELECT 이 알아서 합친다 ──────▶

配置​

策略以JSON字符串形式放在表格 extensions 的映射的 timeseries_tiering 键下。

ALTER TABLE pp.tm_tag_point WITH extensions = {
'timeseries_tiering': '{"hot_window":"2d","chunk_window":"1d","cold_window":"3650d","interval":"1h"}'
};
键必填默认值含义
hot_window必填—比此年龄小的行不进行任何改动。必须大于等于 chunk_window
chunk_window1h重新编码窗口的长度。1个块 = 1个标签 × 1个窗口
cold_window无比此更旧的块整块删除。必须大于 hot_window
consistencyLOCAL_QUORUM重新编码器使用的CL。仅允许查询系列
interval5m此表的重新编码周期

时间语法请参考 <양의 정수><m|h|d>。未知键或规则违反 (如 hot_window < chunk_window、cold_window <= hot_window、低于查询CL等) 会在 ALTER TABLE 时被拒绝——不会被静默忽略。

编解码器无法选择

列类型决定编码方式。double 只有 ALP/ALP-RD 一种,值完全不变的列会以 CONSTANT 处理, 全部为null的列则以 ALL_NULL 处理,与行数无关,复杂度为 O(1)。 如果在策略JSON中放入 codec 键,会明确指向该键并拒绝。

释放​

ALTER TABLE pp.tm_tag_point WITH extensions = {};

新编码会停止,但已进入块的数据仍会继续合并显示。

操作​

# 지금 즉시 한 사이클 (interval 무시)
nodetool retier <keyspace> <table>

# 정책이 걸린 모든 테이블의 상태
nodetool tieringstatus

同样的内容也可通过CQL查看。

SELECT * FROM system_views.timeseries_tiering;
如果 tags_skipped 不为 0,则分层程度降低

这意味着最后一个完成周期未能将数据全部编码至截止点——压缩程度未达到其他计数器所暗示的水平。 只要存在任何跳过的标签,retier 就会以非零退出码失败。原始行未做改动,因此没有数据丢失。 请查看日志中的原因并重新运行。

统计信息是节点本地·内存中的,基于最后一次完成的执行——重启后会重置。 在多节点环境中,每个节点仅重新编码其自身主令牌范围内的标签,以分担工作。

注意事项​

  • **冷数据不可变。**对已进入块的数据区段的删除将被拒绝。
  • 迟到行按列进行合并。
  • 🔴 无分区键的全表扫描聚合会在分层表中返回错误值。 该路径不会合并块。此类查询请 通过 Spark SQL 执行。
  • 负载格式只有v4一种。一旦遇到已移除的旧格式,SELECT 不会静默跳过,而是会 失败——这比继续返回缺失历史数据的结果要好。

相关文档​