B +木とLSMツリーのデータ記憶および検索

アプリケーション開発者は、なぜそれの内部データを格納および取得するために注意を払いますか?まず第一に、あなたはストレージエンジンの独自のセットを達成するためにゼロからスタートしにくくなり、多くの場合、あなたは多くの既存のストレージエンジンから自分自身の使用のためのストレージエンジンを選択する必要があります。したがって、順序とするときに調整する特定のワークロードのためのデータベースでは、ストレージエンジンのメカニズムの一般的な理解を持っていることが最善です。

今日はHBaseのでMySQLとNoSQLのストレージエンジンの下に、リレーショナルデータベースの基礎となるストレージ・メカニズムを理解することから始めましょう。データベースのパフォーマンス、彼らの重要なデータの組織のために。我々はすべて知っているように、データベース内のデータのほとんどは、ディスク上に格納されており、ディスクアクセスの相対的メモリアクセスが非常に時間のかかる操作は、次の比較です。そのため、検索速度のデータベースのデータを改善するための重要なポイントの一つは、ディスクアクセス数を最小にすることです。


ディスクとメモリアクセス速度の比較

データベースのデータへのアクセスを高速化するためには、データを見つけるのを助けるために特別なデータ構造を使用する従来のリレーショナルデータベースのほとんどは、このデータ構造は、インデックス(指数)と呼ばれます。従来のリレーショナル・データベースの場合、考慮に入れてレンジでは、多くの場合、データのバッチを見つける必要があるので、インデックスは一般的にハッシュアルゴリズムを使用し、使用して木(ツリー)構造されていません。しかし、木の多くの種は、すべてのデータベースのインデックスには必ずしも適しません。

二分探索木と平衡二分木

最も一般的なツリーは、バイナリ順序木である二分探索木(バイナリ検索ツリー)、次のとおりです。すべてのノードの左部分木の値は、ルートノードの値未満であることを保証するために、しばらくのすべてのノードの右部分木値は、ルートノードの値よりも大きいです。シンプル、かつバランスのとれた状態のツリー探索効率はO(Nログ)を達成することができるという利点、欠点は、極端な検索効率に非平衡な状況O(N)に分解されることで、インデックスの効率を確保することが困難です。


二分探索木の探索効率

バイナリの検索ツリーの欠点は、あなたがこの問題を解決するためにバランスの取れたバイナリツリー(平衡2分木)を使用することができるかどうかを考えるのが自然です。しかし、バランスの取れたバイナリツリーはまだ比較的大きな問題であった:木のその木の高さは、インデックスのためにN - ログクエリの下、より多くの訪問を見つけるためのもの、ツリーの高さが費やされることが高効率化。

また、データをメインメモリは、一般的に、ページのディスク装置であるから読み出され、ディスクにアクセスするたびに、(例えば4キロバイトのデータサイズなど)を複数のセクタのデータを読み出しシングルバイナリツリーノード(バイトレベル)の値よりもはるかに大きい、このまた、バイナリツリーの相対指数の低い効率のために責任があります。このため、人々はB +木(B + -tree)はより多くの注目を受ける一方で、ツリーの各ノードのアクセスを増やすことで、効率を向上させるために考えます。

B +ツリー

従来のリレーショナル・データベースでは、B +ツリー(B + -tree)およびその誘導体は、ツリーインデックスツリー以上使用されています。


B +ツリー

B +ツリーの主な特徴は次の通りです。
唯一の各ツリーノードの鍵を保管し、値が格納され、リーフノードの格納された値はありません。これは、ツリーノードの度合いが比較的大きいことができ、およびクエリのパフォーマンスを向上させることができます木の比較的低い高さでしょう。
葉は、値を格納し、順序の並べ替えの値に応じて、かつ効率的にクエリ間隔データを行うために隣接ノードへのポインタを有するノードとルートノードから同じ距離とすべてのリーフノード、非常に類似した任意のクエリの効率。
異なるバイナリツリー、B +ツリーデータ更新操作は、ルートから開始するが、リーフノードから開始して、ツリーを更新プロセスの比較的小さな自己均衡コストで実現することができるされていません。

これらの利点のおかげでB +ツリーは、従来のリレーショナルデータベースのペットになります。もちろん、それは完璧ではない、その主な欠点は、データが挿入されると、リーフノードがゆっくり分割します発生し続けるということである - 実際にディスク・ブロック上の論理的に異なる物理的な場所に格納され、元の連続データにつながる可能性があり、範囲クエリを実行するときので、悪影響パフォーマンスに影響を与え、高いディスクIOにつながります。

ログ構造ツリーをマージ

我々はすべて知っているように、ディスク上の伝統的な機械式ハードディスク(HardDiskDrive、HDD)またはソリッド・ステート・ドライブ(ソリッドステートドライブ、SSD)の両方、シーケンシャルリードとライトデータがランダム読み取りおよび書き込みを行うよりもはるかに高くなっている一方で、データベース内のデータのほとんどは、ディスク上に格納されています。


シーケンシャルとランダムアクセスディスクのスループット比較

しかし、ディスクの上記基本特性とは逆であるB +ツリーインデックス構造に基づい - ランダム・アクセス・ディスク、それはそれ以上かかるだろう、そして、1992年に、ログ構造(ログ構造)インデックス構造の新規な方法と呼ばれ、それは、輸送されるべきです生徒。ログ方式の構造の主なアイデアは、大きなログ、それによってインデックスの性能を向上させる、シーケンシャルディスク操作を達成するために、ログの最後に新しいデータとインデックス構造を追加するたびに、ディスクです。しかし、ログ構造方法も重大な欠点を持つことができ、ランダム読み出しデータ効率が低いです。

1996年には、Thelog構造のマージツリー(LSM-木)と題する論文は創造(ログ構造マージツリー)ログ構造ツリーをマージの概念を提唱している、ログ工法の方法の利点を組み合わせました、およびデータファイルによって事前にソートされたログ構造化の方法は、ランダム読み取りのパフォーマンスの低下の問題を克服します。時間の新しいLSM-ツリーとの明確な利点が、名声への本当の主張で、その年の10年間のGoogleのBigtableのLSM-ツリーペーパーアートを使用して記事の後、2006年にあったが:構造化データのための分散ストレージシステムになっ考えに基づいて、直接自分の壊れたに(現在は両方とも同じトップレベルのApacheプロジェクト、カサンドラHBaseの2007年と2008年に)二つの大きなデータイラストのオープンソースコンポーネントが続く旋風をオフに設定分散データ処理分野で生まれました繭は、完全に大規模なデータベース・コンポーネントのパターンを変更するだけでなく、大幅LSM-ツリーの技術を促進します。

LSMツリーデータ構造の最大の特徴は、クエリを提供しながら、データを格納するために、同時に2つの分類木を用いています。他の一部(C1ツリー)のデータ構造が存在し、データ構造(C0ツリー)の一部は、要求を読み取り、メモリに直接データをソートするために新たな更新データを受信する担当(一般MemTable呼ばれる)キャッシュメモリに存在し、前記キャッシュメモリ内に存在しているハードドライブ(通常はsstableと呼ばれている)、上の赤い製ディスクC0ツリーに書き込まれ、それを注文し、変更することはできませんことを特徴としている、読み出し動作を提供する責任があります。


部分LSM-ツリーのC0及びC1

LSM-ツリーデータ構造のもう一つの大きな特徴は、2つの分類ツリーの使用に加えている、それはまた、ログファイルを使用します(通常はコミットログと呼ばれる)は、データのセキュリティを復元するために行います。最終的にはときに、特定の条件この操作はWAL(ログ先行書き込み)が知られており、その後、memtableを書き込み、および - すべて新たに挿入された更新操作は、最初のコミットログに記録されて:3コラボレーティブなデータ構造のこの配列は、典型的ですmemtableとクエリのために同じ時間をsstable;データはmemtable sstableから殺到し、関連するログデータを破棄するように書かれているときmemtableが間違って行くとき、あなたは復元することができ、データはコミットログからsstableのmemtableます。

私たちは、LSM-木のいくつかの機能に基づいてそのアーキテクチャを鑑賞するHBaseのアーキテクチャを参照することができます。WALの原理に従って、HBaseのデータが最初にハント(コミットログに相当)、及び再度書き込まMemStore(当量memtableする)、最終的にディスクStoreFile(等価sstable)に書き込まれた赤色に書き込まれます。LSM-木によって生成されたデータファイルを達成するために、このようなHRegionServerのHBase。図以下のHBaseのLSM-ツリーアーキテクチャ図。


HBaseのLSM-ツリーアーキテクチャ図

この構造のLSM-木は非常に高速書き込みデータ(理論的にアクセス可能なディスクのシーケンシャル書き込み速度)を助長するが、読書に助長されていません - 理論的memtable、すべてのハードドライブsstable中から時間を読み取るために必要がある場合がありますので、クエリデータは、これは明らかに、パフォーマンスに大きな影響をもたらすことになります。この問題を解決するために、LSM-ツリーには、次の主要な対策をとっています。

  • 小型のハードディスクを定期的SSTable組み合わせ(または一般に圧縮マージ操作と呼ばれる)SSTableの数を減らすために、大sstableに。また、通常のデータ更新やデータのみがファイルの現在の末尾に削除操作を更新する元のデータファイルは更新されません操作を削除するには、合併の唯一のsstable時間が本当に更新する操作を繰り返したり重いされ、合併。
  • これにより、クエリデータの総時間を減少させる、sstableの存在下で決定されたデータを加速するために、sstable各ブルームフィルタ(ブルームフィルタ)を使用します。

概要

違いLSMツリーとB +木の救済策の残りの部分を見つけるの費用ながら、読み取り性能に主に位置し、性能のトレードオフを記述します。

B +ツリーストレージエンジン、単一のレコードは、読み取り、削除、変更操作を追加サポートする順次走査(木+のリーフノードとの間のBポインタ)をサポートするだけでなく、ストレージシステムに対応するリレーショナルデータベースです。しかし、大きくなるディスクの読み取り確率をB +ツリー構造、ノード分割、ランダム読み取りを維持して書き込むために、書き込み動作の増加、で、パフォーマンスが徐々に弱まります。LSMツリー(ログ構造MergeTree)B +ツリーストレージエンジンとストレージエンジンは、また、追加、削除、読み取り、改変、順次走査動作をサポートします。バルクストレージ技術によるランダム書き込みの問題は、ディスクを回避します。もちろん、すべての長所と短所、LSMツリーとB +ツリー比べ、書き込み性能が大幅に増加するためにいくつかのパフォーマンスの犠牲を読んLSMツリー。

「ビッグデータ技術が進歩」のマイクロチャネルパブリック番号、ビッグデータアーキテクチャに、よりタイムリーにアクセスし、アプリケーション関連の技術記事に注力して購読!

おすすめ

転載: www.cnblogs.com/xiaodf/p/11704328.html