美文网首页
Bigtable与LevelDB关系与解释

Bigtable与LevelDB关系与解释

作者: 陀氏 | 来源:发表于2019-05-18 23:25 被阅读0次

    文章链接

    文章首先做了Bigtable的基本介绍,可参见阅读笔记,随后讨论了LevelDB与其关系及实现细节。

    LevelDB简介

    Bigtable只是一篇介绍性论文,并且使用了大量Google内部的组件如GFS\Chubby等,使我们难以理解其全貌。LevelDB是一个由Bigtable作者参与开发的,开源、单机版的Bigtable功能的一个实现。
    其接口非常简单易懂:

    class DB {
     public:
      virtual Status Put(const WriteOptions& options, const Slice& key, const Slice& value) = 0;
      virtual Status Delete(const WriteOptions& options, const Slice& key) = 0;
      virtual Status Write(const WriteOptions& options, WriteBatch* updates) = 0;
      virtual Status Get(const ReadOptions& options, const Slice& key, std::string* value) = 0;
    }
    

    写操作

    1. 调用MakeRoomForWrite,为内存预留足够空间。空间不足会发生一次minor compaction创建新memtabel(新memtable开始处理线上请求,老memtable开启minor compaction),并有可能因为新增的SSTable再触发一次merge compaction。
    2. 调用AddRecord新增一条日志
    3. 调用InsertInto往memtable中插入一条数据

    日志存储格式

    略过不提

    记录的插入

    Put\Delete方法内部都是往memtable里插入一条数据,传入不同的数据类型。数据包含键值、序列号与类型,拼接后存入内部的一个skiplist。每次读某键的最新数据,就可确认其是删除还是正常状态。

    数据的读取

    图示

    LevelDB 总会将新的键值对写在最前面,并在数据压缩时删除历史数据。前面的MemTable与IMM像是二级缓存,后面则有不同层级的SSTable文件,因为这种层级所以称为LevelDB。
    除了Level0需要全部遍历,后面可通过SSTable的smallest/largest信息找到对应的SSTable与对应的值,直到遍历到最后一个Level kNumLevels。

    后续很简略的说明了compaction的大体流程,和SSTable的存储方案,可以见原文:https://draveness.me/bigtable-leveldb

    相关文章

      网友评论

          本文标题:Bigtable与LevelDB关系与解释

          本文链接:https://www.haomeiwen.com/subject/fjgxzqtx.html