mini-lsm通关笔记Week3Overview
Week 3 Overview Multi-Version Concurrency Control
在这一部分中,您将在前两周构建的LSM引擎上实现MVCC。我们将在key中添加时间戳编码以维护key的多个版本,并更改引擎的某些部分以确保根据是否有用户读取旧版本来保留旧数据或进行垃圾收集。
本教程中实现的MVCC方法受到BadgerDB启发。
MVCC的关键是在存储引擎中存储和访问一个key的多个版本。因此,我们需要将密钥格式改为user_key +时间戳(u64)。在用户接口方面,我们需要新的API来帮助用户访问历史版本。总之,我们将为键添加一个单调递增的时间戳。
在前面的部分中,我们假设较新的键位于LSM树的上层,而较旧的键位于LSM树的下层。在合并过程中,如果在多个级别中发现多个版本,我们仅保留键的最新版本,并且合并过程将通过仅合并相邻级别/层来确保较新的键将保留在较高的级别。在MVCC实现中,时间戳较大的key为最新的key。在合并过程中,只有当没有用户正在访问旧版本的数据库时,我们才能删除密钥。虽然不在上层保留最新版本的key可能仍然会对MVCC LSM实现产生正确的结果,但在我们的教程中,我们选择保留不变式,如果一个key有多个版本,则更高的版本总是会出现在上层。
通常,有两种方式可以利用具有MVCC支持的存储引擎。如果用户将引擎作为独立组件使用,并且不希望手动分配键的时间戳,他们将使用事务API从存储引擎中存储和检索数据。时间戳对用户是透明的。另一种方式是将存储引擎集成到系统中,由用户自行管理时间戳。为了比较这两种方法,我们可以看看它们提供的API。我们使用BadgerDB的术语来描述这两种用法:隐藏时间戳的是非托管模式,给用户完全控制的是托管模式。
托管模式中APIs
get(key, read_timestamp) -> (value, write_timestamp)
scan(key_range, read_timestamp) -> iterator<key, value, write_timestamp>
put/delete/write_batch(key, timestamp)
set_watermark(timestamp) # we will talk about watermarks soon!
非托管模式中APIs
get(key) -> value
scan(key_range) -> iterator<key, value>
start_transaction() -> txn
txn.put/delete/write_batch(key, timestamp)
如您所见,托管模式API要求用户在执行操作时提供时间戳。时间戳可能来自一些集中的时间戳系统,也可能来自其他系统的日志(即Postgres逻辑复制日志)。用户需要指定一个水印,这是引擎可以删除的版本。
对于非托管API,它与我们之前实现的相同,只是用户需要通过创建事务来读写数据。当用户创建事务时,他们可以获得数据库的一致状态(即快照)。即使其他线程/事务向数据库写入数据,这些数据对正在进行的事务也是不可见的。存储引擎在内部管理时间戳,不向用户公开时间戳。
在本周,我们将首先花3天时间对表格式和memtable进行重构。我们将key格式更改为密钥切片和时间戳。之后,我们将实现必要的API来提供一致的快照和事务。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战