表特性

本文将为您介绍表的功能特性,远程存储、列裁剪以及日志压缩。

表特性概览

  • 远程存储:为保障低延迟,最新数据保留在本地磁盘。较旧数据则异步迁移至远程存储,以降低本地存储成本。

  • 列裁剪:查询时只读取所需列,跳过无关列,减少数据读取量。

  • 日志压缩:使用 Arrow 原生压缩机制,压缩后显著降低网络传输与存储成本。

远程存储

远程存储指成本更低、可靠性更高的外部存储系统,例如 S3、HDFS 或阿里云 OSS。阿里云实时流存储 Fluss 默认使用 OSS 作为远程存储。

  • Fluss 利用远程存储实现数据分层与容错。

  • 对于日志表,远程存储保存分层的日志数据段。

  • 对于主键表,远程存储保存快照和变更日志的数据段。

远程日志机制

Fluss 是流式存储系统,数据通常通过尾部读取被消费。为保障低延迟,最新数据保留在本地磁盘。较旧数据则异步迁移至远程存储,以降低本地存储成本。

表级配置

日志段复制到远程后,本地副本通常会被删除,以节省空间。但为提升读取性能,可选择在本地保留最近的若干日志段。

配置项

数据类型

默认值

说明

table.log.tiered.local-segments

整数

2

可指定在本地保留的日志段数量。

集群级配置

以下配置项控制日志分层行为:

配置项

数据类型

默认值

说明

remote.log.task-interval-duration

时间间隔

1分钟

远程日志管理任务的执行周期。包括复制、清理和删除操作。设为 0 秒则禁用远程日志功能。

remote.log.index-file-cache-size

内存大小

1GB

本地缓存中用于存放远程索引文件的总空间。

remote.log-manager.thread-pool-size

整数

4

调度远程日志任务的线程池大小。

remote.log.data-transfer-thread-num

整数

4

上传和下载远程日志文件(数据、索引、元数据)所用的线程数量。

log.segment.file-size

内存大小

1GB

用于控制日志文件的大小。日志的保留和清理始终以单个文件为单位进行,因此较大的文件意味着更少的文件数量。

与表级别配置table.log.tiered.local-segments共同决定本地磁盘的空间大小,默认值为1GB。

主键表的远程快照

  • 主键表的数据按分桶(bucket)分布。每个分桶在本地仅保留一个副本,无从副本。

  • 为防止本地磁盘故障导致数据丢失,Fluss 定期生成快照并上传至远程存储。

  • 快照包含数据副本和一个日志偏移量(log offset),表示快照生成后下一个待读取的变更位置。

  • 当节点故障时,Fluss 可从远程下载快照,并重放后续变更日志,在其他节点上恢复数据。

  • 快照与日志偏移量保证一致性,使客户端能无缝从全量读取(快照)切换到增量订阅(变更日志),避免数据重复或丢失。

集群级快照配置

配置项

数据类型

默认值

说明

kv.snapshot.interval

时间间隔

10分钟

主键表快照的生成周期。

kv.snapshot.scheduler-thread-num

整数

1

负责调度本机所有快照任务的线程数量。

kv.snapshot.transfer-thread-num

整数

4

上传和下载快照文件所用的线程数量。

kv.snapshot.num-retained

整数

1

保留已完成快照的最大数量。建议设为较大值,防止客户端读取过程中快照被删除。

列裁剪

列裁剪是一种优化技术,查询时只读取所需列,跳过无关列,减少数据读取量。Fluss 支持流式读取中的列裁剪 ,是业内少数能在实时流场景下实现该能力的系统。

  • Fluss 在日志表和主键表的变更日志中均支持列裁剪。它降低存储 I/O、减少网络传输、减轻客户端解析负担,显著提升查询性能。

  • 无论批处理还是流处理,系统始终只处理必要字段,最大化资源利用率。

计算引擎(如 Flink)在执行查询时会分析所需列,并通知 Fluss 仅返回这些列。

SELECT id, name FROM log_table WHERE timestamp > '2023-01-01'

该查询仅读取idname 和 timestamp 列。表中的其他列(如 address、status)不会从存储加载,彻底避免无效读取。

日志压缩

Fluss 使用 Arrow 原生压缩机制,压缩后数据仍符合 Arrow 格式标准。压缩按列独立执行,保留列裁剪能力,不影响查询性能。

压缩流程

  • 日志表 :数据在客户端由写入器压缩,以压缩格式写入存储;读取时由日志扫描器解压。

  • 主键表的变更日志 :日志在服务端生成,压缩也在服务端完成。

压缩效果

压缩显著降低网络传输与存储成本。基准测试显示,ZSTD 压缩级别 3 可实现约 5:1 的压缩比 (例如,5GB 数据压缩至 1GB)。网络开销减少,读写吞吐量随之提升。

配置方式

参数

默认配置

说明

table.log.arrow.compression.type

ZSTD

压缩算法:

  • NONE

  • LZ4_FRAME

  • ZSTD

table.log.arrow.compression.zstd.level

3

压缩级别,取值为:

1 ~ 22。

配置示例

-- 设置压缩算法为 ZSTD,压缩级别为 2
CREATE TABLE log_table (
  order_id BIGINT,
  item_id BIGINT,
  amount INT,
  address STRING
) WITH (
  'table.log.arrow.compression.type' = 'ZSTD',
  'table.log.arrow.compression.zstd.level' = '2'
);
重要
  • 压缩配置仅适用于table.log.format='arrow'的表。

  • 若设置table.log.format='indexed',压缩配置将被忽略。