MongoDB シャーディング: 例を含むステップバイステップのチュートリアル

⚡ スマートサマリー

MongoDB シャーディングは、大きなデータセットを複数のサーバーに分散された小さなサブセットに分割します。 MongoDB インスタンスを複数使用することで、単一サーバーのCPU負荷を軽減します。シャーディングされたクラスタは、シャード、構成サーバー、ルーターを組み合わせて、ストレージとクエリのスループットを水平方向に拡張します。

  • 🧩 コアコンセプト: シャーディングは、1つの論理コレクションを複数のシャードに分割しますが、クエリは依然としてデータを単一のコレクションとして扱います。
  • 🏗️ Cluster コンポーネント: シャーディングされたクラスターには、データ用のシャード、メタデータ用のコンフィグサーバー、およびクライアントコマンドをルーティングするためのルーターが必要です。
  • ⚙️ 実装フロー: 設定サーバーを起動し、mongosルーターを起動し、シャードを追加してから、データベースとコレクションでシャーディングを有効にします。
  • 🔑 シャードキー: シャードキーはドキュメントの分散方法を決定するため、高いカーディナリティと均一なアクセスパターンが不可欠です。
  • 📈 主な利点: シャーディングは、単一のサーバーをアップグレードするのではなく、ストレージとワークロードを分散させることで水平方向のスケーラビリティを実現します。

MongoDB シャーディング: 例を含むステップバイステップのチュートリアル

シャーディングとは何ですか MongoDB?

シャーディングは次の概念です。 MongoDB、大きなデータ セットを複数の小さなデータ セットに分割します。 MongoDB インスタンス。

場合によっては、その中のデータ MongoDB データ量が非常に大きいため、このような大規模なデータセットに対するクエリは、サーバーのCPU使用率を大幅に増加させる可能性があります。この状況に対処するため、 MongoDB シャーディングの概念があり、基本的にデータセットを複数に分割することです。 MongoDB インスタンス。

膨大な量になる可能性のあるこのコレクションは、実際には複数のコレクション(シャードと呼ばれる)に分割されています。論理的には、すべてのシャードは1つのコレクションとして機能します。

シャーディングの利点 MongoDB

シャーディングされたクラスターを実装する前に、チームがシャーディングを採用する理由を理解しておくと役立ちます。主な利点は次のとおりです。

  • 水平スケーラビリティ: データは、単一のマシンを際限なく大型化させるのではなく、多数の汎用サーバーに分散される。
  • より高いスループット: 読み取りおよび書き込み操作はシャード間で並列実行されるため、クラスターは1秒あたりにより多くのリクエストを処理できます。
  • より大きなストレージ容量: すべてのシャードを統合したディスクには、1台のサーバーが保存できるデータよりもはるかに大きなデータセットを保存できます。
  • 高可用性: 各シャードがレプリカセットとしてデプロイされている場合、単一ノードの障害によってクラスタが停止することはありません。
  • バランスの取れた負荷: その MongoDB バランサーは、特定のシャードがホットスポットになるのを防ぐために、データチャンクを自動的に再分配します。

これらの利点を総合すると、シャーディングはスケーリングの標準的なアプローチとなる。 MongoDB 単一サーバーの限界を超える。

シャーディングの実装方法

シャードはクラスターを使用して実装されます。クラスターとは、 MongoDB インスタンス。

シャードの構成要素は以下のとおりです。

  1. 破片 – これは基本的なことであり、これは単なるものではありません MongoDB データのサブセットを保持するインスタンス。運用環境では、すべてのシャードがレプリカ セットの一部である必要があります。
  2. 構成サーバー - これは MongoDB クラスターに関するメタデータ、つまりさまざまな情報を保持するインスタンス MongoDB シャードデータを保持するインスタンス。
  3. ルーター - これは MongoDB これは基本的に、クライアントから送信されたコマンドを適切なサーバーにリダイレクトする役割を担うインスタンスです。

ステップバイステップのシャーディング Cluster 例:

ステップ1) 構成サーバー用に別のデータベースを作成します。

mkdir /data/configdb

ステップ2) 始める MongoDB インスタンスを構成モードにします。たとえば、構成サーバーとなるサーバー D という名前のサーバーがあるとします。サーバーを構成サーバーとして構成するには、以下のコマンドを実行する必要があります。

mongod --configdb ServerD:27019

ステップ3) 設定サーバーを指定してmongosインスタンスを起動します。

mongos --configdb ServerD:27019

ステップ4) mongoシェルからmongosインスタンスに接続します。

mongo --host ServerD --port 27017

ステップ5) クラスターに追加する必要のあるサーバーAとサーバーBがある場合は、以下のコマンドを実行してください。

sh.addShard("ServerA:27017")
sh.addShard("ServerB:27017")

ステップ6) データベースのシャーディングを有効にします。Employeedbデータベースをシャーディングする必要がある場合は、以下のコマンドを実行してください。

sh.enableSharding("Employeedb")

ステップ7) コレクションのシャーディングを有効にします。例えば、Employee コレクションをシャーディングする必要がある場合は、以下のコマンドを実行します。

sh.shardCollection("Employeedb.Employee", { "Employeeid": 1, "EmployeeName": 1 })

シャードキーの選択方法 MongoDB

シャードキーは、インデックス付きフィールド、またはフィールドのセットであり、 MongoDB どのシャードに各ドキュメントを保存するかを決定するために使用されます。キーはデータ分散を左右するため、シャーディング環境において、適切なキーを選択することが最も重要な決定事項となります。不適切なキーを使用すると、データとトラフィックが1つのシャードに集中し、シャーディングのメリットが損なわれてしまいます。

強力なシャードキーは一般的に以下の特徴を備えています。

  • 高いカーディナリティ: そのフィールドには多くの可能な値があり、それによってデータを多くの細かい粒度の塊に分割できる。
  • 低頻度: 単一の値が支配的であってはならない。そうでない場合、その値を共有するドキュメントが1つのシャードに集中してしまう。
  • 非単調変化: タイムスタンプのように常に増加するキーは、新しい書き込みのたびに同じシャードに送信するため、ホットスポットが発生します。

MongoDB キーに基づいて、2つのシャーディング戦略をサポートしています。範囲シャーディングはデータを連続した範囲に分割し、範囲クエリに適しています。一方、ハッシュシャーディングはハッシュ関数を適用して、書き込みをシャード全体に均等に分散します。書き込みが多い場合はハッシュシャーディングから始め、範囲ベースの読み取りが主流になった場合は範囲​​シャーディングに切り替えるのが一般的です。どちらの戦略を選択する場合でも、シャードキーは一度データがロードされると簡単に変更できないため、コミットする前に、実際のクエリパターンに対してキーをテストしてください。

シャーディングとレプリケーションの比較 MongoDB

シャーディングとレプリケーションは相互補完的な機能ですが、それぞれ異なる機能です。以下の表は両者の違いを明確に示しており、それぞれを正しく適用するのに役立ちます。実際の運用環境では、両方の機能が併用されるのが一般的です。

側面 シャーディング Replication
目的 データを分割して水平方向に拡大縮小する データを保護し、いつでも利用できるようにしておく
各ノードのデータ データのサブセット(1つのシャード) データの完全なコピー
主な利点 ストレージ容量とスループットの向上 耐障害性と読み取りスケーリング
主要監視コンポーネント シャード、設定サーバー、mongosルーター 主要メンバーおよび二次メンバー

つまり、シャーディングはスケーラビリティのニーズに応え、レプリケーションは可用性のニーズに応え、堅牢なデプロイメントはその両方を組み合わせたものとなる。

よくあるご質問

はい。AIツールはクエリパターンとフィールドのカーディナリティを分析し、候補となるシャードキーを提案したり、単調増加フィールドについて警告したりできます。キーは後から変更するのが難しいため、適用する前に実際のワークロードに対して推奨事項を検証してください。

はい。AIベースの監視は tracデータ増加量、CPU負荷、クエリ遅延を分析し、単一サーバーが過負荷になるタイミングを予測します。これにより、シャーディングを行う適切なタイミングが明らかになりますが、エンジニアは実行前にキャパシティプランを確認する必要があります。

範囲指定シャーディングは、データを連続した値の範囲に分割するため、範囲クエリには適していますが、チャンクのサイズが不均一になるリスクがあります。ハッシュシャーディングは、キーをハッシュ化することで書き込みをシャード全体に均等に分散させ、書き込みの分散性を向上させますが、範囲スキャンの効率は低下します。

はい。データベースでシャーディングを有効にし、選択したシャードキーにインデックスが存在することを確認してから、名前空間で sh.shardCollection() を実行してください。 MongoDB 既存のドキュメントを、利用可能なシャード全体に自動的にチャンクに分割して分散し始めます。