目次
トグル序文
この記事 データ レプリケーションはデータベースをどのように最適化しますか? - システム設計09 データベース レプリケーションの重要性について説明します。データベース レプリケーション技術を通じてデータベースを最適化できます。データ パーティショニングは、データベースを最適化するためのもう 1 つの非常に重要な概念です。この記事では、データベース パーティショニングについて詳しく説明し、さまざまなシャーディング方法 (データベース シャーディング) についても説明します。データ パーティションやデータベース シャーディングを含むこの記事の中国語名は、現時点では Azure 公式ドキュメントの翻訳を指しますが、これらの用語を参照する場合は原文を使用することをお勧めします。
データパーティショニングとは何ですか?
データ パーティショニングは、データベース内のデータを、より小さく管理しやすいサブブロックに分割するプロセスです。これらのサブブロックはパーティションと呼ばれます。データのセグメント化は、時間、顧客 ID、製品カテゴリなどのさまざまな要因に基づいて行うことができます。
データを分割する必要があるのはなぜですか?
拡張しないシステムの場合、データ量は増加し続け、データベースの読み取りおよび書き込みトラフィックもますます大きくなり、従来のデータベースにスケーラビリティの圧力がかかります。そのため、データ セグメンテーションを使用して、次のことを行うことができます。複数のノードを使用でき、それぞれがプロファイル全体の一部を管理します。
データパーティショニングの利点
- 性能を上げる: データをより小さな部分に分割することで、データのクエリが容易になります。これは、大量のデータを処理するシステムに特に役立ちます。
- スケーラビリティの向上: データ量が増加しても、新しいデータを保存するためのパーティションを簡単に追加できるため、大きな変更を加えることなくデータベースを拡張し続けることができます。
- ユーザビリティの向上: パーティションに障害が発生した場合、そのパーティション内のデータのみが影響を受けます。他のパーティションは引き続き使用できるため、システム全体のダウンタイムの削減に役立ちます。
- 管理を簡素化: データのパーティショニングにより、データベース管理が簡素化されます。たとえば、各パーティションを個別にバックアップおよび復元でき、クエリをパーティションごとに最適化できます。
データパーティショニングのデメリット
- 複雑さを加える: データのパーティショニングにより、データベースの複雑さが増加します。セグメンテーション戦略を開発および維持する必要があり、セグメント化されたデータに対応するためにシステムにいくつかの変更を加える必要がある場合があります。
- コストを増やす: データのパーティショニングには追加のハードウェアとソフトウェアが必要になる場合があり、分割されたデータベースの管理コストが高くなる場合があります。
シャーディング
複数のノード間でトラフィックと負荷を分散するには、パーティショニングまたはシャーディングを通じてデータを分割する必要があります。大規模なデータ コレクションを小さなデータ ブロックに分割し、異なるノードに保存します。
ただし、分割するので、各パーティションにほぼ同じ量のデータが格納されるようにバランスをとる必要があります。パーティションのバランスが崩れており、ほとんどのデータベース クエリがいくつかのパーティションに分類される場合、過負荷になったパーティションは負荷に耐えられなくなり、システムのボトルネックが発生します。さらに、過剰な負荷がかかるこれらのパーティション ノードをホットスポットとも呼びます。
一般に、シャーディングには次の 2 つの方法を使用します: 垂直シャーディングと水平シャーディング
垂直シャーディング
垂直シャーディングは、異なるデータベースに異なるテーブルを配置することです。この方法は異なるサーバー上で実行できます。ここでは、ユーザーが原則をよりよく理解できるように、最初に他の公式文書からの図を提供します。
通常、取得速度を向上させるために垂直シャーディング (Vertical Sharding) が使用されます。たとえば、Blob で構成されるテーブル (Blob 関連のコンテンツについては後で詳しく紹介します)。この場合、大きなテキスト データまたは BLOB を含む列は、異なるテーブルに分割されます。
垂直シャーディングは手動パーティショニングに適しています。これは主に、このシャーディング方法が比較的複雑であり、データベース管理者がこれらのデータ相関を通じてデータを分割する方法を決定する必要があるためです。これに対して、次に紹介する水平シャーディング(水平シャーディング)は、動的な条件下でも自動化に適しています。
水平シャーディング
前者で紹介した垂直シャーディングに加えて、水平シャーディング(水平シャーディング)と呼ばれる別のシャーディング方法があります。データベース内の一部のテーブルが大きすぎて読み取り/書き込みパフォーマンスに影響を与える場合、水平シャーディングはこの問題を解決する優れたシャーディング方法です。
水平シャーディングまたはパーティショニングは、データを分割してテーブルを複数のテーブルに分割することです。これも簡単に説明すると、500 行のデータがある場合、それを直接 2 つのデータベースに分割し、それぞれのデータベースに独自の 200 行を持たせることができます。五十行。
また、読者が水平シャーディングの概念をよりよく理解できるように、次のような水平シャーディング方法があります。つまり、キーベースのシャーディングと範囲ベースのシャーディング、これらの中国語訳は私の参照に基づいています。 Tencent の技術文書は、通常は英語で表記します。
キーベースのシャーディング
キーベースのシャーディングは、データテーブルのキーフィールドに基づいてデータを複数のパーティションに分割する方法です。例: 顧客データは顧客 ID に基づいて複数のパーティションに分割され、各パーティションに特定の顧客のデータが含まれるようになります。
アドバンテージ
キーベースのシャーディング方法を使用する利点は、クエリが非常に効率的で実装が簡単で、特定の範囲のキーをどこで探せばよいか (どのノード、どのシャードか) を正確に知ることができることです。
欠点がある
キーの選択が正しくない場合、トラフィックの分散が不均一になるため、一部のノードはより多くのデータを保存する必要がある可能性があります。つまり、不均一なシャーディングが発生する可能性が高くなります。
範囲ベースのシャーディング
範囲ベースのシャーディングでは、データ テーブル内の特定の範囲フィールドに基づいてデータを複数のパーティションに分割します。たとえば、製品データを価格に基づいて複数のパーティションに分割し、各パーティションに特定の製品に関するデータを含めることができます。
アドバンテージ
範囲ベースのシャーディングを使用する利点は、シャーディングのバランスが良くなり、範囲のみに基づいて検索するデータベースを決定できることです。
欠点がある
通常、より狭い範囲のデータをクエリする場合、このデータ シャーディング方法は効率が低くなります。
ハッシュベースのシャーディング
ハッシュベースのシャーディングとは、特定のフィールドの値(ハッシュ関数)に基づいてデータテーブルをハッシュし、ハッシュ結果に基づいてデータを異なるパーティションに割り当てることです。
アドバンテージ
ハッシュ ベースのシャーディングの利点は、バランスが非常に高く、クエリ効率が比較的高いことです。
欠点がある
ホット スポットが存在する可能性もあります。パーティションが不均衡で、ほとんどのデータベース クエリがいくつかのパーティションに分類される場合、過負荷になったパーティションは負荷に耐えられなくなり、システムのボトルネックが発生します。さらに、過剰な負荷がかかるこれらのパーティション ノードをホットスポットとも呼びます。
リバランス分割
データベース クエリの負荷自体が不均衡であると、データベースのパフォーマンスが低下します。この時点で、不均衡の原因には次のようなものがあると考えられます。
- データは均等に分散されていません。
- 単一パーティションの負荷が高すぎます。
- クエリ トラフィックが増加すると、システム トラフィックを処理するノードを追加する必要があります。
分割のバランスを再調整する方法は次のとおりです。
固定パーティション数
この方法では、最初にデータベースをセットアップするときに、固定数のパーティションを作成します。通常、ノードの数よりも多くのパーティションが作成され、ノードに割り当てられます。したがって、新しいノードがシステムに参加すると、パーティションが均等に分割されるまで、既存のノードから一部のパーティションを取得する可能性があります。
もちろん、それぞれの方法には長所と短所があります。このアプローチの欠点は、クラスター内のデータの総量に応じて各パーティションのサイズが増加すると、すべてのパーティションには総データのごく一部しか含まれないため、サイズも大きくなるということです。さらに、パーティションが非常に小さい場合、各パーティションにある程度のコストがかかるため、パーティション化のコストが大きくなりすぎます。パーティションが非常に大きい場合、ノードの再バランスとノード障害からの回復のコストが高くなります。正しいパーティション数を選択することは非常に重要です。
動的パーティショニング
動的パーティショニング(動的パーティショニング)では、パーティションのサイズが設定値に達すると、元のパーティションが 2 つのパーティションに均等に分割されます。異なるパーティションにノードが割り当てられ、最終的には負荷が均等に分散されます。パーティションの数は、総データ量に応じて動的にバランスがとれます。これが動的パーティショニングの利点です。
ただし、動的パーティショニングには欠点があります。データベースの読み取りと書き込みが同時に行われている場合、動的にバランスを再調整することは困難です。この時点で動的バランシングが実行されると、競合や遅延が発生するため、読み取りおよび書き込み中の動的リバランスは非常に複雑になります。データの一貫性と可用性を確保するために複雑さが導入され、システムのパフォーマンスと信頼性に影響を与えます。 MongoDB は、この種の動的パーティショニングを使用するよく知られたデータベースの 1 つです。
一貫性、可用性、信頼性についてわからない場合は、この記事を参照してください。 ソフトウェア設計の非機能的特徴 – システム設計 03
リクエストルーティング
さまざまなデータ パーティションについて以前に紹介しましたが、データがデータベースに転送される前に、次の質問をする必要があります。クライアントがリクエストを行うとき、システムはどのノードに接続するかをどのようにして認識するのでしょうか?再バランス後、ノードへのパーティションの配分が変更されます。特定のデータベースを読み取りたい場合、そのデータベースを読み取るために接続する必要がある IP アドレスをどうやって知ることができるでしょうか?この問題はサービスディスカバリとも呼ばれます。この問題の解決策は次のとおりです。
- クライアントがネットワーク内の任意のノードをリクエストできるようにします。ノードに要求されたデータが含まれていない場合、要求は含まれているノードに転送されます。
- すべてのリクエストをルーティング層に送信するためのルーティング層を確立すると、ルーティング層はリクエストを満たすためにどのノードに接続するかを決定します。
- クライアントは、パーティションと、どのパーティションがどのノードに接続されているかに関する情報をすでに持っています。したがって、必要な情報が含まれるノードに直接接続できます。
動物園の飼育員
分散システム内の特定のクラスターの変更を追跡したい場合は、よく知られたツールの 1 つである ZooKeeper を使用して上記のことを実行できます。 ZooKeeper は、Apache が分散システム向けに提供する分散オープンソース調整サービスです。このツールはネットワーク内のすべてのマッピングを追跡することもでき、各ノードは ZooKeeper に接続されて情報を取得します。パーティションが変更されるか、ノードが追加または削除されると、ZooKeeper は更新され、ルーティング層に変更を通知します。 ZooKeeper は、Yelp、RackSpace、Yahoo!、Reddit、Facebook、Twitter などの企業で使用されています。
結論
データ パーティショニングは、データベース内のデータをより小さく管理しやすいサブセットに分割する手法で、データベースのパフォーマンス、スケーラビリティ、可用性、および管理性を向上させることができます。
データベース クエリの負荷がアンバランスな場合、データベースのパフォーマンスを向上させるためにパーティションを再バランスする必要があります。通常、分割のリバランスのプロセスには、アンバランスな分割の特定、リバランス計画の作成、およびリバランス計画の実行というステップが含まれます。
パーティショニングは今日のすべての分散システムの標準となっており、ほとんどのソフトウェア エンジニアが知っておく必要があります。また、システム内のデータ量は増加し続けるため、データを分割することは合理的であり、書き込みと読み取りを高速化し、システムの可用性、拡張性、パフォーマンスをさらに向上させることができます。
関連記事
データ レプリケーションはデータベースをどのように最適化しますか? - システム設計09
DNSとは何ですか?ドメインネームシステム入門 – システム設計 06
システム設計コンポーネントの構成要素の概要 – システム設計 05