【问题标题】:bigtable: how does bigtable serves write request?bigtable:bigtable 如何处理写请求?
【发布时间】:2026-02-13 11:35:01
【问题描述】:

我正在阅读 google 的 bigtable 论文。我注意到在第 5.3 节中,它说

更新被提交到存储重做记录的提交日志。在这些更新中,最近提交的更新存储在内存中称为 memtable 的排序缓冲区中;较旧的更新存储在一系列 SSTable 中。

让我困惑的是,根据this 的回答,SSTable 应该存储排序后的键值对。但是从上面引用的文字中,我感觉memtablesstable都存储了更新操作,而不是实际的值。那么当有写入请求时,bigtable 实际做了什么?

【问题讨论】:

    标签: bigtable google-cloud-bigtable


    【解决方案1】:

    根据官方文档[1]:

    “Cloud Bigtable 表被分割成连续的行块,称为平板电脑,以帮助平衡查询的工作量。(平板电脑类似于 HBase 区域。)平板电脑以 SSTable 格式存储在 Google 的文件系统 Colossus 上。 SSTable 提供从键到值的持久、有序的不可变映射,其中键和值都是任意字节字符串。每个 tablet 都与特定的 Cloud Bigtable 节点相关联。除了 SSTable 文件之外,所有写入都存储在 Colossus 的共享日志中一旦它们被 Cloud Bigtable 确认,就可以提供更高的持久性。”

    官方文档有这个文档的链接,这里有更详细的解释[2]:

    ““排序字符串表”就是它听起来的样子,它是一个文件,其中包含一组任意的、排序的键值对。重复键很好,键或值不需要“填充”,键和值是任意 blob。

    如果我们需要保留 SSTable 为我们提供的快速读取访问权限,但我们还想支持快速随机写入,那么我们已经拥有所有必要的部分:当 SSTable 在内存中时,随机写入速度很快,即是memtable的定义。”

    实际上,在写入期间发生的事情是 Tablet Server(Cloud Bigtable 节点)生成一个提交的日志条目,描述突变,以及对 memtable 中行的修改。一旦这个 memtable 太大,整个 memtable 就会被压缩成许多不可变的 SSTable,按 locality group(列族)分区,然后每个 locality group 都添加到相应的 SSTable 堆栈中。

    请注意,每个 SSTable 不包含位置组中所有行的单元格值,仅包含最近的更新。读取可能需要将来自位置组中的一个或多个 SSTable 的更新分组以构建响应。

    有关如何移动突变以提高性能的更多信息,请参阅论文 [3] 中的“5.4 压缩”部分。此外,有关使用区域组的含义的更多信息,请参阅“6 改进”部分下的标题“区域组”。

    [1]https://cloud.google.com/bigtable/docs/overview#architecture

    [2]https://www.igvita.com/2012/02/06/sstable-and-log-structured-storage-leveldb/

    [3]https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf

    【讨论】: