2

私はmongoDBデータベースにシャーディングを実装しようとしています。シナリオは次のとおりです。

構成サーバーを実行しているサーバーが1つあります

node1とnode2というmongodインスタンスを実行している2台のサーバーがあります

1台のサーバーでmongosを実行しています

コマンドを使用して、サーバーnode1とnode2をmongosシェルのシャードサーバーとして追加しました

db.runCommand({addshard: "serverhostname [:port]"});

後でnode1にデータベースを作成し、Mongosからそのデータベースのシャーディングを有効にしました

これで2つのシャードサーバーができました。MongoDBのドキュメントに従って、mongosはノード1(データベースが実際に存在する場所)で作成されたコレクションとノード2にコレクションを配置する必要があります。

私はmongosから300のコレクションを作成しましたが、それでもすべてのコレクションは1つのサーバーにのみ送信されます。これは、上記のサポートの問題点です。

注:-コレクションレベルでシャーディングできないアプリケーション層をアップグレードする立場にないため、要件に応じていくつかのコレクションを動的に作成するスクリプトがあります。

コレクションがすべてのシャードサーバーに均等に分散されるように、データベースレベルでシャーディングする方法についての提案を提供してください。

私は次のような解決策を探しています

300のコレクションを自動的に作成する場合、mongosは2つのシャードサーバーのそれぞれに約150または100のコレクションを作成する必要があります。

ステップインしてこの問題の修正を手伝ってくれてありがとう。

4

1 に答える 1

2

コレクションでシャーディングを有効にしてからデータを追加するまで、コレクションはシャード全体に自動的に分散されません。これらのシャーディングされたコレクションには、両方のシャードに関するデータが含まれます(チャンクに分割され、自動的にバランスが取られます)。

コレクションに対して実際にコマンドを実行し、チャンクの分割と移行を開始するのに十分なデータがコレクションに含まれるまで、コレクションはすべて元の場所にとどまります。

これは、各データベースに変更されないプライマリシャードがあるためです。ここでデータベースが最初に作成され、シャーディングされていないすべてのデータが存在します。別のデータベースを追加する場合、mongosは2番目のシャードにデータベースを作成し、作成されたデータベースごとに代替(または2つ以上の場合はラウンドロビン)する必要があります。いずれの場合も、コレクションをシャーディングするまで、コレクションはそのデータベースのプライマリシャードにのみ残ります。

于 2012-08-30T17:46:12.827 に答える