に銀ラインカードを販売していハドア

619998462██:に銀を売却ラインカード██マイクロ手紙を持っているハドア

LevelDBは、Googleの伝説的エンジニアジェフ・ディーンとサンジェイ・ゲマワットとオープンソースで開発された、永続的なKVデータベースエンジンです。設計やコードの面では慎重に一見の価値は、エレガントを記述するために使用することができます。全体の特性、建築および他の態様の使用からのこの記事では、我々は完全に理解を持っており、使用することができLevelDBように、この記事で紹介しようと、説明を行います。

デザインのアイデア

はるかに大きいランダム書き込みよりも通常の機械的なディスクのシーケンシャル書き込みパフォーマンスのために、学生の非常に明確な記憶を作りました。例えば、15,000 RPM SASディスク、4K IO書き込み、ランダム書き込み性能は1MB /秒であるか、そうかもしれないが、200メガバイト/秒を書き込むためです。LevelDBのデザインのアイデアは、ディスクのこの機能を使用することです。

LevelDBデータを実現LSM-ツリー構造を使用してディスクに保存されています。LSM-ツリーシーケンシャル書き込みへのランダム書き込みディスク、大幅書き込み速度を向上させることができます。この考えLSM-Treeインデックスのツリー構造を行うために、彼らは共同で整然とした鍵空間を維持し、より大きなディスクに永続化大1と2本の小さな木、小さな永久メモリに分割されます。メモリの書き込み動作は、第1のメモリ大きな木の変化に、ツリーで動作し、ツリーはディスクマージ操作をトリガーする、および書き込み操作自体は、単にマージの順番です。下図のように:

データメモリの回路図

図2は、データブロック、以下に示すようにディスクスペースの後に格納された計算順次マージされる赤色領域であり、これは、追加のストレージタイプ、ディスクに書き込まれ、すなわち、順次です。

書き込みデータでは、ディスクの木が成長することができますと、それぞれに関連する大量のデータを避けるために、操作をマージし、読み出し動作と最適化を考慮し、ディスクLevelDB上のデータは、再び、複数の層へのそれぞれを分割しましたデータは次の層のマージ操作をトリガする能力のあるレベルに達した後、層よりも各レイヤのデータは、どの倍増しました。これは、ソースLevelDBの名前です。主な特徴

ここでは、以下を含むその特性LevelDB、公式の説明は次のとおりです。

、キーと値は、任意の長さのバイト配列である、項目(すなわちレコードKV)ディクショナリに格納されたデフォルトのキー配列に応じて、当然のことながら、開発者がこの種の機能を無効にすることができ、プット():基本的な操作インターフェースを提供します()は、Get()、削除バッチ(); アトミックバッチ操作をサポートし、データのパノラマのスナップショット(スナップショット)を作成し、スナップショットのデータを見つけることが許さことができます; に(または後方)を反復することにより、フロントデータ(暗黙的な反復がスナップショットを作成する); 自動的にスナッピー圧縮データ; 移植; コンパイルして使用

LevelDBは比較的簡単ですコンパイルし、あなたは(ダウンロードアドレス、SX Baiduの広告のヒントを見つけてください)公式サイトから直接コードのクローンを作成することができます。次のように具体的な手順は、(READMEファイルのソースコードを参照)です。

上記の手順の完了は、あなたは静的ライブラリ、ライブラリと動的テスト手順の数をコンパイルすることができます。私たちは、テストするためのテストコードを書くことができます。次のように次の例では、静的ライブラリが入って来て、その後、TEST.CPPという名前のファイルを作成libleveldb.aコピーし、テストディレクトリleveldbディレクトリを作成し、文書が読み取ります。

テストプログラム機能は、非常に簡単ですKVのKVデータベースへの1000のデータを追加することです。また、ここではライン上で見て、このフォローアッププログラムを使用します。コマンドによって、特定のコンパイルされた実行可能。

G ++ -o leveldbTest TEST.CPP libleveldb.a -lpthread -lsnappy

あなたがプログラムについて実行すると、現在のディレクトリに見ることができtestbd1というディレクトリが生成されます、次のように、内容は以下のとおりです。

図2 LevelDBメインファイル

全体の構造

对LevelDB有一个整体的认识之后,我们分析一下它的架构。这里面有一个重要的概念(或者模块)需要理解,分别是内存数据的Memtable,分层数据存储的SST文件,版本控制的Manifest、Current文件,以及写Memtable前的WAL。这里简单介绍各个组件的作用和在整个结构中的位置,更详细的介绍本号将另外写文章进行介绍。在介绍之前,我们先看一下整体架构示意图:

图3 LevelDB整体架构图

如图3所示,对于写数据,接口会同时写入内存表(MemTable)和日志中。当内存表达到阈值时,内存表冻结,变为Immutable MemTable,并将数据写入SST表中,其中SST表时在磁盘上的文件。下面是涉及到主要模块的简单介绍:

Memtable:内存数据结构,跳表实现,新的数据会首先写入这里;Log文件:写Memtable前会先写Log文件,Log通过append的方式顺序写入。Log的存在使得机器宕机导致的内存数据丢失得以恢复;Immutable Memtable:达到Memtable设置的容量上限后,Memtable会变为Immutable为之后向SST文件的归并做准备,顾名思义,Immutable Mumtable不再接受用户写入,同时会有新的Memtable生成;SST文件:磁盘数据存储文件。分为Level 0到Level N多层,每一层包含多个SST文件;单层SST文件总量随层次增加成倍增长;文件内数据有序;其中Level0的SST文件由Immutable直接Dump产生,其他Level的SST文件由其上一层的文件和本层文件归并产生;SST文件在归并过程中顺序写生成,生成后仅可能在之后的归并中被删除,而不会有任何的修改操作。Manifest文件: Manifest文件中记录SST文件在不同Level的分布,单个SST文件的最大最小key,以及其他一些LevelDB需要的元信息。Current文件: 从上面的介绍可以看出,LevelDB启动时的首要任务就是找到当前的Manifest,而Manifest可能有多个。Current文件简单的记录了当前Manifest的文件名,从而让这个过程变得非常简单。写流程简析

了解了整体流程和架构后,我们分析两个基本的流程,也就是LevelDB的写流程和读流程。我们这里首先分析一下写流程,毕竟要先有数据后才能读数据。

LevelDB的写操作包括设置key-value和删除key两种。需要指出的是这两种情况在LevelDB的处理上是一致的,删除操作其实是向LevelDB插入一条标识为删除的数据。下面我们先看一下LevelDB插入值的整体流程,具体如图4所示。

图4 LevelDB写数据流程

具体代码请自行阅读,本文不贴过多的代码。这里需要重点说明的是DBImpl::Write函数,如图5是该函数的代码片段,从这段代码中我们可以很清楚的看到数据被分别写入日志和内存2个地方。其它代码都比较简单,大家请自行对照流程图阅读。

图5 DBImpl::Write代码片段

读流程简析

读流程要比写流程简单一些,核心代码逻辑如图6所示。首先,生成内部查询所用的Key,该Key是由用户请求的UserKey拼接上Sequence生成的。其中Sequence可以用户提供或使用当前最新的Sequence,LevelDB可以保证仅查询在这个Sequence之前的写入。然后,用生成的Key,依次尝试从 Memtable,Immtable以及SST文件中读取,直到找到。

图6 LevelDB读流程

从SST文件中查找需要依次尝试在每一层中读取,得益于Manifest中记录的每个文件的key区间,我们可以很方便的知道某个key是否在文件中。Level0的文件由于直接由Immutable Dump 产生,不可避免的会相互重叠,所以需要对每个文件依次查找。对于其他层次,由于归并过程保证了其互相不重叠且有序,二分查找的方式提供了更好的查询效率。可以看出同一个Key出现在上层的操作会屏蔽下层的。也因此删除Key时只需要在Memtable压入一条标记为删除的条目即可。被其屏蔽的所有条目会在之后的归并过程中清除。好了,今天就先到这,后续我们在深入的介绍LevelDB的其它部分的,并且逐步深入,理解其内部的精髓。

おすすめ

転載: www.cnblogs.com/yiliao0755/p/11594677.html