データベースの必知シリーズ: データのパーティショニングとシャーディング

著者: 禅とコンピュータープログラミングの芸術

1. 背景の紹介

概要

インターネット、モバイル インターネット、クラウド コンピューティングなどの新興テクノロジーの急速な発展に伴い、大量のデータ処理が今日の企業が直面する主要な問題の 1 つとなっています。大量のデータをどのように保存、処理し、迅速にクエリするかは、大規模な Web サイトのアーキテクチャ設計の重要な部分です。データベースのパーティショニングとシャーディングは、ビッグ データ管理の問題を解決するための重要な技術的手段です。この記事では両方を詳しく説明し、実際のケースを共有します。

パーティショニングとシャーディングの概要

パーティション

パーティショニングとは、ビジネス ルールに従ってデータを異なるグループまたはテーブルに分割することを指します。各パーティションは独自のデータのみを保存および処理します。これにより、特に読み取りおよび書き込み時のデータベースのパフォーマンスが向上します。たとえば、注文テーブルで、履歴データを注文日に従って異なる月のサブテーブルに分割すると、クエリの効率が効果的に向上します。通常、テーブルには最大 1024 個のパーティションしか含めることができません。

断片化

シャーディングとは、分散データベースを水平方向に分割し、各シャードを異なるサーバーにデプロイすることです。これにより、システム容量が増加し、単一障害点を効果的に回避できます。シャーディング方式を採用すると、同一シャード内のレコードは同じシャードキーのシャードに割り当てられるため、サーバーリソースを有効に活用してハードウェアの性能を最大限に活用することができます。一般に、分散データベースは複数のシャードで構成されており、より高いスループットと可用性を提供するためにスケールアウトまたはスケールアップできます。

パーティショニングとシャーディングの長所と短所

パーティショニングとシャーディングの利点

  • データ冗長性: パーティショニングを通じて、データを複数の独立したサブセットに分割し、異なる物理デバイスに保存してデータ冗長性を実現できます。シャーディングを通じて、データを複数の物理ノードに分散して負荷を軽減できます。単一のノードが圧力に対処しながら、水平方向のスケーラビリティも提供します。
  • 負荷分散: アプリケーションに読み取りと書き込みの分離要件がある場合、パーティショニングを通じてデータのプライマリおよびセカンダリのレプリケーションを実現でき、シャーディングを通じて負荷を複数の物理ノードに均等に分散できるため、システム全体のスループットと処理能力が向上します。
  • メンテナンスが容易: データが変更された場合、対応するパーティションまたはシャードを変更するだけでよく、他のパーティションまたはシャードのデータは影響を受けず、追加の損失は発生しません。
  • 可用性の向上: パーティションに障害が発生しても、他のパーティションの通常の動作に影響を与えないため、システムの可用性が確保されます。

パーティショニングとシャーディングの欠点

  • データ移行の複雑さ: パーティショニングとシャーディングはデータベースのパフォーマンスを向上させるために導入された技術的手段であるため、大量のデータを含むデータベースのデータ移行は非常に複雑で時間がかかる場合があります。同時に、パーティショニングとシャーディングは、インデックスの最適化やデータベース設計関連の最適化手段を完全に置き換えることはできません。
  • 考慮すべきデータ分散ルール:データ分散ルールは範囲で分ける、特定のフィールドで分ける、特定のアルゴリズムルールで分けるなど比較的複雑な場合が多いため、適切なルールを選択する必要があります。ビジネス状況に基づいたデータ分散戦略。
  • パーティショニングとシャーディングによるパフォーマンスのオーバーヘッド: パーティションとシャードは分割して割り当てる必要があります。つまり、データの挿入、削除、更新などの操作にはデータの移行が含まれ、必然的にパフォーマンスのオーバーヘッドが生じます。さらに、取引のサポートには一定の困難が生じる可能性があります。

使用するシーン

データベースのパーティショニングとシャーディングには、主に 4 つの適用可能なシナリオがあります。

  • ビジネス ルールに従ってデータを複数のサブセットに分割する: このシナリオで最も広く使用されているシナリオは、MySQL のパーティション関数などのリレーショナル データベースです。パーティション列の値の範囲に従ってデータを複数のパーティションに分割し、次に各パーティション インデックスはパーティション内に確立され、範囲クエリおよび関連クエリの高いパフォーマンスを実現します。さらに、パーティションを使用して、人気のあるデータを 1 つのパーティションに保存し、人気のないデータを別のパーティションに保存するなど、データを階層的に保存することもできるため、ディスク IO の負荷が軽減されます。
  • データの水平セグメント化: このシナリオは、検索エンジン、分散ファイル システム、キャッシュ システムなどで一般的です。これらはすべて、システム全体のパフォーマンスを向上させるために、データをさまざまなマシンに分散できます。たとえば、Baidu の検索エンジンは、検索結果データをドメインに応じて複数のサブセットに分割し、異なるデータセンターに保存することで、ネットワークの遅延と応答時間を短縮し、ユーザー エクスペリエンスを向上させます。
  • データをさまざまなサーバーに分散する: たとえば、MongoDB はシャーディング機能を提供します。これにより、MongoDB クラスターをさまざまなサーバーに分散して水平拡張を実現できます。同時に、Apache Hadoop は分散ファイル システム HDFS もサポートしており、ファイル データを複数のサーバーに分散してフォールト トレランスとデータ ストレージの信頼性を実現できます。
  • 単一の物理ノード上で分散データベースをシミュレートする: パーティショニングとシャーディングはシステムのパフォーマンスを向上させますが、特に単一点障害に対処するために複数のコピーが使用されている場合、単一点障害を引き起こす可能性もあります。現時点では、マスター/スレーブ レプリケーション アーキテクチャに基づくデータベース システムを使用して、単一障害点の問題を軽減できます。

パーティショニングとシャーディングの基本原則

分割の原則

パーティションとは何ですか?

パーティショニングによりデータが異なるブロックまたはサブセットに分割され、クエリと操作が高速化され、制御が容易になり、高可用性とスケーラビリティが実現されます。

なぜパーティションを分割するのでしょうか?

1 つのテーブル内のデータ量が大きすぎると、データベースのクエリと書き込みのパフォーマンスが制限されます。この問題を解決するには、データを複数のブロックに分割し、各ブロックが独自の情報のみを保存および処理することで、現在アクセスする必要があるデータ セットに対してのみクエリおよび書き込み操作を実行できるようにします。さらに、パーティションを介してシステムのスケーラビリティを向上させることもでき、新しいパーティションを追加することでシステムの処理能力を向上させることができ、パーティションを削除することで動的なスケーラビリティを実現することもできます。

パーティショニングのメリット
  • クエリのパフォーマンスの向上: パーティショニングにより、データを複数の独立した小さなコレクションに分割できるため、テーブルのスキャン時間が短縮され、クエリが高速化されます。
  • データの冗長性を実現可能: パーティショニングによりデータ ストレージの冗長性を実現し、データを複数のディスクに保存して、単一ディスクの障害やパフォーマンスの低下を回避できます。
  • これにより、システムの可用性が向上します。パーティションに障害が発生しても、他のパーティションの通常の動作に影響を与えないため、データベースの高可用性が実現します。
    パーティショニングのデメリット
  • パーティション テーブルの作成に時間がかかる: パーティション テーブルを作成するには、最初にテーブルを再構築する必要があるため、時間がかかり、データベースの可用性に影響します。
  • クエリ分析には適さない: 単純なクエリであっても複雑なクエリであっても、各パーティション内のデータ量を正確に評価することは不可能であるため、リソース割り当てを合理的に配置することができません。同時に、データの量が多い場合、より多くのストレージスペースを占有します。

    シャーディングの原理

    シャーディングとは何ですか?
    シャーディングはデータを複数のノードに分散します。
    なぜシャーディングなのか?
    スタンドアロン データベースのパフォーマンスのボトルネックは CPU とメモリであり、データ量が増加するにつれて、CPU とメモリのパフォーマンスはますます低下します。データベースの処理パフォーマンスを向上させるには、データを複数のコンピュータに分散し、各コンピュータのハードウェア構成を強化する必要があります。これをシャーディングと呼びます。
    シャーディングの利点
  • システムパフォーマンスの向上: シャーディングによりデータを複数のコンピュータに分散できるため、各コンピュータのハードウェア構成が改善され、ハードウェア リソースを最大限に活用して処理パフォーマンスが向上します。
  • 便利な水平拡張: 新しいノードを追加する場合、既存のノードに簡単な構成を行うだけでよく、データベースのリアルタイムの水平拡張を実現するためにデータベース全体を再分割する必要はありません。
  • データ保護を実現できます。コンピュータに障害が発生しても、他のノードのサービスは影響を受けず、データベースの高可用性が実現されます。
  • より柔軟なデータ分散: シャーディングにより、データを動的にオフロードでき、負荷に応じてデータ分散を調整できるため、負荷が各ノードに均等に分散されます。
    シャーディングのデメリット
  • シャーディングではデータ分散ルールを考慮する必要があります: シャーディングではシャーディング キーの値を決定する必要があり、これにはビジネス ロジックとデータ分散ルールを考慮する必要があります。
  • 断片化により複雑さが増し、開発が困難になります: データの断片化により、データの挿入、更新、削除の操作にはデータの同期と一貫性が必要となり、開発の難易度が高まります。
  • アプリケーションによるシャーディングのサポートには特別な処理が必要です。アプリケーションはデータに正しくアクセスするためにシャーディングに適応する必要があります。

パーティショニングとシャーディングの概要

パーティショニングとシャーディングは、大量のデータの下でのクエリ、書き込み、メンテナンスなどの問題を効果的に解決できる 2 つのデータベース設計手法です。パーティショニングとシャーディングを採用すると、データベースのストレージ領域をさらに拡張でき、システムの信頼性とパフォーマンスが向上します。ただし、パーティションやシャードが多すぎると、さらに複雑になり、管理上の問題が発生するため、実際の使用では、ビジネス シナリオに合わせた合理的な設計が必要になります。

おすすめ

転載: blog.csdn.net/universsky2015/article/details/133594901