前回の記事「アーキテクチャの特徴から機能上の欠陥まで、分析的分散データベースの再理解」では、さまざまな「分散データベース」の横断的な分析を完了しました。この記事では、分解の後半部分について説明します。 NoSQL と NewSQL の違いを組み合わせて、垂直的な観点から OLTP シナリオにおける「分散データベース」実装ソリューションの主要な技術的ポイントについて説明します。このような考え方は前回の記事の延長であり、分散データベースに関する特集記事の概要でもあります。重要なポイントについては、後ほど別の記事で詳しく説明します。 1. NewSQL と NoSQL NewSQL はこのトピックの焦点であり、前の記事で具体的に言及した「分散データベース」でもあります。 OLTP シナリオに適しており、高い同時実行性と低レイテンシという特徴を備えています。その特性は、Oracle/DB2 などの従来のデータベースに近いです。一般的な X86 サーバーを利用して水平方向のパフォーマンス拡張を実現し、大規模なトランザクションのパフォーマンス圧力に耐えることができます。 現在、最もよく知られている NewSQL には、Google の Spanner/F1、Alibaba の OceanBase、CockroachDB、TiDB などがあります。後者の 2 つは成長中のオープンソース プロジェクトであり、2.0 バージョンは 2018 年にリリースされました。 NewSQL と NoSQL は深いつながりがあるため、以下の NewSQL の紹介では、対応する NoSQL 実装テクノロジのいくつかについても説明します。 1. ストレージエンジン B+ ツリー B+ ツリーは、リレーショナル データベースでよく使用されるインデックス ストレージ モデルです。効率的な範囲スキャンをサポートできます。リーフ ノードは主キーによって関連付けられ、リンクされ、順序付けられるため、スキャン中に時間のかかるツリー トラバーサル操作が回避されます。 B+ ツリーの制限は、大規模なランダム書き込みシナリオには適しておらず、「書き込み増幅」と「ストレージの断片化」を引き起こすことです。 B+ツリーの動作を説明するために、Jiang Chengyao教授の著書[1]からの次の例が使用されています。 高さ 2 の B+ ツリーが 5 つのページ テーブルに格納され、各ページには 4 つのレコードを格納でき、ファンアウトは 5 です。次の図は、リーフ ノード内のデータへのポインターとリーフ ノード間のシーケンス ポインターを省略した B+ ツリーの構造を示しています。 B+ ツリーは、内部ノード (InterNode) とリーフ ノード (LeafNode) の 2 種類のノードで構成されます。後者はデータへのポインターを保持しますが、前者にはインデックス情報のみが含まれます。 インデックス値が 70 のレコードを挿入する場合、対応するページ テーブルがいっぱいであるため、B+ ツリーを再配置し、その親ノードが配置されているページ テーブルのレコードを変更し、隣接するページ テーブルのレコードを調整する必要があります。再配布後の効果は以下のとおりです。 変更プロセスには 2 つの問題があります。
この例では、論理的には 1 つの書き込みレコードのみが必要です (黄色でマークされています) が、実際には 3 つのページ テーブル内の 7 つのインデックス レコードが変更されます。追加の 6 つのレコード (緑色でマーク) は、B+ ツリー構造によって生成された書き込み増幅を維持するためのものです。 注: 書き込み増幅: 書き込み増幅とは、アプリケーションが書き込んだデータ量と比較したストレージに書き込まれたデータ量、つまり、ディスクに書き込まれた実際のデータサイズと、アプリケーションが書き込むために必要なデータサイズの比率です。
新しく追加されたリーフ ノードは、元のリーフ ノードで構成される順序付きリンク リストに追加され、全体が論理的に連続します。しかし、ディスク ストレージでは、新しく追加されたページ テーブルによって要求されるストレージ領域は、元のページ テーブルに隣接しない可能性があります。このように、新しく追加されたリーフ ノードを含む後続のクエリでは、複数の連続した読み取りが発生し、ディスクのアドレス指定時間が長くなります。さらに、B+ツリー上で大量のランダム書き込みを実行すると、ストレージの断片化が発生します。 実際に B+Tree を使用するデータベース製品 (MySQL など) では、通常、ターゲットを絞った最適化のためにフィル ファクターが提供されます。フィルファクタの設定が小さすぎると、ページテーブルの数が拡大し、ディスクのスキャン範囲が拡大してクエリのパフォーマンスが低下します。設定値が大きすぎると、データの挿入時に書き込み拡張が発生し、大量のページングが発生し、挿入パフォーマンスが低下します。同時に、不連続なデータ保存によりクエリのパフォーマンスも低下します。 LSMツリー LSM-Tree(Log Structured-Merge Tree)はPatrick O'Neilによって初めて提案され、彼は論文[2]でLSM-TreeとB+ Treeの違いを体系的に説明しました。 Google は、次に示すように、このモデルを Bigtable に導入しました。 LSM-Tree の主なアイデアは、メモリを利用してランダム書き込みをシーケンシャル書き込みに変換し、書き込みパフォーマンスを向上させることです。同時に、書き込み操作のディスク占有量が大幅に削減されるため、読み取り操作によるディスク制御が向上し、読み取り操作のパフォーマンスにそれほど影響が及ばなくなります。 書き込み操作は次のように簡略化されます。
このモデルは、ランダム書き込みの IO 効率の問題を回避し、B ツリー インデックスの書き込み増幅の問題を効果的に軽減し、書き込み効率を大幅に向上させます。 LSM ツリー モデルは、HBase、Cassandra、LevelDB、RocksDB、その他の K/V ストレージを含む NoSQL で広く使用されています。 もちろん、LSM-Tree にも欠点はあります。
注: メジャー コンパクション操作の目的は、読み取り操作の時間の複雑さを軽減することです。システムに合計 N 個のデータを含む複数の SSTable ファイルが含まれており、SSTable には平均して m 個のデータが含まれているとします。 読み取り操作を実行する場合、単一の SSTable ファイルに対してバイナリ検索方式を使用する場合の時間計算量は O(log2m) であり、全体の時間計算量は O(N/m*log2m) です。 1つのSSTableに統合すると、時間計算量はO(log2N)に削減できる。
レベル別 LSM ツリー Leveled LSM Tree の変更点は、SSTable がさらに階層化され、書き込み増幅が削減され、読み取るファイルの範囲が狭まることです。これは最初にLevelDBで使用され、その後Cassandra 1.0でもこの戦略が導入されました[3]。 SSTable の階層設計戦略は次のとおりです。
レベル間のコンパクトな操作 複数の順序付けられた SSTable は、メジャー コンパクションなどの大量のファイルの書き換えを回避し、毎回コンテンツの一部のみを更新するため、書き込み増幅が軽減されます。 関連する SSTable をロックするためにメタデータを読み取ることは、すべての SSTable に対してバイナリ検索や Bloom Filter を使用するよりも明らかに効率的です。その結果、読書効率が大幅に向上します。ある評価方法[3]によれば、データの各行のサイズが基本的に同じ場合、読み取り操作の90%は1つのSSTableにのみアクセスします。 この戦略では、圧縮操作がより頻繁に行われ、I/O オーバーヘッドが増加します。書き込み集中型の操作の場合、最終結果で十分な効率改善が達成できるかどうかは不確実であり、アプリケーションでこれを考慮する必要があります。 新しいSQL戦略 NewSQL データベースのストレージ層では一般的に K/V ストレージが使用されるため、基本的に LSM ツリー モデルが採用されます。 CockroachDB と TiDB はどちらも KV レイヤーで RocksDB を使用します。 OceanBase は、Major Compaction の影響を回避するためにさまざまな方法を使用します。一般的に、読み取り操作のブロックを回避するために、アイドル レプリカ (フォロワー) を使用して圧縮操作を実行します。圧縮が完了すると、レプリカの役割が置き換えられます。 同時に、K/V ストレージ エンジンはまだ開発中です。フラクタル ツリーなどのその他の改善点については、スペースの制限によりここでは説明しません。 2. シャーディング シャーディングの概念は、RDBMS パーティショニングに似ています。これは、分散データベースや分散ストレージシステムの最も重要な機能であり、水平拡張の基盤であり、NoSQL システムでも広く使用されています。 シャーディングの目的は、複数のノード間でデータを可能な限り均等に分散し、複数のノードのデータ ストレージと処理機能を使用して、データベースの全体的なパフォーマンスを向上させることです。 レンジ&ハッシュ さまざまなシステムでシャーディング戦略はさまざまな細分化が行われますが、大まかに言えば、範囲とハッシュの 2 つの方法にまとめることができます。 範囲シャーディングは範囲クエリに有益ですが、ハッシュシャーディングを使用するとバランスの取れたデータ分散を実現しやすくなります。実際のアプリケーションでは、Range シャーディングがより頻繁に使用されているようですが、2 つのシャーディング方法を混在させるアプリケーションも多数あります。 HBase は、Rowkey に従ってデータを辞書順に並べる Range メソッドを使用します。 1 つのリージョンの上限を超えると、2 つの新しいリージョンに分割されます。 Range の利点は、データが近接しているため、データにアクセスするときに範囲検索のコストが低くなることです。デメリットも明らかで、ホットスポットの集中が発生しやすくなります。 たとえば、継続的に増加するシリアル番号がほとんどの場合同じ RegionServer に割り当てられ、同時アクセスによって RegionServer リソースが競合する可能性があるため、HBase でビジネス シリアル番号を RowKey として使用することは一般的に推奨されません。この問題を回避するには、RowKey をエンコードするか、シーケンス番号を逆にするか、ソルトを追加することをお勧めします。この方法は、基本的にアプリケーション層の設計戦略を使用して、範囲シャーディングをハッシュシャーディングに似た方法に変換します。 Spanner の基盤となるストレージは BigTable の設計アイデアの多くを採用していますが、シャーディングにいくつかの調整が加えられています。範囲シャーディングと操作ホットスポット間の不一致の問題を回避するために、ディレクトリの動的割り当てがタブレットに追加されました。これについては、後ほどトランザクション管理のセクションで詳しく説明します。 静的シャーディングと動的シャーディング 断片化生成戦略に応じて、断片化は静的断片化と動的断片化の 2 つのカテゴリに分類できます。 静的シャーディングでは、システム構築の開始時にシャードの数を決定するため、後で変更するには非常にコストがかかります。動的シャーディングとは、データの状況に基づいて指定されるシャーディング戦略のことであり、変更コストが低く、必要に応じて調整できます。 従来の DB + プロキシ ソリューションでは、水平シャーディングは一般的な静的シャーディングです。いくつかの有名なインターネット大手は、大規模なトランザクション システムで同様の設計を行っており、デフォルトでデータを 100、255、1024 などの固定数のシャードに分割しています。シャードの数は、システムの期待される目標の全体的なサービス機能、データの量、および単一ノードの容量に基づいて評価できます。もちろん、100 個のシャードと 1024 個のシャードのどちらが適切であるかは、ある程度推測の問題です。 NoSQL では、Redis クラスターも同じ静的シャーディング方式を使用し、デフォルトでは 16384 個のハッシュ スロット (シャーディングと同等) が使用されます。 静的シャーディングの欠点は、シャードの数が決まっており、単一ポイントの処理能力に基づいて容量の上限が形成されることです。柔軟性が低く、後でシャード数を調整すると、データの移行が難しくなり、実装が複雑になります。利点も明らかです。静的シャーディング戦略はほぼ固定されているため、パーティション キーやパーティション戦略などのメタデータ管理への依存度は非常に低くなります。ただし、これらのメタデータは分散データベース内で単一のポイントを形成することが多く、信頼性と可用性の向上の障害となります。 対照的に、動的シャーディングはより柔軟で、より幅広いアプリケーション シナリオに適しているため、NewSQL でも主に動的シャーディングを採用していますが、メタデータ管理の複雑さが増すというデメリットがあります。 シャーディングに関して言えば、NoSQL と NewSQL が直面する問題は非常に似ています。 3. コピー まず、汎用デバイス単体の信頼性が低いため、複数のコピーが必要になります。この記事では、レプリカの一貫性という 2 つの問題に焦点を当てます。もう 1 つは、レプリカの信頼性とレプリカの可用性の違いです。 データコピーの一貫性 複数のコピーを作成すると、必然的にコピーのデータ一貫性の問題が発生します。以前にも有名な CAP 理論があり、皆さんもよくご存知だと思いますが、ここでもう一度述べなければなりません。 CAP の一貫性とトランザクション管理の一貫性は同じではありません。私は、誤解している学生に多く会ってきましたが、彼らは CAP を基礎として、分散アーキテクチャではトランザクションの強い一貫性は実現できず、結果的な一貫性しか実現できないことを証明しようとしています。 トランザクションの一貫性とは、異なるデータ エンティティが同じトランザクションで一緒に変更され、すべてが成功するか、すべてが失敗するという事実を指します。 CAP における一貫性とは、原子粒度のデータ コピーによって一貫性が確保される方法を指し、複数のコピーは論理的に同じデータ エンティティです。 レプリカ同期は、大まかに次の 3 つのモードにまとめることができます。
レプリカの信頼性とレプリカの可用性 データのコピーはデータの永続性のみを保証するものであり、データが失われることはありません。また、レプリカの可用性、つまりデータが継続的に提供できるかどうかという問題にも直面しています。この問題を説明するために、HBASE-10070 を例に挙げます。 HBase は、分散ファイル システム HDFS を通じてデータの複数のコピーの保存を実装します。ただし、サービスを提供する場合、クライアントは RegionServer に接続して HDFS 上のデータにアクセスします。リージョンは固有の RegionServer によって管理されるため、RegionServer は依然として単一のポイントです。 RegionServer がダウンすると、HMaster がそれを検出するのに一定の時間がかかり、HMaster は新しい RegionServer をスケジュールして、対応するリージョンをロードします。全体のプロセスには数十秒かかる場合があります。大規模クラスターでは、単一点障害が頻繁に発生します。各ポイントごとに数十秒間のローカル サービスの中断が発生し、HBase の可用性が大幅に低下します。 この問題を解決するために、HBase ではスレーブ RegionServer ノードの概念が導入されています。マスターノードに障害が発生した場合、スレーブノードが引き続きサービスを提供します。ただし、RegionServer はステートレス サービスではありません。データはメモリに保存されるため、マスターとスレーブの RegionServer 間でデータ同期の問題が発生します。 HBase はデータの信頼性を実現しますが、データの可用性を完全に実現することはできません。 CockroachDB と TiDB のアイデアは、単一ノード上のメモリ データとディスク データの違いを完全に無視し、データの可用性を保証する Raft をサポートする分散 KV ストレージを実装することです。 4. トランザクション管理 分散トランザクション処理は、その複雑さのために NoSQL の開発で最初に放棄された機能です。しかし、大規模なインターネットアプリケーションの普及により、その実用的意義が徐々に顕著になり、再び NewSQL が避けることのできない課題となってきました。 NewSQL のトランザクション処理の改善により、過去 10 年間のデータベース テクノロジの進化は、ついにほぼ完全な上昇スパイラルを達成しました。 分散トランザクション管理の複雑さを考慮して、この記事では簡単な説明のみを行い、以降の記事で詳しく説明します。 NewSQL トランザクション管理は、制御方法に基づいて、ロックベースとロックフリーの 2 つのタイプに分けられます。ロックフリー モードでは、通常、タイムスタンプに基づいてトランザクションの競合を調整します。リソース占有方法の観点から、楽観的プロトコルと悲観的プロトコルに分けられます。両者の違いは、リソース競合に対する期待の相違にあります。悲観的なプロトコルは、競合が頻繁に発生すると考え、トランザクションがスムーズに完了するように、できるだけ早くリソースを押収します。楽観的なプロトコルは、紛争は時々起こるものと考え、許容できる最も遅い時期にのみリソースを奪取します。 以下では、最も古典的な「2 フェーズ コミット プロトコル」による実装方法と、2 つの具体的なアプリケーション プラクティスについて説明します。 2 フェーズ コミット プロトコル (2PC) 2 フェーズ コミット プロトコル (2PC) は、古典的な分散トランザクション処理モデルです。処理プロセスは 2 つの段階に分かれています。 リクエストフェーズ:
提出フェーズ:
このモデルの主な利点は、そのシンプルな原理と簡単な実装です。 欠点も明らかです。 1 つ目は同期ブロッキングです。トランザクション プロセス全体を通じてすべての参加者がロックされるため、同時実行パフォーマンスに必然的に大きな影響が生じます。 2番目は単一点問題です。コーディネーターは1点です。第2段階でダウンした場合、参加者は常時ロックされます。 スパナ Spannerの論文[4]によれば、分散トランザクション管理では依然として2PC方式が使用されているが、革新的な設計によりタブレットのデータ分散戦略が変更されている。タブレットは単一の連続したキー データ構造ではなくなり、スケジュール可能な最小のデータ編成単位として新しいディレクトリが追加されました。 動的割り当てにより、トランザクション内のノード間でデータが分散される可能性が低減されます。 このトランザクション処理の設計思想は、「分散トランザクションを処理する最善の方法は、分散トランザクション処理を実行することではなく、ローカルトランザクションにすること」であると理解しています。 OceanBase の初期バージョンでは、同様の概念で、トランザクション操作を集中的に処理するために独立したサーバー UpdateServer も使用されていました。 パーコレーター Percolator[5]はGoogleが開発した増分ウェブインデックスシステムです。 Google は設立前、MapReduce を使用して完全な Web インデックス作成を実行していました。このような処理に必要な時間は、既存の Web ページの数によって異なり、非常に時間がかかります。さらに、ある日に少数の Web ページしか変更されなかった場合でも、完全なインデックス処理を実行する必要があり、多くのリソースと時間が浪費されます。 Percolator の増分処理方式を使用した後、処理時間が大幅に短縮されました。 この論文では、「2 フェーズ コミット プロトコル」のバリエーションである分散トランザクション モデルについて説明します。第2フェーズの作業を極限まで簡素化し、処理効率を大幅に向上します。 具体的な実装としては、Percolator は BigTable をベースにした分散トランザクション管理を実装します。 MVCC とロックの 2 つのメカニズムを組み合わせることで、トランザクションで操作されるすべてのレコードは、既存のバージョンを更新することなく新しいバージョンになります。これの利点は、トランザクション全体にわたって読み取り操作がブロックされないことです。
ロックフリーのトランザクション制御、グローバル クロックの必要性など、分散トランザクション管理のその他の側面については、以降の記事で説明します。 II.結論 この記事とその前身の本来の目的は、典型的な技術的背景を持つ学生に「分散データベース」の異なる解釈を提供し、いくつかの重要な技術的ポイントを詳しく説明することで、さまざまな技術分野の学生が関連技術をある程度理解し、詳細な研究に関心を持つ学生のための基礎を築くことです。 分析が深まるにつれ、論文の枠組みが大きすぎて扱いにくく、そのためキーテクノロジーの解釈が深度によって異なると感じました。この記事で展開されていない部分については、次回以降の記事でできるだけ補足していきたいと思います。私のレベルが限られているため、記事には間違いや抜けがある可能性があります。誰でも議論し、修正することができます。 参考文献: [1] 江成瑶、MySQLテクノロジーインサイダー:InnoDBストレージエンジン、中国機械出版、2011年 [2] パトリック・オニール ログ構造マージツリー [3] Apache Cassandraのレベル圧縮 https://www.datastax.com/dev/blog/leveled-compaction-in-apache-cassandra [4] ジェームズ・C・コーベット、ジェフリー・ディーン、マイケル・エプスタイン他Spanner: Google のグローバル分散データベース [5] ダニエル・ペンとフランク・ダベック、分散トランザクションと通知を使用した大規模増分処理 |
<<: アーキテクチャ上の特徴から機能上の欠陥まで、分析分散データベースを新たな視点で見てみましょう
>>: 分散ストレージを構築する場合、分離型またはハイパーコンバージド型のどちらの展開モードを採用する必要がありますか?
テンセントといえば、誰もが知っているように、同社は中国最大のインターネット企業であり、時価総額は30...
画像出典: Tuchong Creativeホームページ構築が完了し、しばらくSEO対策が始まってい...
11月11日は一般に「独身の日」として知られていますが、昨年、アリババグループは「独身の日」を「ショ...
私は長年ウェブサイト最適化業界に携わってきました。企業で働き、クライアントの多くのプロジェクトを担当...
コンテンツ マーケティングについて言及されるとき、多くの人はその具体的な意味を理解していないかもしれ...
1. 2012年江蘇省インターネットウェブマスター会議が徐州で成功裏に開催されましたAdmin5 W...
リトアニアの超老舗 VPS である Time4vps は、missgroup に買収されてから初めて...
今日、ウェブマスターのウェブサイトで「Baidu Knowsの新しい外部リンクチャネル:プロモーショ...
適切なウェブサイトのレイアウトは、キーワードで良いランキングを獲得するための基礎となります。また、ユ...
今日の組織にとって、アプリケーションの信頼性とパフォーマンスが果たす重要な役割は、いくら強調してもし...
カマテラはどうですか? kamateraドイツはどうですか?カマテラは、ドイツ国内のクラウドサーバー...
いわゆるデッドリンクとは、簡単に言えば、Web サイトで開くことができないリンク、または間違ったリン...
この記事の内容:情報フロー広告とは?情報フロー広告入門表示フォームチャネル引用申請プロセス舞台裏の運...
ジュニパーネットワークス MX シリーズ ルーターは、セグメント ルーティング トラフィック エンジ...
マーケティング用語に惑わされないでください。クラウド インスタンス上で従来のインフラストラクチャを実...