首页 > 其他分享 >leveldb

leveldb

时间:2023-07-21 17:47:31浏览次数:41  
标签:leveldb 缓冲 lsm 更新 跳表 节点

从B树到LSM树
《数据库系统内幕》下文中很多图片源自这本书

B+树

mysql原理中,进行过B+树与一些数据结构对比:

  1. B+树与B树
    B+树只在叶子节点存储数据,B树非叶子节点也要存储数据,所以B+树的单个节点的数据量更小,在相同的磁盘I/O次数下,就能查询更多的节点
    B+Tree叶子节点采用链表连接,适合基于范围的顺序查找
  2. B+树与二叉树
    即使数据很大,B+树的高度依然维持在34层左右,也就是说一次数据查询操作只需要做34次的磁盘I/O操作
    而二叉树的每个父节点的子节点个数只能是2个,比B+树高出不少
    二叉树在顺序插入时可能退化为链表
  3. B+树与二叉平衡树
    无论平衡还是自平衡的二叉树(红黑树)虽然解决了二叉树可能退化为链表的问题,但依然高度很高
    且平衡操作(旋转等)复杂耗时
  4. B+树与哈希表
    哈希表在做等值查询的时候效率很快,但不适合做范围查询
  5. B+树与跳表
    即使数据很大,B+树的高度依然维持在3~4层左右,但跳表需要几十层,所以B+树的读性能会比跳表要好
    那为什么redis使用跳表,因为redis读写全在内存里进行操作,不涉及磁盘IO,不关心磁盘读性能,同时跳表实现简单,相比B+树少了树分裂合并的开销,写方面更优
    所以读多写少B+树,写多读少跳表

B树变体

写时复制B树

img

不使用锁,采用写时复制(copy on write技术)保证并发操作的数据完整性:当要修改页时,复制这个页,在复制的页上修改
缺点:写放大,修改一处就要复制多个页
优点:读不会阻塞写,系统崩溃也不会损坏页数据

惰性B树

img

使用缓冲(mongodb存储引擎wiredtiger使用)
更新时,先将更新放入页的缓冲
读取时,将缓冲与原始页合并后再读取
写回时,将缓冲与原始页合并后再写回
缓冲使用跳表
优点:读写进程不必等待页的分裂与合并,这些都由后台进程执行

惰性自适应树
为子树使用批量操作的缓冲
数据更新首先加到根节点的更新缓冲,缓冲满了再递归加入子树的缓冲
优点:因此对于叶节点及上层节点的操作都是批量的,减少磁盘访问

img

FD树
与lsm树类似
由一个可变的缓冲b树与多个不可变的有序段组成,b树被填满就转移到下一层不可变有序段中,依次再于下一层合并
为了优化相邻层查找,使用分级级联的方法:通过在序号较大的数组中每隔一个元素就将元素拉到序号较小的数组中来弥合元素之间的空隙

img

img

FD树是将低层头元素作为高层指针

img

BW树

img

原地更新的B树存在的问题:
写放大:需要对整个页更新(每次更新覆盖整个页)
空间放大:保留额外空间来实现更新
并发控制:加锁复杂
更新节点单独用一个增量节点表示,并指向旧结点,使用CAS控制并发
优点:不需要额外预留空间
缺点:读取时需要遍历整个链

lsm树

插入,删除,更新都以追加写的方式进行,删除只记录一个墓碑
合并:采用多路归并排序算法,使用大小为N的优先队列(N为合并的表的个数),遍历这N个表,放入优先队列中,然后按序输出,最终合并完成
合并时如果有相同的键,通过时间戳比较前后顺序

B+树与lsm树
B+树是就地更新结构,更新时直接覆盖旧记录,所以写代价大,读代价小。B+树需要用latch实现并发控制
lsm树是异地更新结构,直接保存新记录到新位置,所以顺序写代价小,但是因为有多个记录,读代价大。lsm树采用追加的方式写基本不需要latch实现并发控制

lsm树优化

一文带你看透基于LSM-tree的NoSQL系统优化方向

读优化:使用布隆过滤器
写优化:tiering(分层)合并策略,把一层的合并后直接放入下一层(这样每层都会有重复的数据)

无序lsm

bitcask
只在内存中维护一个目录,目录每个键都指向最新的值,数据顺序追加到日志文件中
优点:简单,单点查询好
缺点:不支持范围查询,每次启动需要重建目录

img

wisckey
键存储在排序的lsm树中,指向值,值无序顺序追加写入
虽然支持范围扫描,但是为随机IO

img

leveldb

网上总结分析的资料太多了,这里就收藏一下

Leveldb实现原理图文并茂,十分好,下图就源自这篇文章

img

leveldb是LSM树的典型实现,单机KV存储引擎,上图是leveldb的主要组成部分。

leveldb源码分析
leveldb源码剖析

基本组成
level自定义了字符串slice用于更方便地操作字符串
对数据有定长和变长编码两种方式,变长编码最高位1/0表示后续是否还有数据

跳表(有序链表,有与红黑树差不多的查找效率,但实现简单)
跳表原理
应用:leveldb memtable,Redis选择使用跳表,HBase写入LSM Tree结构的数据时使用跳表

布隆过滤器
判断一个元素是否在一个集合中,如果使用哈希表,额外占用空间
布隆过滤器只需要一系列比特和多个哈希函数,一个元素使用多个哈希计算,将计算结果对应位置的比特置为1
参数选定:k次哈希,m个bit位,n个元素,k=ln2*(m/n)时误差最低
哈希选定:MurMurHash2
应用场景:黑名单校验,快速去重,爬虫URL校验,leveldb/rocksdb快速判断数据是否已经在block中,避免频繁访问磁盘,解决缓存穿透问题:一直查询不存在的值,从而不断访问磁盘(解决:缓存空值和布隆过滤器)
优点:查询插入快都为O(1),节省内存
缺点:不能删除,可能有hash冲突
海量数据下使用mapreduce并行执行
为支持删除操作:计数布隆过滤器,布谷鸟过滤器

标签:leveldb,缓冲,lsm,更新,跳表,节点
From: https://www.cnblogs.com/Qi-Lin/p/17563093.html

相关文章

  • redis 和leveldb比较
    Redis和LevelDB比较概述在本文中,我们将比较Redis和LevelDB这两种流行的键值存储系统。我们将介绍它们的功能、特点和适用场景,并提供使用示例代码来演示它们的用法。步骤概览以下是比较Redis和LevelDB的步骤概览:步骤RedisLevelDB1.安装安装2.连接打开数据库......
  • wiredtiger引擎性能——比levelDB更牛叉!
    WE'VEJOINEDMONGODB! We'reproudtoannouncethatMongoDBhasacquiredWiredTiger,andwe'vejoinedtheMongoDBteam! WewillbedirectlyinvolvedinsupportingtheWiredTigerstorageengineinMongoDB3.0andwillcontinuetodevelopWire......
  • Cassandra——类似levelDB的基于p2p架构的分布式NOSQL数据库
     C:Consistency一致性•A:Availability可用性(指的是快速获取数据)•P:ToleranceofnetworkPartition分区容忍性(分布式)10年前,EricBrewer教授指出了著名的CAP理论,后来SethGilbert和Nancylynch两人证明了CAP理论的正确性。CAP理论告诉我们,一个分布式系统不可能满足......
  • leveldb无法在wsl1中使用
    1、WSL1不支持FUSE文件系统,因此无法在WSL1中直接使用LevelDB。LevelDB使用FUSE来提供基于文件的存储,因此在WSL1中无法正常运行。但是,您仍然可以在WSL1上使用Leveldb的API,只需将数据存储在本地文件系统中即可。这意味着您需要使用本地Windows文件系统或其他支持......
  • leveldb armlinx交叉编译
    首先安装所有依赖,在linux下可以直接编译成功,在armlinux低版本编译器(由于系统限制,只能使用这个版本)下有点问题。1、在CMakeLists.txt中增加set(CMAKE_C_COMPILER"/xxxxxx/arm-linux-gnueabihf-gcc")set(CMAKE_CXX_COMPILER"/xxxxxx/arm-linux-gnueabihf-g++")2、编译报错......
  • 【图文详解】一文全面彻底搞懂HBase、LevelDB、RocksDB等NoSQL背后的存储原理:LSM-tree
    LSM树广泛用于数据存储,例如RocksDB、ApacheAsterixDB、Bigtable、HBase、LevelDB、ApacheAccumulo、SQLite4、Tarantool、WiredTiger、ApacheCassandra、InfluxDB和ScyllaDB等。在这篇文章中,我们将深入探讨LogStructuredMergeTree,又名LSM树:许多高度可扩展的NoSQL分......
  • LevelDb-用户接口
    目录优缺点用户接口基本读写打开关闭数据库读写原子更新同步/异步写并发迭代器快照Slice自定义key比较器性能相关压缩缓存key设计布隆过滤获取范围数据大小近似值优缺点......
  • LevelDb-基本数据结构
    目录SliceArenaskiplist跳表本质时空复杂度插入,删除数据(如何维护索引)极端情况分析:不维护索引极端情况分析:每次插入都维护插入效率和查找效率取舍删除对比红黑树的优势leve......
  • leveldb.net区块链技术
    leveldb.net工作原理:leveldb为键值对数据库,具有增加,删除,查询功能,利用加密链式结构存储和查询数据。区块(block):在区块链技术中,数据以电子记录的形式被永久储存下来,存放这些......
  • 档案系统leveldb.net集成
    leveldb.net工作原理:leveldb为键值对数据库,具有增加,删除,查询功能,利用加密链式结构存储和查询数据。区块(block):在区块链技术中,数据以电子记录的形式被永久储存下来,存放这些......