【leveldb】leveldb的实现框架

发布时间:2026/7/10 17:33:30
【leveldb】leveldb的实现框架 leveldb的整体框架如下图所示leveldb 的实现方式与单个 Bigtable tablet 的实现方式5.3 节在本质上类似。但是leveldb的文件组织方式略有不同。每个db都由存储在目录中的一组文件表示。日志文件wal日志文件.log 存储了最近的一系列更新。数据写入时会首先将写入内容追加到当前日志文件中。当日志文件达到预定大小默认约为 4MB时它对于的memtable会被转换为sorted table并创建一个新的日志文件用于记录后续的更新。单曲日志文件的副本保存在memtable中memtable时一个内存态的数据结构。Sorted tablesSorted tables.ldb存储按键排序的一系列条目。每个条目要么是该键的值要么是该键的删除标记。LevelDB 通过多层级管理排序表。随着数据的写入直接由日志文件生成的sorted table存放在level-0层。当level-0层达到了上限默认为4个所有的level-0层的文件都会和与level-0文件由交集的level-1层文件进行合并生成新的level-1文件。合并到level-1以及后面的levellevel-L之后如果文件大小超过阈值level-L的阈值为 (10^L) MB。会选取该超过阈值的文件和 Level-(L1) 层中所有与它 Key 范围有交集 的文件进行合并生成新的level-(L1)层文件。ManifestManifest中存储了每层的Sorted tables、相应的key范围以及其他重要的元数据。每次db重新打开时都会创建一个新的 MANIFEST 文件文件名中包含一个新的编号。MANIFEST 文件采用日志格式服务状态的更改例如添加或删除文件都会追加到此日志中。CurrentCURRENT 中包含最新 MANIFEST 文件的名称。LogLeveldb的运行日志会打印到名为 LOG 和 LOG.old 的文件中。Level 0当wal达到阈值默认时4MB后会创建全新的memtable和wal文件用来记录后续的写入记录老的memtable会变为Immutable MemTable不在进行写入。后续的处理流程如下后台异步流程将Immutable MemTable内容写入到sstable中删除Immutable MemTable和wal日志把这个新生成的 SSTable 放入到 Level-0中CompactionsL层的文件和L1层的文件进行compaction对于新的L1层文件由一下限制当当前输出文件达到目标文件大小2MB后我们会切换到生成新的 L1 级文件。当当前输出文件的键值范围增长到足以覆盖超过十个 L2 级文件时我们也会切换到生成新的输出文件。每个层级的compaction会在key中轮换进行。对于每个层级 L我们会记住上一次在该层级compaction的结束key。下一次针对层级 L 的compaction操作会选择该key之后的第一个文件如果不存在这样的文件则会循环回到最小的key。compaction会删除被覆盖的值。如果在更高层级的文件中都没有包含当前 Key则compaction还会删除删除标记。耗时Level-0 的Compaction会从 Level-0 读取最多 4 个 1MB 的文件在最坏情况下还会把 Level-1 的所有文件共 10MB全部读进来。也就是说我们总共需要读取 14MB 并写入 14MB 的数据。除了特殊的 Level-0 Compaction之外对于其他层级我们会从 Level-L 中挑出一个 2MB 的文件。在最坏情况下这个文件会与 Level-(L1) 层的大约 12 个文件发生重叠。因此这种合并将需要读取 26MB 并写入 26MB。假设磁盘的 I/O 速率为 100MB/s现代硬盘的常规大体范围最坏情况下的合并耗时大约为 0.5 秒。如果我们把后台写入的速率限制在一个很小的值比如限制到满速 100MB/s 的 10%即 10MB/s那么一次合并可能会耗时高达 5 秒。此时如果用户正以 10MB/s 的速度高强度写入系统内部可能就会堆积出大量的 Level-0 文件大约需要 50 个文件才能装下这 5 秒内产生的5×10MB5 \times 10\text{MB}5×10MB数据。由于每次读取操作都需要把堆积的文件进行多路归并合并这将会显著暴增用户的查询/读取成本。解决方案可以在 Level-0 文件数量过多时选择增大日志滚动的阈值即调大 MemTable 的刷盘边界。不过这种做法的副作用是这个阈值设置得越大我们就需要消耗越多的物理内存来容纳与之相对应的 MemTable。可以在 Level-0 文件数量不断飙升时主动限制前台用户的写入速率。对于主要目的是降低超多文件参与的大规模归并所带来的性能开销。可以让绝大多数 Level-0 文件的 Data Block 以未压缩的状态常驻在 Block Cache缓存中这样在多路归并迭代时我们只需要承受排序迭代器本身原生的O(N)O(N)O(N)复杂度开销即可。文件数量对于总是生成 2MB 的文件我们可以针对更高层级生成更大的文件以减少文件总数但这会增加Compaction的读写放大。我们也可以将文件集分片到多个目录中。Recover恢复流程首先读取CURRENT文件从中获取最新提交的MANIFEST元数据清单的文件名。读取该指定的MANIFEST文件在内存中重建数据库各层级 SSTable 的版本控制骨架。清理掉磁盘上的所有过期、残存的废弃文件如上次合并进行到一半崩了留下的残渣。可以在这一步就把所有的 SSTable.ldb文件全部打开但更优雅、更推荐的做法是进行“延迟加载/懒加载Lazy Open”……将未落盘的旧日志分片即崩溃前遗留的 WAL 日志里的残留数据转换成一个全新的 Level-0 层 SSTable 文件。基于恢复出来的最新序列号Sequence Number创建一个全新的 WAL 日志文件开始引导并接收后续的所有新写入请求回收旧文件RemoveObsoleteFiles()会在每一次Compaction结束时以及数据库恢复Recovery结束时被调用。它会扫描并找出数据库目录下的所有文件名。随后它会物理删除所有不是当前正在使用的WAL 日志文件同时它还会物理删除所有既没有被任何层级Level所引用、又不是当前正在进行的合并操作所输出的SSTable 文件。leveldb 的实现方式与单个 Bigtable tablet 的实现方式5.3 节在本质上类似。但是leveldb的文件组织方式略有不同。每个db都由存储在目录中的一组文件表示。日志文件wal日志文件.log 存储了最近的一系列更新。数据写入时会首先将写入内容追加到当前日志文件中。当日志文件达到预定大小默认约为 4MB时它对于的memtable会被转换为sorted table并创建一个新的日志文件用于记录后续的更新。单曲日志文件的副本保存在memtable中memtable时一个内存态的数据结构。Sorted tablesSorted tables.ldb存储按键排序的一系列条目。每个条目要么是该键的值要么是该键的删除标记。LevelDB 通过多层级管理排序表。随着数据的写入直接由日志文件生成的sorted table存放在level-0层。当level-0层达到了上限默认为4个所有的level-0层的文件都会和与level-0文件由交集的level-1层文件进行合并生成新的level-1文件。合并到level-1以及后面的levellevel-L之后如果文件大小超过阈值level-L的阈值为 (10^L) MB。会选取该超过阈值的文件和 Level-(L1) 层中所有与它 Key 范围有交集 的文件进行合并生成新的level-(L1)层文件。ManifestManifest中存储了每层的Sorted tables、相应的key范围以及其他重要的元数据。每次db重新打开时都会创建一个新的 MANIFEST 文件文件名中包含一个新的编号。MANIFEST 文件采用日志格式服务状态的更改例如添加或删除文件都会追加到此日志中。CurrentCURRENT 中包含最新 MANIFEST 文件的名称。LogLeveldb的运行日志会打印到名为 LOG 和 LOG.old 的文件中。Level 0当wal达到阈值默认时4MB后会创建全新的memtable和wal文件用来记录后续的写入记录老的memtable会变为Immutable MemTable不在进行写入。后续的处理流程如下后台异步流程将Immutable MemTable内容写入到sstable中删除Immutable MemTable和wal日志把这个新生成的 SSTable 放入到 Level-0中CompactionsL层的文件和L1层的文件进行compaction对于新的L1层文件由一下限制当当前输出文件达到目标文件大小2MB后我们会切换到生成新的 L1 级文件。当当前输出文件的键值范围增长到足以覆盖超过十个 L2 级文件时我们也会切换到生成新的输出文件。每个层级的compaction会在key中轮换进行。对于每个层级 L我们会记住上一次在该层级compaction的结束key。下一次针对层级 L 的compaction操作会选择该key之后的第一个文件如果不存在这样的文件则会循环回到最小的key。compaction会删除被覆盖的值。如果在更高层级的文件中都没有包含当前 Key则compaction还会删除删除标记。耗时Level-0 的Compaction会从 Level-0 读取最多 4 个 1MB 的文件在最坏情况下还会把 Level-1 的所有文件共 10MB全部读进来。也就是说我们总共需要读取 14MB 并写入 14MB 的数据。除了特殊的 Level-0 Compaction之外对于其他层级我们会从 Level-L 中挑出一个 2MB 的文件。在最坏情况下这个文件会与 Level-(L1) 层的大约 12 个文件发生重叠。因此这种合并将需要读取 26MB 并写入 26MB。假设磁盘的 I/O 速率为 100MB/s现代硬盘的常规大体范围最坏情况下的合并耗时大约为 0.5 秒。如果我们把后台写入的速率限制在一个很小的值比如限制到满速 100MB/s 的 10%即 10MB/s那么一次合并可能会耗时高达 5 秒。此时如果用户正以 10MB/s 的速度高强度写入系统内部可能就会堆积出大量的 Level-0 文件大约需要 50 个文件才能装下这 5 秒内产生的5×10MB5 \times 10\text{MB}5×10MB数据。由于每次读取操作都需要把堆积的文件进行多路归并合并这将会显著暴增用户的查询/读取成本。解决方案可以在 Level-0 文件数量过多时选择增大日志滚动的阈值即调大 MemTable 的刷盘边界。不过这种做法的副作用是这个阈值设置得越大我们就需要消耗越多的物理内存来容纳与之相对应的 MemTable。可以在 Level-0 文件数量不断飙升时主动限制前台用户的写入速率。对于主要目的是降低超多文件参与的大规模归并所带来的性能开销。可以让绝大多数 Level-0 文件的 Data Block 以未压缩的状态常驻在 Block Cache缓存中这样在多路归并迭代时我们只需要承受排序迭代器本身原生的O(N)O(N)O(N)复杂度开销即可。文件数量对于总是生成 2MB 的文件我们可以针对更高层级生成更大的文件以减少文件总数但这会增加Compaction的读写放大。我们也可以将文件集分片到多个目录中。Recover恢复流程首先读取CURRENT文件从中获取最新提交的MANIFEST元数据清单的文件名。读取该指定的MANIFEST文件在内存中重建数据库各层级 SSTable 的版本控制骨架。清理掉磁盘上的所有过期、残存的废弃文件如上次合并进行到一半崩了留下的残渣。可以在这一步就把所有的 SSTable.ldb文件全部打开但更优雅、更推荐的做法是进行“延迟加载/懒加载Lazy Open”……将未落盘的旧日志分片即崩溃前遗留的 WAL 日志里的残留数据转换成一个全新的 Level-0 层 SSTable 文件。基于恢复出来的最新序列号Sequence Number创建一个全新的 WAL 日志文件开始引导并接收后续的所有新写入请求回收旧文件RemoveObsoleteFiles()会在每一次Compaction结束时以及数据库恢复Recovery结束时被调用。它会扫描并找出数据库目录下的所有文件名。随后它会物理删除所有不是当前正在使用的WAL 日志文件同时它还会物理删除所有既没有被任何层级Level所引用、又不是当前正在进行的合并操作所输出的SSTable 文件。

相关新闻

深圳极速网站建设费用到底多少?看完这篇不踩坑,老板们速进

深圳极速网站建设费用到底多少?看完这篇不踩坑,老板们速进

深圳极速网站建设费用很多老板一听到“建站”俩字,头都大了。 怕被坑,怕贵,怕做完不管用。 尤其是想搞“极速”体验的, 更担心价格是个无底洞。 今天咱们不整虚的, 就聊聊这背后的真实行情。 别信那些999元包年建站, 那是陷阱,不是福利。 真正的极速网站, 成本都在看不…

发布时间:2026/7/10 17:32:45
别被忽悠了!扒一扒山东网站建设和游戏开发的公司排名那些坑

别被忽悠了!扒一扒山东网站建设和游戏开发的公司排名那些坑

说实话,刚入这行那会儿,我也是个愣头青,觉得做个网站跟搭积木似的,找个人敲几行代码就完事了。后来碰了一鼻子灰才明白,这水深得能淹死人。现在网上那些所谓的“山东网站建设和游戏开发的公司排名”,看着花里胡哨,点进去全是广告,看得我直反胃。今天咱不整那些虚头巴脑…

发布时间:2026/7/10 17:32:26
别被忽悠了!集团门户网站建设策划的真相,全是血泪教训

别被忽悠了!集团门户网站建设策划的真相,全是血泪教训

刚接手集团官网改版项目时,我也以为就是换个皮肤。结果预算超支三倍,上线后访问卡顿,领导脸色铁青。那一刻我才明白,所谓的“高大上”,往往是个坑。很多老板觉得,花几十万做个网站,就能提升品牌形象。大错特错。网站不是艺术品,是工具。是连接客户、展示实力、甚至直接…

发布时间:2026/7/10 17:32:14
揭秘中国建设银行官网站招聘频道:从海投被拒到拿Offer的真实逆袭指南

揭秘中国建设银行官网站招聘频道:从海投被拒到拿Offer的真实逆袭指南

你是不是每次打开中国建设银行官网站招聘频道,看着密密麻麻的岗位要求就头大?明明觉得自己条件不错,简历投出去却石沉大海,连面试机会都捞不到?这篇文章不灌鸡汤,只讲干货,教你如何利用官方渠道精准定位,避开那些让90%求职者踩坑的隐形雷区,拿到心仪的Offer。先说个真…

发布时间:2026/7/10 18:28:21
雄安免费网站建设靠谱吗?老站长掏心窝子说句大实话

雄安免费网站建设靠谱吗?老站长掏心窝子说句大实话

做企业网站,预算只有几千块甚至想零成本起步,在雄安这片热土上到底行不行得通?这篇文章不卖课不推销,只讲我踩过的坑和真实的行业现状,帮你省下冤枉钱。看完这篇,你就能清楚知道免费建站适合谁,以及那些“免费”背后隐藏的巨大隐患。说实话,刚来雄安那会儿,我也以为“…

发布时间:2026/7/10 18:27:38
宁波网站建设 联系哪家?别被低价忽悠,这3个坑踩了真后悔

宁波网站建设 联系哪家?别被低价忽悠,这3个坑踩了真后悔

找宁波网站建设 联系哪家,这问题问得太真实了。上周有个做外贸的朋友找我喝酒,喝多了哭诉。他说之前为了省钱,找了个报价3000块的公司。结果呢?页面打开慢得像蜗牛,手机端根本没法看,SEO关键词一个都排不上去。最后没办法,只能花双倍的钱推倒重来。你看,这就是贪便宜的…

发布时间:2026/7/10 18:26:44
高端企业门户网站建设费用到底多少?老板们别被坑了

高端企业门户网站建设费用到底多少?老板们别被坑了

很多老板一开口就问,做个高端官网要多少钱?这问题就像问“买辆车要多少钱”一样。你是要买菜用的五菱宏光,还是要拉风的保时捷?差别太大了。我见过太多企业,拿着十万预算,非要做出百万的效果。结果呢?要么被忽悠,要么做出来的东西惨不忍睹。今天咱们不整虚的,聊聊这背…

发布时间:2026/7/10 18:25:16
怎样向顾客电销网站建设才能不挨骂?老销售的血泪复盘

怎样向顾客电销网站建设才能不挨骂?老销售的血泪复盘

电话一响,心里发慌。是不是你?每次拿起听筒,还没开口,手心就出汗。怕被挂断,怕被骂,怕对方觉得你烦。我懂。我也经历过那种时刻。刚入行那会儿,我一天打80个电话。结果呢?99个是拒接,1个是骂我骗子。那种挫败感,真的想摔手机。但后来我想通了。电销不是骚扰,是价值传…

发布时间:2026/7/10 18:24:52
3个技巧掌握喜马拉雅VIP音频批量下载:XMly-Downloader-Qt5完整指南

3个技巧掌握喜马拉雅VIP音频批量下载:XMly-Downloader-Qt5完整指南

3个技巧掌握喜马拉雅VIP音频批量下载:XMly-Downloader-Qt5完整指南 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 还在…

发布时间:2026/7/10 18:25:24
老板们别被忽悠了,企业网站建设费用摊销到底怎么算才不亏?

老板们别被忽悠了,企业网站建设费用摊销到底怎么算才不亏?

说实话,每次听到老板们拍着桌子问“做个网站要多少钱”,我心里就直犯嘀咕。你们关心的根本不是网站好不好用,而是这钱花得值不值,能不能立马变出利润来。我见过太多公司,花个三五万做个花里胡哨的首页,结果后台乱成一锅粥,SEO标签全没填,上线半年连个蜘蛛都不爬。这种钱…

发布时间:2026/7/10 0:00:19
网站搜索建设怎么做?新手避坑指南与实战心得

网站搜索建设怎么做?新手避坑指南与实战心得

很多老板做网站,花大价钱搞设计,最后发现用户根本找不到内容,搜索功能形同虚设。这篇干货不讲虚的,直接告诉你怎么搭建一个真正好用的站内搜索,解决用户找不到东西、跳出率高的问题。上周我去了一家做高端家具的电商网站。页面确实漂亮,极简风,高级感拉满。但是,我想找…

发布时间:2026/7/10 0:00:33
北京市建设工程质量监督网站查询实操指南与避坑实录

北京市建设工程质量监督网站查询实操指南与避坑实录

做工程最怕什么?怕验收不过,怕资料补不齐,怕最后拿着钱还背一身债。这篇不整虚的,直接告诉你怎么通过北京市建设工程质量监督网站搞定验收流程,以及那些没人愿意告诉你的隐形坑。先说个真事儿。上个月有个做装修的朋友,急着拿竣工验收备案表,结果在北京市建设工程质量监…

发布时间:2026/7/10 0:00:37
做个人信息管理网站建设,这3个坑我踩了七年,你千万别再跳

做个人信息管理网站建设,这3个坑我踩了七年,你千万别再跳

做了七年建站,见过太多老板花大钱买模板,最后发现根本没法用。特别是现在大家都讲究数据隐私,想搞个个人信息管理网站建设,结果越搞越乱。这篇文不整虚的,直接说怎么把这套系统落地,让你自己的数据真正听话。先说个真事儿。去年有个做自由职业的朋友找我,他说想建个网站…

发布时间:2026/7/10 15:55:18
杨凌规划建设局网站怎么查最新规划?老杨说点大实话

杨凌规划建设局网站怎么查最新规划?老杨说点大实话

杨凌规划建设局网站你是不是也遇到过这种情况?想看看自家旁边要修路,还是建公园。翻遍了手机,搜出来的全是几年前的旧闻。或者好不容易找到个入口,页面加载慢得像蜗牛。心里那个急啊,真的,懂的人都懂。我是老杨,在杨凌混了十几年,跟这行打交道不少。今天不跟你扯那些虚…

发布时间:2026/7/9 15:43:42
杭州网站建设 seo 避坑指南:别被那些只会套模板的忽悠了

杭州网站建设 seo 避坑指南:别被那些只会套模板的忽悠了

昨天半夜两点,我还在改一个客户的后台,咖啡都凉透了。这哥们儿是做机械配件的,在余杭那边,找的前一家公司花了八千块做了个站,结果上线一个月,百度连个影子都没有。他急得给我打电话,说是不是被黑了。我让他把链接发过来,打开一看,好家伙,那代码乱得跟刚被猫抓过的毛…

发布时间:2026/7/9 16:54:10
建站7年才悟出的网站建设思路,别再花冤枉钱了

建站7年才悟出的网站建设思路,别再花冤枉钱了

做建站这行整整7年了。 见过太多老板花几万块, 最后做出来的网站像个垃圾场。 今天不整那些虚头巴脑的术语。 就聊聊我踩过的坑, 和真正能落地的网站建设思路。很多老板一上来就问: “多少钱能做个高大上的?” 我通常直接劝退。 因为方向错了, 你给再多钱也是打水漂。 真正…

发布时间:2026/7/9 15:45:02
合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

合肥的网站建设避坑指南:别被低价忽悠,这3个细节决定生死

做企业官网最怕什么?不是技术难,是交钱后没人管,或者上线一个月连个访客都没有。这篇东西不扯虚的,直接告诉你怎么在合肥找个靠谱的团队,或者自己怎么避坑。先说个大实话,我在合肥混这行五年多,见过太多老板因为贪便宜吃大亏。你去百度搜“合肥的网站建设”,出来一堆报…

发布时间:2026/7/10 18:05:06
别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

别被忽悠了!德州网站建设那些坑,我拿真金白银换来的教训

做这行久了,心里就憋着一股火。每次看到客户拿着网上抄来的模板,问我能不能做成“苹果官网”那种效果。我就想笑。真的,太想笑了。今天咱不整那些虚头巴脑的专业术语。就聊聊德州网站建设里,那些让人头秃的真实事儿。我有个客户,老张。他是做德州本地建材的,实在人。当初…

发布时间:2026/7/10 16:48:50