LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口。为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度。
从静态角度,可以假想整个系统正在运行过程中(不断插入删除读取数据),此时我们给LevelDb照相,从照片可以看到之前系统的数据在内存和磁盘中是如何分布的,处于什么状态等;
从动态的角度,主要是了解系统是如何写入一条记录,读出一条记录,删除一条记录的,同时也包括除了这些接口操作外的内部操作比如compaction,系统运行时崩溃后如何恢复系统等等方面。
本节所讲的整体架构主要从静态角度来描述,之后接下来的几节内容会详述静态结构涉及到的文件或者内存数据结构,LevelDb日知录后半部分主要介绍动态视角下的LevelDb,就是说整个系统是怎么运转起来的。
LevelDb作为存储系统,数据记录的存储介质包括内存以及磁盘文件,如果像上面说的,当LevelDb运行了一段时间,此时我们给LevelDb进行透视拍照,那么您会看到如下一番景象:
从图中可以看出,构成LevelDb静态结构的包括六个主要部分:内存中的MemTable和Immutable MemTable以及磁盘上的几种主要文件:Current文件,Manifest文件,log文件以及SSTable文件。当然,LevelDb除了这 六个主要部分还有一些辅助的文件,但是以上六个文件和数据结构是LevelDb的主体构成元素。
LevelDb的Log文件和Memtable与Bigtable论文中介绍的是一致的,当应用写入一条Key:Value记录的时候,LevelDb会 先往log文件里写入,成功后将记录插进Memtable中,这样基本就算完成了写入操作,因为一次写入操作只涉及一次磁盘顺序写和一次内存写入,所以这 是为何说LevelDb写入速度极快的主要原因。
Log文件在系统中的作用主要是用于系统崩溃恢复而不丢失数据,假如没有Log文件,因为写入的记录刚开始是保存在内存中的,此时如果系统崩溃,内存中的 数据还没有来得及Dump到磁盘,所以会丢失数据(Redis就存在这个问题)。为了避免这种情况,LevelDb在写入内存前先将操作记录到Log文件 中,然后再记入内存中,这样即使系统崩溃,也可以从Log文件中恢复内存中的Memtable,不会造成数据的丢失。
当Memtable插入的数据占用内存到了一个界限后,需要将内存的记录导出到外存文件中,LevleDb会生成新的Log文件和Memtable,原先 的Memtable就成为Immutable Memtable,顾名思义,就是说这个Memtable的内容是不可更改的,只能读不能写入或者删除。新到来的数据被记入新的Log文件和 Memtable,LevelDb后台调度会将Immutable Memtable的数据导出到磁盘,形成一个新的SSTable文件。SSTable就是由内存中的数据不断导出并进行Compaction操作后形成 的,而且SSTable的所有文件是一种层级结构,第一层为Level 0,第二层为Level 1,依次类推,层级逐渐增高,这也是为何称之为LevelDb的原因。
SSTable中的文件是Key有序的,就是说在文件中小key记录排在大Key记录之前,各个Level的SSTable都是如此,但是这里需要注意的 一点是:Level 0的SSTable文件(后缀为.sst)和其它Level的文件相比有特殊性:这个层级内的.sst文件,两个文件可能存在key重叠,比如有两个 level 0的sst文件,文件A和文件B,文件A的key范围是:{bar, car},文件B的Key范围是{blue,samecity},那么很可能两个文件都存在key=”blood”的记录。对于其它Level的 SSTable文件来说,则不会出现同一层级内.sst文件的key重叠现象,就是说Level L中任意两个.sst文件,那么可以保证它们的key值是不会重叠的。这点需要特别注意,后面您会看到很多操作的差异都是由于这个原因造成的。
SSTable中的某个文件属于特定层级,而且其存储的记录是key有序的,那么必然有文件中的最小key和最大key,这是非常重要的信 息,LevelDb应该记下这些信息。Manifest就是干这个的,它记载了SSTable各个文件的管理信息,比如属于哪个Level,文件名称叫 啥,最小key和最大key各自是多少。下图是Manifest所存储内容的示意:
图中只显示了两个文件(manifest会记载所有SSTable文件的这些信息),即Level 0的test.sst1和test.sst2文件,同时记载了这些文件各自对应的key范围,比如test.sstt1的key范围是“an”到 “banana”,而文件test.sst2的key范围是“baby”到“samecity”,可以看出两者的key范围是有重叠的。
Current文件是干什么的呢?这个文件的内容只有一个信息,就是记载当前的manifest文件名。因为在LevleDb的运行过程中,随着 Compaction的进行,SSTable文件会发生变化,会有新的文件产生,老的文件被废弃,Manifest也会跟着反映这种变化,此时往往会新生 成Manifest文件来记载这种变化,而Current则用来指出哪个Manifest文件才是我们关心的那个Manifest文件。
以上介绍的内容就构成了LevelDb的整体静态结构,在LevelDb日知录接下来的内容中,朗格科技会首先介绍重要文件或者内存数据的具体数据布局与结构。
http://blog.chinaunix.net/uid-26111972-id-3342224.html
相关推荐
leveldb的整体架构可以从静态角度和动态角度来理解。从静态角度,可以假想leveldb正在运行,我们给leveldb进行“拍照”,可以观察到之前系统的数据在内存和磁盘中的分布和状态。从动态的角度,主要理解系统是如何...
整体而言,LevelDB的设计巧妙地平衡了读写性能,通过有序写入和延迟合并的策略,极大地提升了写入性能,同时通过有序的存储结构和索引机制,保持了不错的读取速度。通过深入理解LevelDB的架构和组件,开发者可以更好...
在IT行业中,消息队列(Message Queue)是分布式系统中重要的组件,用于解耦...同时,LevelDB的使用保证了数据的快速存取,提升了整体系统的性能。在实际应用中,这样的集群架构可以适应大规模、高并发的消息处理需求。
- **LSM Tree架构**:LevelDB采用了LSM Tree架构,能够在保证低延迟的同时,有效减少磁盘I/O次数。 - **多级存储**:通过将数据按照访问频率分层存储,提高了整体的查询性能。 - **缓存机制**:通过多级缓存,...
在实际应用中,GoStore可以用于构建微服务架构,每个服务可以根据需求选择合适的数据库,或者在需要进行数据迁移时,可以轻松地切换数据库后端,而不会影响整体系统的运行。此外,GoStore还可以帮助开发者快速开发...
3. **正式阶段二 - LevelDB**:为了解决Redis在某些特定场景下的不足,尝试使用LevelDB作为替代方案。 4. **正式阶段三 - Redis**:经过一系列实验和评估之后,最终还是选择了Redis作为主要的消息存储引擎,并针对其...
#### 二、ActiveMQ核心概念与架构 **2.1 ActiveMQ的架构是什么样的?** ActiveMQ采用了典型的“生产者-消费者”模型,其中包含以下几个关键组件: - **Broker**: 消息代理或服务器,负责接收和转发消息。 - **...
Firefox浏览器架构 任务 更改Mozilla。 调查重大技术挑战并制定工程计划以应对这些挑战。 我们的结论 这是到目前为止我们对我们的发现感到满意的列表。 将研究我们如何与Mozilla的其余部分进行通信。 考虑提取...
通过下载并使用`apache-activemq-5.15.0`压缩包,开发者可以快速搭建一个高效、安全的消息传递系统,提升应用的并发处理能力和整体架构的灵活性。在实际部署时,可以根据具体需求配置ActiveMQ的参数,如内存大小、...
NewsBlockChain设计文档详细阐述了构建一个分布式新闻区块链系统的过程,该系统运行在多种平台上,包括Microsoft Windows 10...整体来看,NewsBlockChain设计注重用户体验,同时兼顾了区块链的去中心化、安全性与效率。
通过这种方式,LSM-tree的合并操作和数据分配可以并行进行,减少了延迟,并提升了整体性能。此外,LOCS还考虑了SSD的错误纠正码(ECC)和磨损均衡策略,确保数据的可靠性和SSD的长期稳定性。 在实现上,LOCS需要对...
在整体架构上,Tera采用列式存储,利用SSD进行高效的数据存储与读写。架构上分为DFS(分布式文件系统)负责数据持久化,Master节点负责全局协调,包括分配tablet、垃圾回收、负载均衡等。TabletServer处理读写请求,...
例如TC/TT、Dynamo、Voldemort、Berkeley DB (BDB)、Riak、memBase、LevelDB、memcached、Tair等。 2. **列族(Column Family)存储**:支持基于列的特定操作,例如HBase、Cassandra、Hypertable等,这类系统特别适合...
#### 三、RocksDB的整体架构及读写分析 ##### 3.1 RocksDB的基础架构组成 RocksDB的基础架构由以下几部分组成: - **WAL (Write-Ahead Log)**:这是一种顺序写入的日志文件。所有写入操作都会首先记录在WAL中,...
在实际应用中,进程内缓存可以被看作是一个简单的带锁的Map结构,或者是利用如LevelDB这样的第三方库进行构建。 #### 二、进程内缓存的应用场景 进程内缓存能够存储各种类型的数据,包括但不限于JSON数据、HTML...
在高可用集群中,ActiveMQ可以通过复制队列数据来保证消息不丢失,并通过负载均衡将消息分发到不同的节点,提高系统的整体性能。 **ZooKeeper与ActiveMQ的结合** ZooKeeper与ActiveMQ的结合主要用于实现以下功能: ...
在互联网存储架构中,弹性扩容是一项关键能力,它允许系统随着数据量和用户需求的增长而无缝扩展,确保服务的稳定性和高效性。本文通过RocksDB这个案例,深入探讨了如何实现这一目标。 RocksDB是由Facebook开源的一...
例如TC/TT、Dynamo、Voldemort、BDB、Riak、memBase、LevelDB、MemcacheDB和Tair等。 2. **列族(Column Family)存储**:这类系统支持针对列的特定操作,例如HBase、Cassandra和Hypertable等。 3. **文档型存储**:...
负载均衡策略确保请求被合理地分发到各个服务实例,提高系统的整体处理能力。超时重试和故障恢复机制则增强了系统的健壮性,当调用失败或网络异常时,可以自动重试或者切换到其他服务实例。 在百度RPC框架中,可能...
数据分布和负载均衡策略是关键,确保数据在各个节点间均匀分配,提高整体处理能力。 3. **数据存储与管理**: 在C++中,可能使用自定义的键值存储或列式存储系统来处理大数据。例如,LevelDB或RocksDB这样的嵌入式...