深入leveldb-初步认识leveldb

简介:     文章参考http://blog.chinaunix.net/uid-26575352-id-3245476.html1. leveldb简介    leveldb是google两位工程师实现的单机版k-v存储系统,具有以下几个特点    1.

    文章参考http://blog.chinaunix.net/uid-26575352-id-3245476.html

1. leveldb简介

    leveldb是google两位工程师实现的单机版k-v存储系统,具有以下几个特点

    1. key和value都是任意的字节数组,支持内存和持久化存储

    2. 数据都是按照key排序

    3. 用户可以重写排序函数

    4. 包含基本的数据操作接口,Put(key,value),Get(key),Delete(key)

    5. 多操作可以当成一次原子操作

    6. 用户可以通过生成snapshot,使得读取操作不受写操作影响,读取过程中看到最终数据一致性

    7. 支持迭代器对数据的操作

    8. 数据使用snappy自动压缩

    9. 外部操作(如文件系统操作等)通过一个虚拟接口使用,用户可以对操作系统进行定制相应操作


2. leveldb局限性

    1. leveldb非关系型数据库,不支持SQL查询也不支持索引

    2. 同一时间只支持单进程(支持多线程)访问db

    3. 不支持客户端-服务器模型,用户需要自己封装


3. leveldb基本框架

    LevelDb本质上是一套存储系统以及在这套存储系统上提供的一些操作接口。为了便于理解整个系统及其处理流程,我们可以从两个不同的角度来看待LevleDb:静态角度和动态角度。从静态角度,可以假想整个系统正在运行过程中(不断插入删除读取数据),此时我们给LevelDb照相,从照片可以看到之前系统的数据在内存和磁盘中是如何分布的,处于什么状态等;从动态的角度,主要是了解系统是如何写入一条记录,读出一条记录,删除一条记录的,同时也包括除了这些接口操作外的内部操作比如compaction,系统运行时崩溃后如何恢复系统等等方面

    leveldb做为存储系统,在整个系统运行过程中,基本的框架如下所示

   

    如图所示,leveldb的存储介质分为内存和磁盘两种。内存中有memtable和immutable memtable;磁盘中有log文件,manifest文件,Current文件以及分level的sstable文件;

    1). 当用户往db插入一条key-value数据的时候,会先写log文件,当写log成功之后再把当前记录写到memtable中。为什么写数据的时候要先写log文件呢,主要是因为新插入的数据会保存在内存中,为了防止系统崩溃导致新插入数据丢失,因此要先写log文件保证落地之后,再写内存。这样即使系统崩溃了,也能够从log中恢复出来。

    2). memtable中的数据是可读可写,当memtable的数据量达到一个数据量之后。当前的memtable变成了immutable memtable,只读不可修改。重新生成新的memtable和log文件,新来的数据写到新的log和memtable中。

    3). immutable memtable中的数据会被dump到磁盘中的sstable文件,磁盘中的sstable文件是有层级的,第一层level0到第n层leveln...,每个level都有很多sstable文件,每个文件都是按照key排好序。注意了level0和其它level不一样,level0中的sstable文件的key有可能重复,其它level的sstable文件的key保证不会有重复。

    4). 由于每个level中有许多sstable文件,每个sstable文件都有key range。所以需要一个文件来保存当前所有level中sstabel的key range。manifest文件主要就是用来存储每个level中的sstable的信息

        

     5). 随着系统不断的运行,每个level中的sstable文件可能会越来越多,这个时候db会自动把同一个level或者不同level中的sstable文件会进行merge。这个时候manifest就会发生变化,因此我们需要一个Current文件来记录当前最新的manifest文件。

     未完待续...



目录
相关文章
|
4月前
|
人工智能 资源调度 监控
LangChain脚本如何调度及提效?
本文介绍了通过任务调度系统SchedulerX管理LangChain脚本的方法。LangChain是开源的大模型开发框架,支持快速构建AI应用,而SchedulerX可托管AI任务,提供脚本版本管理、定时调度、资源优化等功能。文章重点讲解了脚本管理和调度、Prompt管理、资源利用率提升、限流控制、失败重试、依赖编排及企业级可观测性等内容。同时展望了AI任务调度的未来需求,如模型Failover、Tokens限流等,并提供了相关参考链接。
274 28
LangChain脚本如何调度及提效?
|
4月前
|
机器学习/深度学习 人工智能 运维
AI加持的系统性能优化:别让你的服务器“累趴下”
AI加持的系统性能优化:别让你的服务器“累趴下”
234 12
|
10月前
|
人工智能 Serverless 数据处理
极速启动,函数计算弹性降本能力再升级
在数字化转型的大潮中,云计算成为推动创新和优化业务流程的关键力量。作为阿里巴巴集团的核心产品之一,函数计算(Function Compute)引领着 Serverless 计算的新时代。本文将深入探讨函数计算如何通过技术革新实现提效降本,以及其在 AI 业务、数据处理和 Web 应用等多个领域的广泛应用。
506 31
|
11月前
|
数据采集 前端开发 开发者
Selenium中如何实现翻页功能
在使用Python的Selenium库进行网页爬虫开发时,翻页操作是常见需求。本文详细介绍如何通过Selenium实现翻页,包括定位翻页控件、执行翻页动作以及等待页面加载等关键步骤,并提供了基于“下一页”按钮和输入页码两种方式的具体示例代码。此外,还特别提醒开发者注意页面加载完全、动态内容加载及反爬机制等问题,确保爬虫稳定高效运行。
1152 3
|
存储 自然语言处理 NoSQL
Vector | Graph:蚂蚁首个开源Graph RAG框架设计解读
本文作者设计了一个通用的开源RAG框架,以兼容未来多样化的基础研究建设和工程化应用诉求。
|
存储 监控 Go
面向OpenTelemetry的Golang应用无侵入插桩技术
文章主要讲述了阿里云 ARMS 团队与程序语言与编译器团队合作研发的面向OpenTelemetry的Golang应用无侵入插桩技术解决方案,旨在解决Golang应用监控的挑战。
|
存储 缓存 NoSQL
数据缓存,可以尝试用RocksDB了
`shigen`,一个专注于Java、Python、Vue和Shell的博主,探讨了为何在学习阿里云DRM产品时选择RocksDB而非Redis或Guava。RocksDB是一个高速、可配置的存储系统,适用于Flash和HDFS,支持数据压缩。与Redis相比,RocksDB在高速存储和灵活性上更具优势。在尝试使用RocksDB与SpringBoot集成时遇到问题,目前尚未解决。他还对比了RocksDB、Redis和Guava Cache的特性,强调RocksDB适合大规模、高性能场景,而Redis适合内存存储和实时性需求。
311 0
数据缓存,可以尝试用RocksDB了
|
XML 安全 Java
【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地
【分布式技术专题】「单点登录技术架构」一文带领你好好对接对应的Okta单点登录实现接口服务的实现落地
679 0
|
存储 分布式计算 NoSQL
RocksDB:高性能键值存储引擎初探
RocksDB:高性能键值存储引擎初探
|
XML 人工智能 JSON
【AI大模型应用开发】【LangChain系列】5. 实战LangChain的智能体Agents模块
【AI大模型应用开发】【LangChain系列】5. 实战LangChain的智能体Agents模块
901 0