基于LSM的Key-Value数据库实现WAL篇

上篇文章简单的实现了基于LSM数据库的初步版本,在该版本中如数据写入到内存表后但还未持久化到SSTable排序字符串表,此时正好程序崩溃,内存表中暂未持久化的数据将会丢失。

引入WAL

为了解决上述问题,将引入数据库中常用于解决类似问题的方法: WAL(Write Ahead Log)预写式日志——在计算机科学中,WAL(预写式日志)是数据库系统提供原子性和持久性的一系列技术;也就是说WAL用于保证数据操作的原子性和持久性;
不同组件、数据库所使用的WAL实现也有所差异, MySQL、Sqlite、Postgresql、Etcd、Hbase、Zookeeper等都有自己的WAL机制实现;

在MySQL中是通过Redo、Undo日志实现WAL,当MySQL崩溃后重启时,可以通过Redo重做日志对尚未持久化的操作进行 Redo,Undo为撤销操作,MySQL崩溃后可时系统恢复一致的状态;
在etcd中数据目录下有子目录: wal与snap,两个目录都是WAL机制所产生的;
1、wal目录存放的数据是记录整个数据库变化过程,数据修改前都需先写WAL文件;
2、Snap目录存放的是当etcd的wal文件过多是所生成的数据快照文件;

LSMDB的WAL机制实现

一、数据写入

写入数据时先往WAL文件写入再将数据写入内存表,当内存表数据达到某个阈值进行数据持久化后,将WAL文件清空,此WAL只存储尚未持久化的数据;代码如下:

   /**
设置键值
  */
func (l *LSMStore) Set(key string, value string) {
    var cmd = &SetCommand{Command{1}, key, value}
    //写入wal
    writer := bufio.NewWriter(l.walFile)
    cmdBytes, _ := json2.Marshal(cmd)
    cmdLen, _ := IntToBytes(len(cmdBytes), 4)
    writer.Write(cmdLen)
    writer.Write(cmdBytes)
    err := writer.Flush()
    if err != nil {
        return
    }
    //写入内存表
    l.memoryTable.Put(key, cmd)
    if l.memoryTable.Size() > storeThreshold {
        l.switchTable()
        l.toSSTable()
    }
}

与之前的区别只在于先写wal文件再写内存表,在switchTable方法中切换内存表的同时切换新旧WAL文件,用于保证与持久化内存表机制是一致的。持久化删除上一步所切换出来的WAL文件;

二、数据恢复

程序每次启动时都会检查是否有WAL文件存在,如存在WAL则说明程序上一次时异常关闭退出,此时将 加载WAL文件,并将WAL数据还原到内存表中;
在还原数据到内存表时还需检查内存表数据是否达到预设的阈值,超过则将其写入到持久化磁盘文件当中;

基于LSM的Key-Value数据库实现WAL篇

上次留下的四大坑,此处填了一个坑,还有三大坑待解决:
1、索引问题
2、SSTable合并问题
3、单机版本问题;

Original: https://www.cnblogs.com/softlin/p/15849235.html
Author: AiFly
Title: 基于LSM的Key-Value数据库实现WAL篇

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516454/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • go微服务框架Kratos笔记(五)使用nacos作为服务注册和服务发现中心

    引言 上篇介绍了如何使用nacos作为配置管理中心,并使用viper来解析配置官方介绍nacos不仅可以用来做配置中心还支持服务注册、发现以及动态DNS服务功能 nacos的安装 …

    Go语言 2023年5月25日
    055
  • Golang笔记

    本文主要为go的学习过程笔记。 一、基本介绍 1、开发环境安装-windows安装 打开Golang官网,选择对应版本,进行安装。 2、环境变量配置 1)步骤 (1)首先在环境变量…

    Go语言 2023年5月25日
    058
  • muduo源码分析之TcpServer模块

    这次我们开始 muduo源代码的实际编写,首先我们知道 muduo是 LT模式, Reactor模式,下图为 Reactor模式的流程图[来源1] 然后我们来看下 muduo的整体…

    Go语言 2023年5月25日
    053
  • 基于LSM的Key-Value数据库实现稀疏索引篇

    上篇文章简单的填了一个坑基于LSM数据库的实现了WAL,在该版本中如数据写入到内存表的同时将未持久化的数据写入到WAL文件,在未将数据持久化时程序崩溃,可通过WAL文件将数据还原恢…

    Go语言 2023年5月25日
    083
  • [grpc快速入门] 一 grpc生成与调用

    下载通用编译器 地址:https://github.com/protocolbuffers/protobuf/releases选择对应的版本,解压后将文件夹下bin目录配置到环境变…

    Go语言 2023年5月25日
    087
  • 使用 grpcurl 通过命令行访问 gRPC 服务

    如果环境不支持安装这种 GUI 客户端的话,那么有没有一种工具,类似于 curl 这样的,直接通过终端,在命令行发起请求呢? 答案肯定是有的,就是本文要介绍的 grpcurl。 首…

    Go语言 2023年5月25日
    085
  • golang的defer踩坑汇总

    变量捕获 defer中的变量会被提前捕获,后续的修改不会影响到已捕获的值,举个例子: 结果defer语句中打印的值是修改前的值。: 最后输出值: 10 Defer运行值: 0 变量…

    Go语言 2023年5月25日
    060
  • Go语言实现并行分段求和计算

    这个实例通过循环实现并行的分段求和计算,再把各个子段和加到总和中。 通过这个实例可以了解如何实现循环并行处理,以及有关的编程技巧。 但是这个程序是有问题的,因为可能发生变量访问冲突…

    Go语言 2023年5月29日
    054
  • Golang 源码解读 01、深入解析 strings.Builder、strings.Join

    本文从我的《The Go Programming Language》学习笔记中分离出,单独成一篇文章方便查阅参考。 strings.Builder 源码解析 存在意义 使用 (st…

    Go语言 2023年5月25日
    082
  • 推荐 10 本 Go 经典书籍,从入门到进阶(含下载方式)

    书单一共包含 10 本书,分为入门 5 本,进阶 5 本。我读过其中 7 本,另外 3 本虽然没读过,但也是网上推荐比较多的。 虽然分了入门和进阶,但是很多书中这两部分内容是都包含…

    Go语言 2023年5月25日
    078
  • install go 环境

    GoSDK安装 下载 GO SDK wget https://golang.google.cn/dl/go1.17.3.linux-amd64.tar.gz tar xfv go1…

    Go语言 2023年5月25日
    065
  • Sentinel-Go 源码系列(三)滑动时间窗口算法的工程实现

    要说现在工程师最重要的能力,我觉得工程能力要排第一。 就算现在大厂面试经常要手撕算法,也是更偏向考查代码工程实现的能力,之前在群里看到这样的图片,就觉得很离谱。 算法与工程实现 在…

    Go语言 2023年5月25日
    057
  • Go 中的 byte、rune 与 string

    byte 和 rune byte 是 uint8 的别名,其字面量是 8 位整数值,byte 切片相比于不可变的 string 方便常用许多。它可以更改每个字节或字符。这对于处理文…

    Go语言 2023年5月25日
    0132
  • sync:二. 延迟初始化(once)

    sync.Once 是 Go 标准库提供的使函数只执行一次的实现。作用与 init 函数类似,但有区别。在某些情况下预先初始化一个变量会增加函数的启动延迟,如果实际执行时可能用不上…

    Go语言 2023年5月25日
    079
  • 使用Go http重试请求

    原文连接:https://www.zhoubotong.site/post/78.html开发中对于http请求是经常遇到,一般可能网络延迟或接口返回超时,对于发起客户端的请求, …

    Go语言 2023年5月25日
    062
  • Golang – 关于 proto 文件的一点小思考

    ProtoBuf 是什么? ProtoBuf 是一套接口描述语言(IDL),通俗的讲是一种数据表达方式,也可以称为数据交换格式。 我们常用的数据格式有 JSON 和 XML,为什么…

    Go语言 2023年5月25日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球