Google BigTable 是一个使用 LSM-tree 作为其核心数据结构进行存储的系统。LSM-tree 可以使用不同的合并策略。最常见的两个是(1)更读优化的水平合并,和(2)更写优化的分层合并。这些合并策略可以通过调整相邻级别之间的大小比来进一步配置。
我无法在任何地方找到 BigTable 在这些方面的默认行为,以及是否可以对其进行调整。因此,很难理解它的默认性能属性以及如何使它们适应不同的工作负载。
通过分层合并,一层 LSM-tree 集合会一直运行,直到达到容量为止。然后它合并这些运行并将生成的运行刷新到下一个更大的级别。每个级别最多运行O(T * log_T(N)),写入成本为O(log_T(N) / B),其中N是数据大小,B是块大小,T是大小级别之间的比率。
使用分级合并,LSM-tree 的每一级都有一个运行。一旦新的运行进入级别,就会发生合并,如果级别超过容量,则生成的运行将被刷新到下一个更大的级别。每个级别最多运行 O(log_T(N)) 次,写入成本为 O((T * log_T(N)) / B)。
因此,这些方案具有不同的读/写性能属性。但是,我一直无法找到有关 Google 的 BigTable 是使用分级合并还是分层合并的来源,以及默认大小比 T 是多少?另外,系统的这些方面是固定的,还是可调的?