図は、簡単にデータ構造とアルゴリズムシリーズ(NoSQLのストレージ-LSMツリーを)理解して - 本文

主な用途の画像が簡単に読んで理解し、把握し、共通のデータ構造とアルゴリズムを記述するために、「図は、それが簡単なデータ構造とアルゴリズムを理解します」。このシリーズは、のような様々なソート数十人など、さまざまなスタック、様々なキュー、各種リスト、ツリーの様々な、さまざまな図を、含まれています。

LSMツリーについて

LSMツリー、すなわち、ログ構造マージ木(ログ構造マージツリー)。実際には、それはそれは、より多くのデータ構造設計のものであり、特定のデータ構造に属していません。ほとんどのNoSQLデータベースは、単に別の具体的な実装を行うにはLSMの核となるアイデアに基づいています。私たちは、シリーズに含まれるように意図しなかったが、私の友人数回は、メッセージは私がLSMツリー、LSMについて、ツリーの発言を伝えてみましょう。

LSMツリーの背景誕生

BTREEストレージ構成として、従来のリレーショナル・データベースまたはそのいくつかの変異体を使用して、検索を効率的に行うことができます。ディスクに保存するときしかし、それはまた、それは論理的に非常に近いリンクされ、明白な欠陥を持っていますが、彼らはランダムなディスクの読み取りと書き込みの多くを引き起こす可能性がある、非常に遠く離れて、物理的に分離することができます。ランダム読み取りおよび遅くシーケンシャルリードとライトよりも多くのことを書き、IO性能を向上させるために、我々は、操作の順序になるので、LSMの木がありますランダム操作可能な機構を必要としています。LSMの木は、私たちは、読み取りパフォーマンスの一部を犠牲にするコストとして、大幅書き込みを高め、ディスクへの書き込みの順序を遂行することができます。

ディスクIOについて

アドレスを確認するために、ディスク上のデータを読み書きするために、ディスクに関連する一般的に3つの気筒数、ディスク番号とブロック番号で構成されています。すなわち、シリンダ番号、トラックに指定シリンダに応じて移動最初の移動アームであり、ディスクは、ディスクの数に応じて決定され、指定されたセグメントを読み取るための磁気ヘッドを移動させるトラックと書き込みに応じて、最終ブロック番号を開始することができます。

全体のプロセスは、時間(シーク時間)+待ち時間(待ち時間)+送信時間(送信時間)を見つけるためにかかる3つの主要部分の時間を持っています。それぞれ位置決めシリンダを消費し、トラックセグメントブロック番号がメモリに磁気ヘッド、時間のかかるデータを移動するためにかかる時間を指定しました。ディスク全体IO最も時間のかかる時間の場所を見つけるために、それがパフォーマンスを大幅に向上させる検索時間を短縮することができます。

LSMの木の原則

このような二つの記憶構造の最も簡単な使用において、説明の便宜上、紙などの2つの以上の記憶構造によってLSM木。C0ツリーと呼ばれる永久的なメモリ・ストレージ構造は、具体的には、そのような赤黒木などの任意の好都合な健康値ルックアップ・データ構造であっても、あるいはジャンプテーブルのようにマッピングすることができます。C1ツリー、Bツリーと同様、特定の構成と呼ばれるハード・ディスク・ストレージ構造内の他の居住者、。すべてのディスクブロックサイズのノードサイズ、C1が100%満杯であるノード。

挿入ステップ

一般的な考え方は次のとおりです。あなたは、新しいレコード、後で復元を使用するには、ログファイル操作ログの最初のインサートを挿入すると、ログはとても速く、追記形のインサートである、新しいレコードはC0でインデックスに挿入され、ここでは、メモリ内の完了し、ディスクIOを伴わない操作、C0サイズは定期的な間隔で一定の閾値に達し、記録C0 C1スクロールディスクに組み込まれ、ストレージ構造の複数の場合には、本体にC1の量を増加させる場合C2は、マージに、というように、合併Ckをアップしてきました。

ステップ合併

ブロックを空にし、充填ブロック:マージプロセスは、2個のブロックを使用します。

メモリ空ブロック内に配置されるC1は、結合リーフノードから読み取られません。小から大への充填ブロック、削除、C0、対応するノードに組み合わせた結果を保存ノードC0、マージソートブロックを空にし、検索します。追加の注意が元のノードを変更することがあるのではなく、ディスク上の新しい場所に追加しますいっぱいになったときの結果は、充填ブロックに記入していきマージソート、ステップ2の操作に進みます。パレス空ブロックは、非リーフから再読み込みを使用して終了するC1がマージ中にマージノード。合併が完了したら、C0とC1のすべてのリーフノードは、より多くの合併が完了した後に押圧されています。

最適化の施策について

本論文では、LSMの基本原理ではなく、実際には、多くのプロジェクトの最適化戦略がある、とLSM最適化された紙の木がたくさんあります。だけでなく、すぐにレコードを見つけるのに役立ついくつかの追加のインデックスがそうであるように、たとえば、迅速にブルームフィルタを使用すると、キーがあるかどうかを判断します。

挿入

LSMは、ツリーに挿入され、

AELRU

まず、追記ディスクログファイルの最初のエントリを「A」を挿入し、使用AVLツリーメモリC0ツリーに挿入し、次いでC0挿入され、

「E」を挿入し、また、第1の追加のログ書き込みメモリであります

「L」の続きを挿入、次の回転、

最後の回転は、以下の後に、「R」「U」を挿入します。

C1ツリーがまだので、空ブロックが空であるので、複合トリガーは、直接最下位ノードC0ツリーから順に見ていることを仮定。ブロック長を充填すると、ディスク4のブロックサイズを想定し、4です。

最小のノードを探し始めると、充填ブロックに入れ、

2番目のノードを探し続け、

だから、ブロックを埋める埋めます、

ディスクに書き込まれるようになった、C1の木、

インサートを続行

BFNT

、それぞれ、最初のログを書き込み、その後、メモリ内C0ツリーに挿入

この時点でブロックを空に左端のリーフノードC1をロードするために、組み合わされた場合、

次に、ブロックマージソートを空ノードツリーとC0は、充填ブロックへの最初の「A」であります

そして、 "B"、

最終結果は、マージソートであります

新しいディスクの場所に追加充填ブロックは、元のノードは、除去しました

再びマージソート、フィル充填ブロックを続行し、

充填ブロックはディスク上の新たな場所に追加するだけでなく、層のディスクブロック(または複数のディスクブロック)ライトのサイズのノードに、ランダムな書き込みを回避しようとしています。合併プロセスは、上位ノードの更新につながる可能性として他に、一時的にバックが適切なタイミングで書き込まれ、メモリに格納することができます。

検索操作

全体的なアイデアは、C1は、木を見つけるためにディスクを見つけることができない、そして木がC2で、上のように、第1のメモリツリーC0を行くことですして下さい。

あなたは、「B」、最初のFind C0ツリーを探しているなら、見つけることができませんでした。

そして、C1の木を探し、ルートから開始し、

「B」を見つけます。

削除

迅速主マーキングによって達成削除操作を実行するために、削除する記録マーク約メモリに、対応するレコードは、後に非同期実行マージを削除しました。

たとえば、削除する#手段をマークすることを想定し、「U」を削除し、「U」は、ツリーのノードがC0となり、

何の木レコードC0、C0はツリーノードで生成され、#とラベル付けされていない場合、レコードはそれらを見つけるために移動することなく、ディスクを削除されたときに、あなたはメモリにそれを見つけることができます。たとえば、「B」を削除し、その後、C0ツリーで直接動作してディスクを削除する必要はありません、「B」ノード、および標識された#を挿入します。

 
ます。http://www.qhmoney.cn/media/104227_all.htmlより転載

おすすめ

転載: www.cnblogs.com/xibuhaohao/p/11880344.html