本文简要介绍了 Flink Table Store 底层文件存储的数据结构——LSM 树的相关概念。

LSM 树,亦称日志结构合并树,英文为 log-structured merge-tree。

Sorted Runs

如下图所示,LSM 树将文件组织成若干个 Sorted Run,一个 Sorted Run 由一个或多个数据文件组成,每个数据文件只会隶属一个 Sorted Run。数据文件中的记录按主键排序,在一个 Sorted Run 中,数据文件的主键范围不会有重叠的情况。但在不同的 Sorted Run 中主键范围有可能会重叠,甚至是包含相同的主键。

LSM 树

当查询 LSM 树时,必须先合并所有的 Sorted Run,根据用户指定的合并引擎和每条记录的时间戳合并具有相同主键的所有记录。而新的记录在写到 LSM 树之前会先缓存在内存中,当内存缓冲区满时,内存中的所有记录会先进行排序,然后再刷到磁盘上,此时就创建了一个新的 Sorted Run。

Compaction

随着越来越多的记录写入 LSM 树,Sorted Run 的数量也会越来越多。因为查询 LSM 树需要先合并所有的 Sorted Run,而过多的 Sorted Run 会导致查询性能不佳,甚至是内存不足。为了限制 Sorted Run 的数量,必须时不时地将几个 Sorted Run 合并成一个大的 Sorted Run,我们称这个过程为文件合并(Compation)。

文件合并是一个资源密集型的过程,会消耗一定的 CPU 时间和磁盘 IO,过于频繁的合并操作可能会导致写入速度变慢。这是查询和写入性能之间的权衡。Flink Table Store 目前采用了类似于 Rocksdb 的通用合并策略。

默认情况下,Flink Table Store 写入器追加记录到 LSM 树时,也会根据需要进行文件合并操作。用户也可以选择在一个专门的文件合并作业中执行文件合并操作。

(END)