MongoDBシャーディング: 概念、例、およびチュートリアル

MongoDBシャーディング: 概念、例、およびチュートリアル

  • オーケストレーション
6分で読めます 更新日 Nov 11, 2020

ポイント: MongoDBシャーディングは、大規模データセットを複数のサーバーに分散させ、パフォーマンスとスケーラビリティを向上させます。シャード、クエリルーター、構成サーバーから構成され、高スループットアプリケーションでの効率的なデータ管理を可能にします。

  • シャーディングは水平方向のスケーリングを可能にし、ハードウェアの負担を軽減し、クエリのパフォーマンスを向上させます。
  • 主要なコンポーネントには、シャード、mongos、および構成サーバーが含まれ、それぞれがデータ分配において特定の役割を担っています。

この包括的な記事では、MongoDBにおけるシャーディングを探ります。記事は2つのセクションに分かれています:

  1. 概念、コンポーネント、利点と欠点
  2. シャーディングの設定に関するステップバイステップのチュートリアル

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

シャーディングは、データを複数のホストに分散させるプロセスです。MongoDBでは、シャーディングは大規模なデータセットを複数のMongoDBインスタンスに分割することによって実現されます。

シャーディングの動作

高スループットのアプリケーションや非常に大きなデータベースを扱う場合、基盤となるハードウェアが主な制約となります。高いクエリレートはCPU、RAM、ディスクドライブのI/O容量にストレスをかけ、エンドユーザーの体験を悪化させる可能性があります。この問題を軽減するために、2つのスケーリング方法があります。

垂直スケーリング

垂直スケーリングは、単一のサーバーのハードウェア能力を増加させる従来の方法です。このプロセスには、CPU、RAM、およびストレージ容量のアップグレードが含まれます。ただし、単一のサーバーをアップグレードすることは、技術的な制約やコストの制約によってしばしば困難です。

水平スケーリング

この方法は、データセットを複数のサーバーに分割し、各サーバーインスタンスにデータベースの負荷を分散させます。負荷を分散させることで、必要なハードウェアリソースへのストレスが軽減され、障害が発生した場合の冗長性が提供されます。ただし、水平スケーリングは基盤となるアーキテクチャの複雑さを増加させます。MongoDBは、シャーディングを通じて水平スケーリングをサポートしており、これは以下で示すように大きな利点の1つです。

MongoDBシャーディングの基本

MongoDBのシャーディングは、少なくとも3つのサーバーから成るMongoDBインスタンスのクラスターを作成することによって機能します。つまり、シャーディングされたクラスターは、3つの主なコンポーネントで構成されています:

  • シャード
  • Mongos
  • configサーバー

シャード

シャードは、シャーディングされたデータのサブセットを保持する単一のMongoDBインスタンスです。シャードはレプリカセットとしてデプロイされて、可用性を高め、冗長性を提供します。複数のシャードの組み合わせが完全なデータセットを作成します。たとえば、2TBのデータセットは、元のデータセットから500GBのデータを含む4つのシャードに分割できます。

Mongos

Mongosはクエリルーターとして機能し、アプリケーションとシャーディングされたクラスターの間の安定したインターフェースを提供します。このMongoDBインスタンスは、クライアントリクエストを正しいシャードにルーティングする役割を担っています。

Configサーバー

configサーバーは、クラスター全体のメタデータと設定設定を保存します。

コンポーネントの図解

以下の図は、公式のMongoDBドキュメントから、各コンポーネント間の関係を説明しています:

  1. アプリケーションは、実行するクエリについてルーター(mongos)と通信します。
  2. mongosインスタンスは、configサーバーに相談して、必要なデータセットを含むシャードを確認し、そのシャードにクエリを送信します。
  3. 最後に、クエリの結果がアプリケーションに返されます。

configサーバーはレプリカセットとしても機能することを忘れないでください。

シャードキー

MongoDBコレクションをシャーディングする際、シャードキーが初期ステップの1つとして作成されます。「シャードキー」は、MongoDBコレクションのドキュメントをすべてのシャードに分散させるために使用されます。キーは、各ドキュメント内の1つのフィールドまたは複数のフィールドで構成されます。シャーディングされたキーは、不変であり、シャーディング後は変更できません。シャーディングされたコレクションは、単一のシャードキーのみを含みます。 populatedコレクションをシャーディングする場合、コレクションはシャードキーで始まるインデックスを持っている必要があります。適切なインデックスを持たない空のコレクションの場合、MongoDBは指定されたシャードキーのインデックスを作成します。シャードキーはクラスターのパフォーマンスに直接的な影響を与える可能性があります。そのため、クラスターに関連するアプリケーションのボトルネックを引き起こす可能性があります。この問題を軽減するために、コレクションをシャーディングする前に、シャードキーは以下に基づいて作成する必要があります:

  • データセットのスキーマ
  • データセットのクエリ方法

チャンク

チャンクは、共有データのサブセットです。MongoDBは、シャーディングされたデータをチャンクに分割し、それらを共有クラスター内のシャードに分配します。各チャンクは、シャードキーに基づいて包含下限と排他的上限の範囲を持ちます。各クラスターに特有のバランサーがチャンクの分配を処理します。バランサーはバックグラウンドジョブとして実行され、必要に応じてチャンクを分配して、すべてのシャード間でチャンクの均等なバランスを実現します。このプロセスは均等チャンク分配と呼ばれます。

シャーディングの利点と制限

概念が理解できたので、MongoDBのシャーディングの利点と制限を見てみましょう:

利点

  • 従来のレプリケーションシナリオでは、プライマリノードが書き込み操作の大部分を処理し、セカンダリサーバーは読み取り専用操作またはデータセットのバックアップの維持に制限されます。しかし、シャーディングはレプリカセットとともにシャードを利用するため、すべてのクエリがクラスター内のすべてのノードに分散されます。
  • 各シャードが完全なデータセットのサブセットであるため、追加のシャードを単に追加することで、複雑なハードウェアの再構成を行うことなくクラスターのストレージ容量を増加させることができます。
  • レプリケーションは、大規模なデータセットを処理する際に垂直スケーリングを必要とします。この要件は、ハードウェアの制約やコストの問題につながる可能性がありますが、MongoDBは水平スケーリングを利用するため、ワークロードが分散されます。必要に応じて、追加のサーバーをクラスターに追加できます。
  • シャーディングでは、読み取りおよび書き込みのパフォーマンスは、クラスター内のサーバーノードの数に直接関連しています。このプロセスにより、追加のノードを単に追加することでクラスターのパフォーマンスを迅速に向上させる方法が提供されます。
  • シャーディングされたクラスターは、単一または複数のシャードが利用できなくなっても運用を続けることができます。それらのシャードのデータが利用できない場合でも、クライアントアプリケーションは、ダウンタイムなしでクラスター内の他のすべての利用可能なシャードにアクセスできます。運用環境では、すべての個別のシャードがレプリカセットとしてデプロイされ、クラスターの可用性がさらに向上します。

制限

  • シャーディングは、シャーディングされたクラスターを維持するために慎重な計画とメンテナンスを必要とします—複雑さが関与しているためです。
  • MongoDBコレクションをシャーディングすると、シャーディングされたコレクションをアンシャードにする方法はありません。
  • シャードキーは、コレクション内のすべてのドキュメントを識別するために使用されるため、基盤となるクラスターの全体的なパフォーマンスに直接的な影響を与えます。
  • MongoDBのシャーディングされた環境内には、いくつかの操作上の制約があります。たとえば、geoSearchコマンドは、シャーディングされた環境内ではサポートされていません。
  • シャードキーや複合シャードキーのプレフィックスが存在しない場合、Mongoはクラスター内のすべてのシャードをクエリするブロードキャスト操作を実行し、長時間実行されるクエリタスクを引き起こす可能性があります。

MongoDBシャーディングの設定方法

シャーディングの概念を理解したので、いくつかのチュートリアルを始めましょう。以下の手順では、3つのサーバーでシャーディングされたクラスターを設定する方法を示します。すべての3つのサーバーにUbuntu 20.04 LTSとMongoDB 4.4.1がインストールされています。サーバーを以下のように定義できます:

  • mongodb01 - 10.10.10.56 - Config Server
  • mongodb02 - 10.10.10.57 - クエリルーター(mongos)
  • mongodb03 - 10.10.10.58 - シャード

次に、以下のアクションをいくつか通じて、次のことを行う方法を説明します:

configサーバーの設定

データベースとログファイルのためのディレクトリ構造を作成します。

    mkdir -pv  mongodb/data/configdb/
mkdir -pv  mongodb/data/logs
touch mongodb/data/logs/configsvr.log
ls -alRv mongodb/
configサーバーの設定

configファイルを作成します。上記のコマンドを実行すると、これらのディレクトリに加えてconfigファイルが作成されます。次に、configファイルを開き、サーバーのポートとIPアドレスを割り当てます。また、クラスターの役割をconfigsvrとして設定することも忘れないでください。

    sudo nano /etc/mongodConfig.conf

ファイル - mongodConfig.conf

    storage:
  dbPath: /home/barry/mongodb/data/configdb
  journal:
  enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /home/barry/mongodb/data/logs/configsvr.log

net:
  port: 27019
  bindIp: 10.10.10.56

sharding:
  clusterRole: configsvr

replication:
  replSetName: ConfigReplSet

構成サーバーを開始します。次に、以下のコマンドで構成サーバーを開始できます。

    mongod --config /etc/mongodConfig.conf&
configサーバーの設定2

サーバーが実行中かどうかを確認するためにログを確認します。

    tail -100 mongodb/data/logs/configsvr.log
configサーバーの設定3

構成サーバーに接続します。

    mongo 10.10.10.56:27019
configサーバーの設定4

構成サーバーを初期化します。 initiate()関数を使用して、デフォルト構成で構成サーバーを初期化できます。その後、status() 関数でサーバーの状態を確認します。

    rs.initiate()
rs.status()
configサーバーの設定5

クエリルーターを設定する

ディレクトリ構造と空のログファイルを作成します。

    mkdir -pv  mongodb/data/logs
touch mongodb/data/logs/mongorouter.log
ls -alRv mongodb/
クエリルーターの設定

構成ファイルを作成します。 クエリルーターを作成するために、ログの場所、IP、およびサーバーインスタンスのポートを提供します。さらに、このクエリルーターが属する構成サーバーを定義する必要があります。

    sudo nano /etc/mongoRouter.conf

ファイル - mongoRouter.conf

    systemLog:
  destination: file
  logAppend: true
  path: /home/barry/mongodb/data/logs/queryrouter.log

net:
  port: 27017
  bindIp: 10.10.10.57

sharding:
  configDB: ConfigReplSet/10.10.10.56:27019

mongosコマンドでクエリルーターを起動します。

    mongos --config /etc/mongoRouter.conf&

クエリルーターインスタンスが到達可能かどうかを確認します。

    mongo 10.10.10.57:27017
クエリルーターの設定2

シャードの設定

ディレクトリ構造とログファイルを作成します。

    mkdir -pv  mongodb/data/sharddb/
mkdir -pv  mongodb/data/logs
touch mongodb/data/logs/shard.log
ls -alRv mongodb/
シャードの設定

configファイルを作成します。シャードのconfigファイルには、データベースストレージ、ログ、およびシャーディングクラスターの役割がshardsvrに設定されているパスが含まれています。さらに、サーバーインスタンスへのネットワーク設定も含まれています。最後に、データを複製できるようにreplSetNameを設定しています。

    sudo nano /etc/mongodShard.conf

ファイル - mongoShard.conf

    storage:
  dbPath: /home/barry/mongodb/data/sharddb
  journal:
    enabled: true

systemLog:
  destination: file
  logAppend: true
  path: /home/barry/mongodb/data/logs/shard.log

net:
  port: 27018
  bindIp: 10.10.10.58

sharding:
  clusterRole: shardsvr

replication:
  replSetName: ShardReplSet

シャードサーバーを起動します。

    mongod --config /etc/mongodShard.conf&
シャードの設定2

サーバーが稼働しているかどうかを確認するためにログを確認します。

    tail -100 mongodb/data/logs/shard.log
シャードの設定3

シャードサーバーにログインします。

    mongo 10.10.10.58:27018
シャードの設定4

シャードサーバーを初期化します。デフォルト設定を使用してレプリケーションが有効になっており、initiate()関数を使用しています。その後、status()関数で初期化の状態を確認します。

    rs.initiate()
rs.status()
シャードの設定5

クラスタにシャードを追加

クエリルーターに接続します。

    mongo 10.10.10.57:27017

シャードをクラスタに追加します。 addShard() コマンドを使用して、シャードインスタンスのIPアドレスとポートをreplSetNameに提供します。

    sh.addShard( "ShardReplSet/10.10.10.58:27018")
クラスタにシャードを追加する

シャーディングを有効にする

データベースを作成します。 クエリルーターを使用して「persons」という名前のデータベースが作成されます。このデータベースはシャーディング操作で使用されます。シャーディングを有効にするための必要な手順は以下の通りです:

    use persons
sh.enableSharding("persons")
クラスタにシャードを追加する2

シャーディングの状態を確認します。 status() コマンドを使用して、データベースにシャーディングが有効かどうかを確認します。以下に示すように、「persons」データベースでシャーディングが有効です。

    sh.status()
configサーバーの設定5
クラスタにシャードを追加する3

シャーディングデータセットを作成する

このセクションでは、MongoDBコレクションとperson_idというシャードキーとして使用するインデックスを作成します。コレクション内のデータはコレクションとシャードキーを使用してシャーディングされます。コレクションを作成します。

    db.createCollection("personscollection")
シャーディングデータセットの作成

インデックスを作成し、レコードを追加します。 personidを降順でフィールドとしてインデックスを作成します。

    db.personscollection.createIndex({personid: -1})

値10001のpersonidを追加します。

    db.personscollection.insertOne({personid: 10001})
シャーディングデータセットの作成2

「personscollection」のためのシャーディングを有効にする

最初のステップは、インデックスpersonidがハッシュ化されていることを確認することです。そうでない場合、エラーが発生し、シャーディングが失敗します。これを達成するために、MongoDB内でensureIndex()関数を使用します。

    db.personscollection.ensureIndex({personid : "hashed"})

インデックスが正しく使用されている場合、「personid」をシャードキーとしてシャーディングを有効にできます。

    sh.shardCollection("persons.personscollection", {personid : "hashed"})

操作が成功した場合、次の出力が表示されます。

シャーディングデータセットの作成4

シャーディングが意図した通りに機能しているか確認します。 getShardDistribution()コマンドを使用してシャーディング操作の状態を確認します。

    db.personscollection.getShardDistribution()
シャーディングデータセットの作成4

上記の出力は、personscollectionがシャードサーバー(10.10.10.58)のShardRepSetにシャーディングされていることを示しています。単一のチャンク内に単一のドキュメントが含まれています。利用可能なドキュメントは、コレクションに入力した単一のレコードです。

MongoDBシャーディングの要約

MongoDBシャーディングは、大規模データセットを効率的に管理する方法であり、サーバー間で作業負荷を分散させ、データベースの全体的なパフォーマンスに悪影響を与えることなく実現します。また、シャーディングは、将来の要件に合わせてクラスターを効率的にスケールする能力を提供し、基盤となるハードウェアインフラストラクチャの複雑な再構築を必要としません。

関連文献

これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。

オーケストレーションの関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。