基于LSM-Tree 的分布式组件化 KV 存储系统 | DB·洞见回顾

随着云服务基础架构以及微服务技术的日益成熟,很多大型系统能够分解为根据应用 workload 需求的多个子系统,再通过网络交互组装在一起协同工作。

Nova-LSM,一个将基于LSM-Tree的分布式KV 存储系统分解为使用RDMA进行通信的组件的工作。这些组件将存储与处理分开,使处理组件能够共享存储带宽和空间。处理组件将文件块 (SSTable) 分散到任意数量的存储组件中,并通过一定机制平衡它们之间的负载,在运行时动态构建范围以并行化压缩并提高性能。Nova-LSM 具有很好的可伸缩性,在一些场景下性能优于其单机版本(LevelDB 和 RocksDB)几个数量级。

本期DB·洞见将由腾讯云数据库专家工程师唐彦,从前沿学术的角度深度解读Nova-LSM,重点介绍Nova-LSM的特性、重要设计及带来的启发。以下为分享实录:

直播回放完整版链接:https://www.bilibili.com/video/BV1tS4y1b7tR/

直播回放完整版+文字版搭配,效果更佳

视频内含课件获取方式哦~

一、LSM-Tree基本概念

1.1 LSM-Tree存储系统

LSM-Tree全称为“Log Structured Merge-Tree”,它是一种基于磁盘存储的数据结构。

在以前,数据库的索引基本上采用B+树方式来作为索引结构,在此情况下,随机写性能常被别人诟病。LSM-Tree则主打将离散的随机写请求转换成批量的顺序写操作。而无论是在机械硬盘还是在固态硬盘,顺序的读写性能永远好于随机读写。因此LSM-Tree作为一种高效的KV存储结构,被许多业界的成熟系统所应用,比如腾讯云数据库TDSQL新敏态引擎也是基于LSM-Tree进行开发。 file

LSM-Tree结构有较多优点:写性能强大、空间利用率高、较高的可调参特性、并发控制简单、有完备的修复方案等。 file

1.2 LSM-Tree的历史

在数据库更新方面,LSM-Tree与B+树的区别可以理解为:一个是in-place update,一个是out-place update。

基于B+树的更新,我们称之为in-place update。如下图所示,k1本来的值是v1,随后我们想在k1写下新值v4,这时需要找到k1,再把v4写进去。因此,在B+树的索引结构里对数据进行更新或者插入,会引起实时的I/O。在B+树的场景下,写性能会受到一定影响,但由于B+树可以支持较好的检索性能,因此读性能会较好。

相比之下,在LSM-Tree结构里,如果这时对k1进行v4的更新,我们不会马上把k1改成v4,而是将它转化成顺序写,把它写到内存里,追加在(k3,v3)后面,因为顺序写的性能远比随机写高,但这种方式则会牺牲读性能及导致空间放大。 file

下图展示的是1996年LSM-Tree最原始的结构。C0代表的是在内存里的状态,每当有数据写入,它就会逐渐往下merge。当第i层满时,它会把底下的叶子精简,从Ci到Ci+1去往下merge。层数越大则表明数据写入越早。每一层最初的版本的头部是B+树,C0是在内存的节点,接受最新的数据更新,C1层到Ck层都存在于磁盘。 file

1.3 LSM-Tree基本结构

目前主流的LSM-Tree基本架构如图所示。我们会在内存中保留memtable结构,用于接受最新的数据更新操作,memtable结构里的数据查找则通过跳表skiplist或者B+树实现。当memtable达到一定大小时,我们会进行flush操作,停止写入,再把memtable刷到磁盘上,变成静态文件即SSTable。

SSTable L0层与memtable保持一致,从L0层到L1层则会进行归并排序。排序意味着L1层到Lk层都处于有顺序的状态,因此在每一层往下沉时,内部的数据会在物理上保持有序。每个数据再往下沉时,会进一步根据不同的key range来转化成一个个互相不重叠的SSTable。 file

1.4 LSM-Tree在RocksDB中的实现

下图展示的是基于LSM-Tree数据结构进行二次开发的RocksDB。当遇到写请求时,RocksDB会先写一个log,即Write-Ahead Log (WAL)日志。当memtable还没有刷到磁盘上时,如果机器发生故障,Write-Ahead Log (WAL)日志则可以用于故障恢复。这是非常重要的功能。对TDSQL等金融应用场景数据库而言,可靠性永远排在第一位,写日志必须成功,才能把最新的数据插入到内存(memtable)里。 file

memtable还有阈值控制机制。在实际的生产环境中,一般将阈值设置为1G,到1G后则会冻结成immutable memtable。当活跃的memtable被冻结成 immutable memtable后,原来的memtable则可以清空内存,重新接受数据的写入。immutable memtable则不会再接受写入,

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值