RocksDB简介
1、RocksDB简介
RocksDB项⽬起源于Facebook的⼀个实验项⽬,该项⽬旨在开发⼀个与快速存储器(尤其是闪存)存储数据性能相当的数据库软件,以应对⾼负载服务。
这是⼀个c++库,可⽤于存储键和值,可以是任意⼤⼩的字节流。它⽀持原⼦读和写。
RocksDB具有⾼度灵活的配置功能,可以通过配置使其运⾏在各种各样的⽣产环境,包括纯内存,Flash,硬盘或HDFS。它⽀持各种压缩算法,并提供了便捷的⽣产环境维护和调试⼯具。
2、假设和⽬标
转基因性能:
下奶汤有哪些RocksDB的主要设计⽬标是保证存取快速存储器和⾼负载服务器更⾼效,保证充分利⽤Flash或RAM⼦系统提供的⾼速率读写,⽀持⾼效的查找和范围scan,⽀持⾼负载的随机读、⾼负载的更新操作或两者的结合。其架构应该⽀持⾼并发读写和容量⼤增时系统的⼀致性。
向后兼容性:
这个软件的新版本应该是向后兼容的,因此,当升级到新版本时现有的应⽤程序不需要改变。
3、⾼级体系结构
RocksDB是⼀个嵌⼊式键值存储器,其中键和值是任意的字节流。RocksDB中的所有数据是按序存放的。常见操作包括Get(key), Put(key), Delete(key) and Scan(key)。
RocksDB有三个基本结构:RocksDB memtable,sstfile和logfile。memtable是⼀个内存数据结构——新数据会插⼊到memtable和⽇志⽂件(可选)。⽇志⽂件是顺序写⼊的,位于磁盘。当memtable写满后,数据会被刷新到磁盘上的sstfile⽂件,同时相应的⽇志⽂件可以安全地删除。sstfile中的数据经过排序的,⽬的是为了加快键查找。
4、特性
Gets,迭代器和快照
键和值被视为纯字节流,没有⼤⼩的限制。
Get接⼝允许应⽤程序从数据库中获取⼀个键值。MultiGet接⼝允许应⽤程序从数据库中检索多个键值。MultiGet接⼝返回的key-value对都是相互匹配的。所有数据库中的数据都按顺序存放。应⽤程序可以指定⼀个key⽐较⽅法来定义key的排序顺序。迭代器允许应⽤程序对数据库进⾏RangeScan。
迭代器可以先定位⼀个指定的键,然后应⽤程序就可以从这个定位点开始⼀个⼀个扫描key。迭代器还可以⽤来对key做反向迭代。创建迭代器是会创建当前数据库的⼀个快照视图,因此,通过迭代器返回的所有键都来⾃同⼀个数据库视图。
Snapshot允许应⽤程序创建⼀个快照视图。Get和迭代器可以从⼀个指定的快照读取数据。在某种意义上,Snapshot和迭代器都提供了某个时间点上数据库的快照视图,但两者的实现是不同的。
短暂的扫描最好通过迭代器⽽耗时较长的扫描最好通过快照。迭代器记录了数据库当前视图对应⽂件,直到迭代器被释放才删除这些。⽽快照并不能阻⽌⽂件删除;相反,compaction流程知道当前的快照并且不会删除任何现有快照中的key。数据库重启后,快照将丢失。重载RocksDB(通过服务器重启)会释放所有先前的快照。
前缀迭代器
⼤多数LSM引擎⽆法⽀持⼀个⾼效RangeScan,因为它需要查找每⼀个数据⽂件。但⼤多数应⽤程序不会对key进⾏随机扫描,⽽更多的是扫描给定前缀的key。
女人月经一直不干净是什么原因
RocksDB利⽤了这种优势。应⽤程序可以通过prefix_extractor指定⼀个key的前缀。RocksDB⽤此来保存每个key前缀的bloom,指定了前缀(通过ReadOptions)
的迭代器将使⽤bloom⼆进制位来避免查找不包含指定key前缀的⽂件。
更新
Put操作向数据库插⼊单个key-value。如果键已经存在,旧值将被覆盖。Writer操作允许将多个keys-values原⼦地插⼊到数据库中。数据库保证同⼀个Writer操作
中的所有keys-values要么全部插⼊,要么都不插⼊。如果其中任何⼀个键已经存在于数据库中,旧值将被覆盖。
持久性
大虾的做法大全
Put操作数据会存储在内存中的缓冲区称为memtable,也会选择性地插⼊到事务⽇志。每⼀个Put操作都有⼀组标志(通过WriteOptions设置),这些标志指定Put操作数据是否应该插⼊到事务⽇志。WriteOptions也可以指定在put操作提交前⼀个同步调⽤是否写⼊事务⽇志。在内流产假多少天>撒娇卖萌的句子
部,RocksDB使⽤batch-commit机制批量写⼊事务⽇志,这样它可以使⽤⼀个同步调⽤提交多个事务。
容错
RocksDB使⽤校验和检测数据是否正确。每个块(通常是4k到128k⼤⼩)都有⾃⼰的校验和。⼀块数据⼀旦写⼊将不会修改。RocksDB通过硬件⽀持动态获取校验和的计算结果,以避免需要是⾃⼰计算校验和。
多线程Co m pa c tio n
Compactions可以删除同⼀key的多个副本,副本是应⽤程序覆盖现有key是产⽣的,可以删除key。通过配置可以让Compaction以多线程⽅式运⾏。
LSM的写数据的整体吞吐量直接取决于Compaction的速度,特别是当数据存储在SSD或RAM这种存储器中。RocksDB可以处理多个线程并发的Comopaction请求。多线程Compaction场景下写数据的速率⽐单线程场景下的速率快10倍。
整个数据库存储在⼀组sstfiles。memtable写满时,它的内容会被写⼊Level-0层的⼀个⽂件中,在此过程中,重复和被覆盖的key会被删除。
⼀些⽂件被定期压缩合并形成更⼤的⽂件——这就是所谓的compaction。
RocksDB⽀持两种不同形式的compaction。普遍的做法是将所有⽂件按时间顺序保存在L0。compaction选择⼏个彼此相邻的⽂件并将它们合并成⼀个新⽂件L0。所有⽂件可以有重叠的key。分
虚拟语气语法
层形式的compaction将数据存储在数据库中的多个层中。最新的数据存储在L0和最旧的数据存储在Lmax。L0层中的⽂件可以有重叠的key,但其他层中⽂件的key不能重叠。⼀次compaction过程就是选择Ln层的⼀个⽂件及它在Ln+1层的所有重叠⽂件进⾏压缩合并形成Ln+1层的新⽂件。相⽐层形式的compaction⽅法,普遍的compaction⽅法写数据性能较低,但空间利⽤率较⾼。
MANIFEST⽂件记录了数据库的状态。compaction在添加新⽂件和从数据库删除现有的⽂件后,会将这些操作记录到MANIFEST⽂件。事务⽇志是被批量提交到MANIFEST⽂件中的,⽬的是为了减少对MANIFEST⽂件的重复同步访问。
mpa
Co m pa c tio n过滤器
⼀些应⽤程序可能需要在Compaction过程中处理某些key。例如,⼀个⽀持TTL的数据库可能删除过期的key,这可以通过定义⼀个Compaction 过滤器完成。
三季度工作总结
如果应⽤程序想要不断删除旧数据,可以使⽤Compaction过滤掉丢弃过期的记录。RocksDB Compaction过滤器可以允许应⽤程序去修改对应key的value或作为Compaction过程的⼀部分直接丢弃key。
只读的模式
数据库可以在只读的模式下打开。只读模式下应⽤程序不能修改任何数据。这可以保证更⾼的读取性能,因为避免了代码执⾏路径的切换和锁的使⽤。
数据库调试⽇志
RocksDB的详细⽇志被写⼊到名为LOG*的⽂件中。这些⽇志⽤于调试和分析运⾏中的系统。可以按配置的指定周期记录⽇志。
数据压缩
RocksDB⽀持snappy,zlib,bzip2 lz4和lz4_hc压缩算法。对不同层的数据可以配置不同的压缩算法。⼀般来说,90%的数据保存在Lmax层。
⼀个典型的安装可能是L0-L2层不配置压缩算法,中间层⽤snappy压缩算法,⽽Lmax层采⽤zlib压缩。
事务⽇志
RocksDB将事务⽇志保存在logfile⽂件中以防⽌系统崩溃。系统启动时会重新处理⽇志⽂件。logfile和_sstfile_s可以存放在不同⽬录下,⽐如下⾯的场景,
当你希望将所有数据⽂件存储在⾮持久但快速的存储设备中,同时把事务⽇志保存在存取速度慢但持久的存储设备中。