我在读谷歌的“大表”论文。我注意到5.3节里写着
更新被提交到存储重做记录的提交日志。在这些更新中,最近提交的更新存储在一个名为memtable的排序缓冲区中;旧的更新存储在SSTables序列中。
让我困惑的是,根据this的答案,SSTable应该存储已排序的键值对。但是从上面引用的文本来看,它给我的感觉是memtable和sstable都存储更新操作,而不是实际值。那么,当出现写请求时,bigtable实际上做了什么呢?
发布于 2019-08-26 16:37:56
根据正式文件1:
“Cloud表被分割成连续行块,称为平板,以帮助平衡查询的工作量。(平板电脑类似于HBase区域。)平板电脑以SSTable格式存储在谷歌的文件系统巨像上。SSTable提供了从键到值的持久化、有序的不可变地图,其中键和值都是任意字节字符串。每一块平板电脑都与一个特定的Cloud节点相关联。除了SSTable文件之外,一旦Cloud确认了这些数据,所有写入都会存储在Colossus的共享日志中,从而提高了耐用性。”
正式文件与本文件有一个链接,在该链接中将更详细地解释2:
“排序字符串表”就是它听起来的样子,它是一个文件,里面包含一组任意排序的键值对。重复的键很好,不需要对键或值进行“填充”,而键和值是任意的。
如果我们需要保留SSTables给我们的快速读取访问,但我们也希望支持快速随机写入,那么我们已经有了所有必要的部分:当SSTable在内存中时,随机写入是快速的,这就是memtable的定义。“
实际上,写过程中发生的事情是Tablet ( committed )生成一个提交的日志条目,描述突变,以及对memtable中行的修改。一旦这个memtable太大,整个memtable就被压缩成许多不可变的SSTables,按照局部性组(列族)进行分区,然后将每个元素添加到每个本地组的相应SSTables堆栈中。
请注意,每个SSTable不包含局部性组中所有行的单元格值,只包含最近的更新。读取可能需要对本地组中的一个或多个SSTables的更新进行分组才能构造响应。
有关如何移动突变以提高性能的更多信息,请参见第3篇文章中的"5.4压实“部分。此外,有关使用本地组的含义的更多信息,请参见"6精化“一节下的标题"Locality”。
https://stackoverflow.com/questions/57634795
复制相似问题