腾讯大数据 Flink 状态存储的探索与实践:计算存储分离架构
YanPeng Shi
中文演讲 #datastorage-
背景: Flink 作为一个有状态的流处理系统,其状态存储引擎扮演着至关重要的角色。在 Flink 中,状态用于在数据流计算过程中存储中间结果。Flink 通过 State Backend 组件为算子提供状态的读写服务。然而,在当前的计算存储一体化架构下,存在以下问题: a. 本地磁盘限制:RocksDB 中的状态数据高度依赖本地磁盘,当本地磁盘空间不足时,作业无法正常运行。 b. 检查点生成缓慢:检查点状态数据量大,导致上传时间长。此外,定期的检查点操作还会引发流量和 CPU 峰值,影响业务逻辑本身的处理速度和吞吐量。 c. 检查点恢复缓慢:原生恢复过程需要下载整个检查点状态文件,在状态量大的场景下恢复速度缓慢。
-
功能架构: a. Fuse 支持远程读写:基于 Fuse 机制,将远程存储挂载到本地目录,允许状态直接使用 RocksDB 的 POSIX 语义存储在远程分布式存储中。 b. 文件共享实现快速检查点:在计算存储分离架构下,状态文件数据在作业执行期间增量且异步地持久化到远程存储中。在生成作业检查点快照时,只需将 Memtable 中的少量数据刷新到远程存储,并附带相应的元数据。 c. 懒加载实现快速恢复:在计算存储分离架构下,状态后端支持对状态数据的远程访问。在状态恢复期间,用户只需下载少量元数据即可开始处理数据。随后,状态文件将根据缓存策略异步加载到本地磁盘缓存中,通过懒加载实现大状态作业的快速恢复。
-
性能优化: a. 读写缓存和元数据缓存:利用本地磁盘作为缓存,结合 RocksDB 自身的 Block Cache/Memtable 内存缓存,形成热-温-冷数据层次结构。频繁访问的温数据存储在内存和本地缓存中,而不常访问的冷数据则保留在远程存储中,从而降低状态访问延迟。 b. 本地缓存亲和性恢复调度:基于 TaskManager 状态缓存文件,最小化远程状态读取。在恢复调度期间,尽可能将作业重新调度到之前的位置,为作业提供更好的性能。
-
效果与收益: 作业处理性能对比:通过读写缓存,作业性能达到 RocksDB 本地模式的 80%。 时效性:作业恢复期间的停机时间减少了 60%。
-
未来计划: 智能缓存策略:开发更智能、更细粒度的缓存机制。 社区状态的异步批量访问:通过异步机制进一步减少远程状态访问的影响。 底层 Fuse 组件的热更新:底层 Fuse 组件的更新不会影响上层应用。
讲师:
YanPeng Shi,腾讯高级工程师,2021 年毕业于北京邮电大学,获得硕士学位,专注于 Flink 核心开发。