专栏
天翼云开发者社区

认识Rocks DB的version版本管理

2023-12-06 15:50:33 28阅读

RocksDB是通过version管理某一个时刻的db状态的,任何读写都是对一个version的操作,RocksDB有一套复杂的version管理机制,来实现同一时刻读的原子性。笔者通过拜读Rocks DB的源码,终于理清了versionSet,version,superVersion这些概念之间的关系。面向对象的开发语言中,要理清楚不通对象之间的关系,最直观的方式就是通过对象间的属性引用关系。本文尝试通过讲解对象的属性描述version的管理机制。

  1.  version:version是以ColumnFamily为单位生成的,一个ColumnFamily一个version。
    • cfd_: 版本所属的columnFamilyData
    • table_cache_:
    • storage_info_:保存当前version关联的StorageInfo,构造是通过传入的cfd_生成,传入一个cfd_->current()->storage_info作为ref_vstorage指针。
    • vset:所属的versionSet
    • next_:保存version链表上的下一个版本指针。
    • prev_: 保存上一个version版本指针。
    • 构造函数:version(cfd, vset, file_Opt, mutable_cf_opt, version_number,...)。
  2. versionSet: 一个db一个versionSet,包含这个db的所有ColumnFamily
    • ColumnFamilySet
    • WalSet:protected by db mutex
    • current_version_number: 维护version number,作为下一个version的version_number参数。
  3. versionStorageInfo:保存这个version的存储信息
    • user_comparator: 用户指定的compare function
    • files_: 关联的文件。
  4. versionEdit:
    • 对一个version的修改记录,会生成一个versionEdit
    • versionEdit里的操作会被写入manifest
    • version+versionEdit = new version
    • versionEdit提供addFile和deleteFile接口,用于处理sst文件的新增和删除。
  5. versionEditHandler:构造一个新的version时使用
    • version_set_:保存db的versionSet指针。
  6. SuperVersion:保存当前最新version和关联的memtable
    • cdf:所属ColumnFamily
    • mem:持有的memtable
    • imm:所有的immutable memtables
    • current:当前最新version指针
    • static int dummy:kSVInUse指向dummy
    • static void* const kSVInUse : 表示当前SV正在使用
    • static void: const kSVObsolete : 当前SV已经释放
  7. ColumnFamilyData:
    • dummy_versions_: head of version_list
    • current: dummy_versions->prev_
    • super_version_
    • local_sv_: local_copy of SuperVersion

      RocksDB的读写接口都是对一个ColumnFamily来的,那通过上面这些对象间的引用关系,我们就能直观看到一次读写或compaction操作了哪些对象。最后,用一个图来更直观展示下读写和compaction操作并发时,version的状态。

 

 

  • 0
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
王****威

王****威

4 篇文章 0 粉丝
关注

认识Rocks DB的version版本管理

2023-12-06 15:50:33 28阅读

RocksDB是通过version管理某一个时刻的db状态的,任何读写都是对一个version的操作,RocksDB有一套复杂的version管理机制,来实现同一时刻读的原子性。笔者通过拜读Rocks DB的源码,终于理清了versionSet,version,superVersion这些概念之间的关系。面向对象的开发语言中,要理清楚不通对象之间的关系,最直观的方式就是通过对象间的属性引用关系。本文尝试通过讲解对象的属性描述version的管理机制。

  1.  version:version是以ColumnFamily为单位生成的,一个ColumnFamily一个version。
    • cfd_: 版本所属的columnFamilyData
    • table_cache_:
    • storage_info_:保存当前version关联的StorageInfo,构造是通过传入的cfd_生成,传入一个cfd_->current()->storage_info作为ref_vstorage指针。
    • vset:所属的versionSet
    • next_:保存version链表上的下一个版本指针。
    • prev_: 保存上一个version版本指针。
    • 构造函数:version(cfd, vset, file_Opt, mutable_cf_opt, version_number,...)。
  2. versionSet: 一个db一个versionSet,包含这个db的所有ColumnFamily
    • ColumnFamilySet
    • WalSet:protected by db mutex
    • current_version_number: 维护version number,作为下一个version的version_number参数。
  3. versionStorageInfo:保存这个version的存储信息
    • user_comparator: 用户指定的compare function
    • files_: 关联的文件。
  4. versionEdit:
    • 对一个version的修改记录,会生成一个versionEdit
    • versionEdit里的操作会被写入manifest
    • version+versionEdit = new version
    • versionEdit提供addFile和deleteFile接口,用于处理sst文件的新增和删除。
  5. versionEditHandler:构造一个新的version时使用
    • version_set_:保存db的versionSet指针。
  6. SuperVersion:保存当前最新version和关联的memtable
    • cdf:所属ColumnFamily
    • mem:持有的memtable
    • imm:所有的immutable memtables
    • current:当前最新version指针
    • static int dummy:kSVInUse指向dummy
    • static void* const kSVInUse : 表示当前SV正在使用
    • static void: const kSVObsolete : 当前SV已经释放
  7. ColumnFamilyData:
    • dummy_versions_: head of version_list
    • current: dummy_versions->prev_
    • super_version_
    • local_sv_: local_copy of SuperVersion

      RocksDB的读写接口都是对一个ColumnFamily来的,那通过上面这些对象间的引用关系,我们就能直观看到一次读写或compaction操作了哪些对象。最后,用一个图来更直观展示下读写和compaction操作并发时,version的状态。

 

 

文章来自专栏

KV存储

4 篇文章 1 订阅
0 评论
0/1000
评论(0) 发表评论
  • 0
    点赞
  • 0
    收藏
  • 0
    评论