关于数据库:基于LSMTree-的分布式组件化-KV-存储系统-DB洞见回顾

20次阅读

共计 10551 个字符,预计需要花费 27 分钟才能阅读完成。

随着云服务基础架构以及微服务技术的日益成熟,很多大型零碎可能合成为依据利用 workload 需要的多个子系统,再通过网络交互组装在一起协同工作。

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

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

直播回放完整版链接:[https://www.bilibili.com/vide…]()

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

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

一、LSM-Tree 基本概念

1.1 LSM-Tree 存储系统

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

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

LSM-Tree 构造有较多长处:写性能弱小、空间利用率高、较高的可调参个性、并发管制简略、有齐备的修复计划等。

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)前面,因为程序写的性能远比随机写高,但这种形式则会就义读性能及导致空间放大。

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

1.3 LSM-Tree 根本构造

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

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

1.4 LSM-Tree 在 RocksDB 中的实现

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

memtable 还有阈值管制机制。在理论的生产环境中,个别将阈值设置为 1G,到 1G 后则会冻结成 immutable memtable。当沉闷的 memtable 被冻结成 immutable memtable 后,原来的 memtable 则能够清空内存,从新承受数据的写入。immutable memtable 则不会再承受写入,会筹备被 flush 到磁盘上。

随着越来越多的 immutable memtable 被 flush 到 L0 层,L0 层的文件个数会逐步达到一个阈值,这时会触发零碎的 compaction。因为 L0 层的 SST 文件之间出现的是无序的状态,它们蕴含的 key 范畴有可能重叠,这时须要把 L0 层的文件从磁盘上从新读取并进行归类排序,进而往下生成 L1 层的文件。从 L1 层到 Ln 层(生产环境中个别配置成 7 层),所有的文件的 key range 曾经互不重叠,且依照 key 的程序进行排放。

当咱们要读取一个比拟旧的数据,如果该数据不在内存也不在 L0 层时,咱们会从 L1 层到 Ln 层去读取该 SST 文件。因为 SST 文件数量较多,在理论中咱们会采纳 bloom filter 来放慢读取。

1.5 LSM-Tree 查问

基于 LSM-Tree 的查问可分为点查与范畴查问两大类,对应的执行形式如下:

●点查:从上往下进行查问,先查 memtable,再到 L0 层、L1 层。因为下层的数据永远比上层版本新,所以在第一次产生匹配后就会进行查问。

●范畴查问:每一层都会找到一个匹配数据项的范畴,再将该范畴进行多路归并,归并过程中同一 key 只会保留最新版本。

1.6 LSM-Tree 之空间 / 读 / 写放大

LSM-Tree 性能的掂量次要思考三个因素:空间放大、读放大和写放大。

一是空间放大。LSM-Tree 的所有写操作都是程序追加写,对数据的更新并不会立刻反映到数据既有的值里,而是通过调配新的空间来存储新的值,即 out-place update。因而冗余的数据或数据的多版本,仍会在 LSM-Tree 零碎里存在肯定工夫。这种理论的占用空间大于数据自身的景象咱们称之为空间放大。因为空间无限,为了缩小空间放大,LSM-Tree 会从 L1 往 L2、L3、L4 一直做 compaction,以此来清理过期的数据以及不同数据的旧版本,从而将空间释放出来。

二是读放大。假如数据自身的大小为 1k,因为存储构造的设计,它所读到的值会触发屡次 IO 操作,一次 IO 意味着一条读申请,这时它所读取到的则是在后端所须要做大的磁盘读的理论量,曾经远大于指标数据自身的大小,从而影响到了读性能。这种景象咱们称之为读放大。为了加重读放大,LSM-Tree 采纳布隆过滤器来防止读取不包含查询键值的 SST 文件。

三是写放大。在每层进行 compaction 时,咱们会对多个 SST 文件进行重复读取再进行归并排序,在删掉数据的旧版本后,再写入新的 SST 文件。从成果上看,每条 key 在存储系统里可能会被屡次写入,相当于一条 key 在每层都会写入一次,由此带来的 IO 性能损失即写放大。

LSM-Tree 最后的理念是用空间放大和读放大来换取写放大的升高,从而实现较好的写性能,但也须要做好三者的均衡。以下是两种假如的极其状况。

第一种极其状况是:如果齐全不做 compaction,LSM-Tree 根本等同于 log 文件,当 memtable 一直刷下来时,因为不做 compaction,只做 L0 层的文件,这时如果要读一条 key,读性能会十分差。因为如果在 memtable 里找不到该条 key,就要去扫描所有的 SST 文件,但与此同时写放大景象也将不存在。

第二种极其状况是:如果 compaction 操作做到极致,实现所有数据全局有序,此时读性能最优。因为只须要读一个文件且该文件处于有序状态,在读取时能够很快找到对应的 key。但要达到这种成果,须要做十分多的 compaction 操作,要一直地把须要删的 SST 文件读取合并再来写入,这会导致十分重大的写放大。

二、Nova-LSM 的简介与个性

2.1 Nova-LSM 架构设计一览

Nova-LSM 是基于 LSM-Tree 构造的架构体系,其次要组件包含三局部:

第一局部是写日志的组件,将 WAL 写胜利后再往 LSM-Tree 的 memtable 中查问新的数据。

第二局部是自身解决 LSM-Tree 写入的线程,其缩写为 LTC(LSM-Tree Component),代表着将该线程独自组件化。

第三局部则是底层的存储,负责把接管到的下层 LTC 组件下发下来,并提供规范的文件接口。

Nova-LSM 是一个存算拆散的架构。下面解决 LSM-Tree 的是计算节点,它们要写磁盘时,须要用 flush 操作将 memtable 写到磁盘,compaction 时要先从存储节点读取上来,接着进行归并排序并再次写回,再写下去时则由底下的分布式存储节点来进行。

它的架构借用了当下较好的数据库产品理念。在计算节点和存储里,存储节点会依照彼此的性能去划分独立的线程池,每个线程池的线程数能够配置。这相当于在计算节点里将线程的性能分为四种:第一种线程与 client 相干,负责收发客户申请;第二种线程负责 RDMA、网络 IO 的相干操作;第三种线程与 compaction 相干,会一直扫描以后的 SST 是否合乎 compaction 及推动 compaction 的进行;第四种线程与 Drange 相干,负责一直整顿以后 Drange 的重排、重组织。

该工作的次要亮点之一,是在于把本来 LSM-Tree 这样的单机零碎明确地划分出计算层、存储层,通过肯定形式解决了在计算层原本会产生的停写、缓写景象。

2.2 Nova-LSM 所解决的外围问题

Nova-LSM 所解决的外围问题次要有两个。

第一个外围问题是:基于 LSM-Tree 构造的存储系统,例如 LevelDB、RocksDB 等,都会不可避免地遇到缓写或者停写的问题。比方内存里的 memtable,在配置时最多能够写 8 个,因为写入多,须要全副 flush 到磁盘上。与此同时,以后 L0 层的 SST 文件十分多,L0 层行将开始做 compaction。但 compaction 会波及到磁盘 IO,在还没做完时,就会阻塞内存中的 memtable 对 L0 层 SST 进行 flush 的过程。当 flush 无奈进行时,就会产生缓写,随着阈值的推动,在切实写不进时甚至会停写,这种景象体现在客户端就是申请掉零。

为了解决 LSM-Tree 构造存储系统中的缓写、停写问题,该文章提出了两个解决办法:

第一种办法是设计了存算拆散的架构体系,具体如上图所示。该架构的重要作用之一,是把解决写入和解决磁盘 IO 的两大主力模块拆分,计算存储拆散,哪个局部慢就为哪个局部减少节点以此来进步该局部的能力,这是比拟亮眼的冲破。

第二种办法是引入了动静分区,即 Drange 机制。该机制的目标是为了让业务的写入压力,在 LTC 即计算层的 memtable 上进行区间划分,每个 range 都有本人的 memtable,通过区间划分,从而实现多个 range 之间进行并行 compaction。以 L0 层为例,咱们能够把 L0 层变成没有相互重叠的状态,这时咱们就能够对 L0 层进行并行的 compaction,能够放慢 L0 层的文件的消化,从而加重对 memtable flush 到磁盘上的过程的影响。

第二个外围问题是:在这种形式下须要划分很多不同的 Drange,每个 range 都会减少肯定的 memtable 数量,memtable 数量的减少会影响 scan 和 get 的性能。假如有一个主申请,在原来所有数据都写在一个 memtable 里的状况下,在读取时,索引只须要面向这个 memtable,再依据跳表进行 get,如果 get 到则能够马上返回。当初划分成不同的 Drange,memtable 数量减少,因而须要查找的 memtable 以及 L0 层的 SST 也会变多。解决办法是:实现了一个索引,能够查问到一个 key 在 memtable 或 L0 SST 中的最新值(若存在)。

2.3 Nova-LSM 论文次要成绩

这篇文章将本来独立的单节点存储系统做成了一个存算拆散、能够任意扩大的分布式架构。这种存算拆散的架构体系,在扩大时对总吞吐量、总的响应和申请的能力有显著晋升。下图是对该成果的具体展现。

左下角采纳了最原始的配置,只有 1 个存储节点和 1 个计算节点,计算节点只配置了 32M 的内存,这也意味着 memtable 绝对较少,在这种状况下它的总吞吐量只有 9k,绝对较低。而后咱们从纵轴来看,把计算能力向上扩大,通过垂直扩容把内存从 32M 变成 4G,这时总吞吐量曾经从 9k 进步到 50k。

但从图中也能够看到,这时性能曲线两头有空隙的中央越来越多,这些就是后面所提到的申请掉零。计算能力的增强意味着能够进行更多的写入,内存变大意味着 memtable 的数量变多,L0 层的 SST 文件生成速度也会放慢。当 L0 层的生成文件速度放慢后,就会对存储层 compaction 的能力造成压力,因为它在默认配置下只有 1 个节点。这时尽管它的峰值曾经进步到了 5k,但申请掉零的状况也更多了,即产生了停写。因为 L0 SST 曾经来不及 compaction,这时只能期待,相当于计算节点在等存储节点。

为了解决这个问题,咱们须要对存储节点进行扩容,比方将 1 个存储节点扩到 10 个。这时能够显著看到总吞吐量从 5 万进步到了约 250 万。尽管某些中央申请也会骤降,稳定性还有待进步,但从整体上看,简直曾经没有申请掉零景象呈现了。

这也体现了传统单机单节点 LSM-Tree 存储系统与 Nova-LSM 之间的区别。在传统单机单节点 LSM-Tree 存储系统中,如果计算能力十分好然而磁盘能力不够,这时很难在单节点上进行扩大。但在 Nova-LSM 中,如果发现哪局部能力不够就能够进行扩大,计算能力不够就扩计算节点,存储能力不够则扩存储节点。这也遵循了以后分布式数据库里比拟常见的存算拆散、计算层和存储层能够独立扩容的理念。

三、Nova-LSM 若干重要设计

3.1 LTC 和 StoCs 之间的写数据流程

第一个比拟重要的设计是 LTC 和 StoCs 之间的写数据流程。该流程展现的是:当在客户端发动写申请时,计算节点和存储节点是以怎么的形式将数据写进去的过程。

首先是计算节点的客户端发动一个新的写申请操作。存储节点在接管到该申请后,基于 RDMA 交互,它会在 buffer 区域调配一个内存区域,并且为这块内存和偏移量(以后哪块内存能够写)调配一个 id,告知 StoC。客户端接到响应后就会开始写数据,实现后会告诉存储节点。存储节点接管到信号后,将数据长久化并且再告知客户端。

上述流程是写一个数据文件即 SSTable。写完后,咱们要以同样的流程将元数据文件更新。因为底层是分布式架构,须要晓得哪些文件写在哪里以及每个 SST 的范畴、版本号。

3.2 动静区间划分

第二个比拟重要的设计是动静区间划分。假如业务的申请范畴为 0 - 1 万,以后有 10 个计算节点,将这 10 个计算节点的区间划分为 10 等份,比方第一个 key 的空间范畴为 0 -1000。在负责 0 -1000 的计算节点里,它会再进行划分,这一层划分业务无感知。这就叫动静区间划分,简称 Drange。其作用次要有以下几点:

首先,每个 range 都是一棵 LSM-Tree,依照数据区间,不同的 Drange 都有本人的 memtables。比方 0 -1000 区间又能够划分为 10 个 Drange,10 个 Drange 之间的 memtable 互相独立。这样做的益处是这些 Drange 之间的 key 互不重叠,例如 0 -100、100-200、200-300。

其次,在 Dranges 下还有一层 Tranges。如果发现 Drange 里的局部 range 比方 890-895 存在热点景象,而旁边的 range 并非热点,则能够用 Tranges 进行细粒度的简单重平衡,实现动静平衡负载。

最初,在此基础上,因为 Drange 的 key 范畴互不相交,当 memtable 变成 immutable,不可再写后,它们须要独立地 flush 到磁盘上。这时,在 L0 层的 SSTable 来自不同的 Drange,它们之间的 key 齐全不相交,咱们就能够进行并行的 compaction。

3.3 Compactions

文章还将没有 Drange 划分和有 Drange 划分两种状况进行了比照。

在没有 Drange 划分的状况下,L0 的 compaction 无奈很好并行。在这种状况下,如果遇到最坏的状况,L0 层的某一个 SST 有可能笼罩了整个 key 空间,假如 key 范畴为 0 -600,L0 层的 SST 文件的范畴是 0 -1000,当产生 compaction 时,它必须要跟其余 4 个 SST 做归并,这时岂但要把 L0 层的其余 SST 全副读取比拟一遍,还要把 L1 层所有的 SST 都读一遍再做归并排序。这时写放大会较为重大,意味着 L0 层到 L1 层的 compaction 会变慢,flush 也会变慢,甚至 flush 不了时,前端就会呈现缓写、停写景象。

有 Drange 划分后,相当于 compaction 能够离开区间,如下方的示意图所示。在 0 -100 区间,L0 到 L1 能够独立去 compaction,100-200 区间也能够独立去 compaction,能够较好地实现并行 compaction。而在原生的 RocksDB 里,只有从 L1 开始 compaction,能力进行并行 compaction 操作。

如果协调者发现以后存储层的节点资源十分短缺,compaction 操作能够由存储层被动发动,不须要计算层去发现以后有哪些能够做 compaction,这是这篇文章中提到的另一个想法。

至于思考下沉的起因,因为文章并未深刻开展,集体猜想次要是思考到在这种架构体系里,存储层比拟容易扩大,而计算层较难扩大。因为计算层相当于分库分表,如果扩大则会波及到肯定的路由重散布,须要通知前端申请路由的变动。但存储层则非常容易扩大,如果能将这些十分耗时的操作放到存储层,能够极大地缩小在计算节点跟存储节点之间数据的开销。存储层做完后,能够间接把更新后的元数据通知计算层。

3.4 索引查找以及 Scan 操作

因为划分了很多不同的动静区间,memtable 的数量也会减少,意味着查问操作的耗时也会减少。所以要如何在原来的根底上保护好读性能?这篇文章提出了以下解决思路:

每个 LTC 保护了一个 lookup index。如果这些数据存在于 memtable 和 L0 层的 SST 上,通过 lookup index 咱们就能够疾速查找到想要的数据。当某一个 L0 层 SST 被 compaction 到 L1 层时,索引上就会移除掉对应的 key。

LTC 同时还保护了一个范畴索引即 range index。因为晓得每个 Drange 的范畴,所以当一个 scan 申请所波及到的 key,都能够在 memtable 和 L0 层 SST 中找到时,该范畴索引就能疾速响应 scan 操作。

3.5 SSTable 的散布

最初一个比拟重要的设计波及到存储层。当某个 SST 文件要写到存储节点时,分布式系统首先要保障负载平衡,要保证数据防止单点故障不可复原的场景。

该文章提出依据肯定策略,将数据文件即 SST 打散写入到多个存储节点里。思考到存储老本,每个 SSTable 采纳纠删码(Erasure Coding)的形式进行编码而后分布式寄存。默认状况下对每个 SSTable 采纳“3+1”的 EC 配置,将一个 SSTable 切分为 3 个数据块,依据肯定算法,在这 3 个数据块里去计算出一个校验块,变成了“3+1”的模式。这种形式比传统的多正本能够节俭更多空间。假如一个 SSTable 是 3M,这种“3+1”的形式最终所占空间为 4M,并且能容忍一个节点的失落,与占用 6M 空间的双正本计划领有同样的故障容忍等级。而元数据文件因为体积比拟小,所以间接采纳多正本存储的形式,比方 1 个元数据文件能够写 3 个正本。

四、Nova-LSM 性能成果展现

在本篇论文中,Nova- LSM 具备较好的性能数据体现。以本身调参测试为例,数据表明,Nova- LSM 能够通过调整不同的参数达到较好的扩大成果。文中别离应用 Uniform 均匀分布和 Zipf 散布来打散数据,存在热点(比方 80% 的拜访概率都集中在 20% 的数据上)的状况下,试验后果数据表明,在读写比例、数据拜访概率不一样的各种场景下,Nova- LSM 都能获得较好的性能后果。

下图所示为 Nova-LSM 在本身调参下几组不同参数的比拟:

下图展现了 Nova-LSM 本身扩展性的成果:

下图所示为 Nova-LSM 吞吐量扩展性测试:

以上测试是 Nova- LSM 本身不同参数下的比照。除此之外,该文章还将 Nova- LSM 与 LevelDB 以及 RocksDB 进行性能比照。

在小数据场景下,Nova- LSM 的性能体现比 RocksDB 要更优异,特地在 Zipf 散布且热点数据存在、读写各占一半的状况下,测试进去的性能数据要比 RocksDB 高 4 倍。但随着数据量的扩充,在某些 workload 下 Nova-LSM 的劣势逐步变得不显著。比方在上图中的(d)状况,一个 10 节点、2T 的数据库,RocksDB 将其分为 10 份,在这种写较多的场景下,Nova- LSM 与原生的 RocksDB 差距不显著。

另外,上图中的蓝色数据项 RocksDB-tuned,它是 RocksDB 进行调优后产生的数据项,红色数据项则没有通过 RocksDB 调优,而红色项却获得了比蓝色项更好的性能数据。

通过较多场景的验证,像 Nova-LSM 这种基于 LSM-Tree 构造的存储系统,实际上并不存在某一组参数可能让它在所有不同性质的 workload 下都获得较好性能。如上图(d)组,即两头 100% 写、均匀分布的测试组,RocksDB 通过调优后比没通过调优、用原始参数的对照组的吞吐量更低。因为 Nova-LSM 自身须要有十分多的调优参数,因而很难存在一套参数在所有的场景里都为最优。

五、Nova-LSM 带来的启发和探讨

个别状况下,基于 LSM-Tree 构造去进行优化的工作都面临以下问题——读放大、写放大及空间放大。

如果齐全不做 compaction,LSM-Tree 将会进化为 Log 文件,此时读性能最差,须要扫描所有 SSTable 文件,但不存在写放大。如果通过 compaction 操作将所有 SSTable 文件维持为一个 sorted run,即始终保持所有 kv 数据的全局有序,则进化为 sorted array,此时读性能最优,查问时只需读取一个 SSTable 中的一个数据块,但频繁的 compaction 操作会导致重大的写放大。所以咱们不能走极端,须要在两者之间提出新的改良办法,在读放大、写放大及空间放大之间做好均衡。

Nova-LSM 就是在这三个因素之间做取舍,它的设计原理之一是将本来单机单节点的零碎用分布式组件化的形式,将本来一份代码外面的不同模块拆分进去,从而令每一个模块具备可扩展性,突破原先单机资源的限度。此外,该文章还创新性地提出,将不定期的 compaction 对磁盘 IO 造成的短期冲击剥离进来。

与此同时,该篇文章在试验验证及工程实际上仍有许多中央须要欠缺和优化。

第一,试验应用的每个 KV 的默认大小是 1KB。依据原理判断,Drange 这种设计在该场景下比拟占优势。在具体实现中,当一个 memtable 蕴含的 unique key 小于肯定阈值时,不同的 Drange 之间会将 memtable 进行合并,其目标都是为了缩小磁盘的写入。因而应用 1KB 这种不算小的测试数据,对它而言是占据劣势的。而其余原生的 RocksDB 则须要一直地写磁盘,因为每一条 key 的体积都不小,1000 条可达到 1 兆,100 万条就能达到 1G,这时 Drange 机制所带来的缩小磁盘写入的劣势就会被放大了。

第二,Drange 和 Tranges 机制的设立,能够保障一个计算节点在不同的 memtable 写入之间存在动静平衡。从工业界落地的角度登程,这会波及到较多的数据一致性保障。但文章并没有进一步阐述数据的挪动是否会造成没写或者双写。

第三,工程实际上仍存在不少流程细节有待深刻斟酌,比方在 LTC 和 StoC 的写入流程交互中,文中提到先更新数据文件 block 再更新元数据文件 block 的流程,但如果在这两次写入两头产生了故障,如何解决?StoC 应用 erasure code 形式保证数据可靠性时,如何保障 n + 1 个数据块和校验块写入同时胜利?故障时如何回滚?单个数据块产生失落时如何发现以及从新生成?这些问题都值得咱们进行斟酌。

第四,N 个 LTC 会负责 N 个区域数据的写入。比拟传统的基于中间件的分布式数据库,会存在一个中间件,中间件晓得其下的存储节点以及负责写入的节点别离负责哪一部分数据,此时路由变更的灵活性会存在肯定限度。

第五,所有的性能测试中根本只形容性能的最大值。最大值、最大吞吐量这些指标很重要,它代表着一个零碎的能力下限。但在实在的业务场景中,除了能力的最大值,另一个十分重要的考查指标是稳定性。而 Nova-LSM 基于分布式架构,它所有的读写数据始终在进行网络交互。compaction 自身因为磁盘的 IO,给总体性能带来了不稳定性,当初又退出了网络之间的开销,网络抖动就更加频繁,性能的抖动也是咱们必须思考的因素。

Nova- LSM 并非只有实践,它在 LevelDB 的源码根底上新增了 2 万多行代码,实现了一套外围的设计,上图所示为其源码地址,感兴趣的同学能够尝试进行二次开发。

对于讲师

唐彦,腾讯云数据库专家工程师、浙江大学博士。钻研畛域次要关注分布式存储、大规模数据密集型零碎相干的关键技术,曾以第一作者身份在畛域 Top 类期刊和会议上发表多篇论文。博士毕业起初到腾讯从事根底钻研与技术工程化工作,目前次要负责分布式数据库 TDSQL 的元数据管理与集群管控调度相干工作。

正文完
 0