Apache Fluss作为阿里巴巴与Ververica合作开发的面向Apache Flink的表存储引擎,正在引领分布式数据存储的变革。它不仅回应了Flink对低延迟、高效率表存储的需求,也在架构设计上突破了传统基于对象存储的局限,成为实时数据湖仓架构中的关键环节。深入理解Fluss的设计理念、核心功能和应用模式,有助于数据工程师和架构师精准选择大数据实时处理方案。 Fluss设计的初衷是打造一个解耦且高性能的分布式表存储系统,服务于Flink的流计算场景。它通过分布式集群管理的tablet服务器和协调器服务器,实现对表数据的高效存储和协调管理。相比之前的Apache Paimon,Fluss更加注重提高实时写入效率和变更日志(changelog)的生成能力,以满足Flink针对低延迟数据访问的要求。
Fluss支持三大核心功能:低延迟表存储、追加写入的日志表,以及拥有主键的可变更表(Primary Key Tables)。日志表采用改编自Kafka的日志复制协议实现,结合列式Arrow IPC格式,大幅提升了存储及读取的灵活性和效率。主键表则基于RocksDB实现局部存储,通过子级日志表维护变更日志,确保数据的实时一致性与高效更新。 低延迟是Fluss设计的基石。相比传统基于对象存储的表格式,Fluss在集群内部使用多个日志tablet作为数据分片,每个tablet类似Kafka分区,保证了高吞吐量和可靠复制。客户端负责将数据分发到指定的分区和bucket,结合智能的分配策略(如哈希、轮询),有效均衡写入压力。
数据以Arrow列式格式批量存储,实现投影下推,尽量减少网络和磁盘IO。 Fluss的日志表不仅允许快速的追加写操作,还针对Flink的流数据场景做了优化。它支持区分不同变更类型,诸如追加、插入、更新前后和删除,便于上游Flink作业准确捕获数据流中的修改状态。利用日志tablet的复制协议,Fluss确保数据的高可用性和一致性,在发生故障时快速恢复数据并保持系统稳定。 主键表提供了流式数据的可变更存储能力,支持更新和删除操作。通过结合RocksDB的高效键值存储,主键表实现了快速数据查找和局部更新。
每个主键表桶关联一个KV tablet,该tablet内维护了RocksDB存储的状态和对应的日志tablet作为写前日志(WAL)。当写入变更发生时,Fluss会先计算变更记录,写入子日志tablet,并等待日志复制提交后,再将数据同步到RocksDB,确保写入的原子性和持久性。 与Paimon相比,Fluss对变更日志的处理更高效。Paimon在生成变更日志时必须依赖昂贵的查表操作或全表压缩,而Fluss直接利用RocksDB状态与日志tablet的配合,实现了更低的延迟和更高的准确性。这不仅减轻了Flink作业的状态管理负担,也使得各个Flink任务可以通过共享的主键表进行快速查找与关联操作,促进了数据的统一访问。 值得注意的是,Fluss的存储管理支持多层级分层(tiering)机制。
内部分层由tablet服务器执行,将日志数据的历史段落上传至对象存储,实现存储空间的弹性扩展。客户端在访问时可自动识别实时与历史数据区分,并完成数据的统一拼接,用户对冷热数据无感知。湖仓分层层级则通过Flink作业将Fluss中的实时数据导出至Paimon等湖仓表格式,形成冷热数据分离,满足更大规模的分析需求。 Fluss的协调器节点则负责集群元数据管理、协调内部及湖仓的分层任务,并为客户端提供元数据查询接口。其架构灵感来源于Kafka的KRaft机制,实现了高效的状态协调与任务分配。客户端则承担了复杂的读写抽象逻辑,负责将背后的多层存储虚拟成统一的表结构供Flink作业调用,极大提升了数据融合和访问便捷性。
Fluss与Flink的深度整合表现为它对Flink Source API的支持。Flink通过Split和Split Enumerator划分读取任务,Fluss将表的分区和桶映射成对应的split,由任务节点以并行化方式读取实时日志和历史快照,实现流式数据的连续消费与准确恢复。对于主键表,还支持混合模式读取,先加载RocksDB快照再持续消费变更日志,确保完整视图。 在数据格式与协议上,Fluss对Kafka协议进行了改进。它引入了固定的表结构和列式存储,替代Kafka的无模式字节流,支持SQL级别的列投影和未来的行过滤。同时,Fluss保留与Kafka相似的高可用复制逻辑,但不支持自动消费者组管理,由Flink负责从上游细粒度管理消费者任务,适配流批融合的需求。
Fluss的设计还兼顾了未来扩展性。计划支持更复杂的架构如模式演进和多种表合并策略。当前已支持通过不同的合并引擎,实现更新数据的先进合并逻辑,比如取版本较新或首条的记录。部分更新也被支持,允许客户端仅提交变更列,大幅减少传输和存储开销。 然而,Fluss仍面临一些挑战。它的RocksDB状态尚不可层级存储,导致主键表容量受限于单机磁盘。
状态恢复在领导者切换时可能耗时较久,影响部分场景下的可用性。架构尚缺乏完善的生命周期管理,目前数据过期主要基于TTL,湖仓层与实时层的寿命管理尚未完全联动,增加了运维复杂度。 面向未来,Fluss致力于成为跨湖仓引擎的实时层,不仅支持Paimon,也计划扩展对Iceberg等主流开表格式的支持,为更多分析引擎如Spark提供服务。通过打通实时与历史数据,Fluss将推动流批一体化架构走向成熟,并可能通过引入Kafka兼容API,成为Next-Gen事件流与表存储融合平台。 总体来看,Apache Fluss以其独特的架构创新和紧密的Flink生态整合,为实时表存储提供了极具竞争力的解决方案。它借鉴了Kafka和RocksDB的设计精华,同时解决了传统对象存储表格式的低效问题。
随着功能完善和社区壮大,Fluss无疑将在大数据实时计算和湖仓领域占据更加重要的地位。选择Fluss不仅是拥抱性能和效率,更是迈向下一代数据存储智能化的关键一步。 。