mongodbシャードチャンクの移行500 GBには13日かかります-これは遅いですか、それとも正常ですか?


9

私はmongodbシャードクラスターを持っていますが、シャードキーはハッシュされています。2つのシャードレプリカセットがあります。各レプリカセットには2つのマシンがあります。

別の2つのシャードレプリカセットを追加して実験を行ったところ、リバランスが開始されました。

ただし、しばらくすると、チャンクの移行がかなり遅くなることがわかりました。1.4GBのデータを移動するのに1時間かかります。

それは私を心配させます、それは私が13日間待って500GBのチャンク移行を完了する必要があることを意味します!

私はこのことについては初心者であり、それが遅い、速い、または通常であるかどうかについての神の感触はありません。しかし、それでも、それらの数は私を納得させません。

実験に関する追加メモ:-m3中型awsマシンを使用-他のプロセスは実行せず、チャンク移行のみ-デフォルト設定のmongodbシャーディングインストールで追加の設定なし-シャードキーはオブジェクトID(_id)でハッシュを使用-最大チャンクサイズ64MB

回答:


10

更新:2018年4月

質問の時点ではこの答えは正しかったが、その後は状況は変わっていない。バージョン3.4以降、並列処理が導入され、最初に参照したチケットはクローズされました。詳細については、この最近の回答で詳細の一部を説明します。残りの回答はそのままにしておきます。これは、一般的な問題/制約に関する優れたリファレンスであり、古いバージョンの誰にとっても有効であるためです。

元の回答

興味がある場合は、M202 Advancedコースのチャンク移行で何が起こるかを詳しく説明します。一般的に言えば、移行がアクティブなシステムで確実に機能するようにハウスキーピングが実行されるため、空のチャンクであっても移行はそれほど高速ではないと言えます(バランシングが発生している場合でもこれらは発生します)。

さらに、クラスター全体で一度に発生する移行は1つだけです-並列処理はありません。したがって、2つの「フル」ノードと2つの「空」ノードがあるという事実にもかかわらず、常に、最大で1つの移行が発生しています(チャンクが最も多いシャードと最も少ないシャードの間)。したがって、2つのシャードを追加しても、速度のバランスをとることはできず、移動する必要のあるチャンクの数が増えるだけです。

移行自体の場合、チャンクのサイズは約30MiBになる可能性があります(データの入力方法によって異なりますが、通常、これはデフォルトの最大チャンクサイズでの平均です)。db.collection.getShardDistribution()その情報の一部を実行できます。チャンクに関するさらに詳しい情報を取得する方法については、こちらの回答をご覧ください。

進行中の他のアクティビティがないため、移行が発生するためには、ターゲットシャード(新しく追加されたシャードの1つ)がソースシャード(元の2つのうちの1つ)から約30MiBのデータを読み取り、構成サーバーを更新する必要があります。完了したら、新しいチャンクの場所を反映します。30MiBのデータの移動は、負荷のない通常のシステムのボトルネックにはなりません。

遅い場合は、いくつかの理由が考えられますが、ビジーでないシステムで最も一般的な理由は次のとおりです。

  • ソースディスクI / O-データが読み込まれたときにアクティブメモリにない場合は、ディスクからページインする必要があります。
  • ネットワーク-レイテンシ、レート制限、パケット損失などがある場合、読み取りにはかなり時間がかかる場合があります
  • ターゲットディスクI / O-データとインデックスをディスクに書き込む必要があります。インデックスが多いと、これが悪化する可能性がありますが、通常、負荷の軽いシステムでは問題になりません
  • 中止の原因となる移行の問題と移行の失敗(構成サーバーの問題、プライマリでの削除の問題)
  • レプリケーションラグ-レプリカセットへの移行のw:2場合、書き込みの懸念があるかw:majority、デフォルトで使用され、それを満たすために最新のセカンダリが必要です。

システムがビジーであった場合、メモリの競合、ロックの競合も通常ここで疑われます。

移行にかかる時間、失敗した場合などの詳細については、次のエントリを参照してくださいconfig.changelog

// connect to mongos
use config
db.changelog.find()

あなたが見たように、そして私がトレーニング/教育をするときに一般的に人々に言うように、あなたが4つのシャードを必要とすることを知っているなら、通常、ランプアップよりも4から始める方が良いです。その場合、シャードの追加には長い時間がかかる可能性があり、最初はゲインではなくリソースのネガティブになることに注意する必要があります(詳細については、シャーディングの落とし穴シリーズのパートIIを参照してください)。

最後に、チャンク移行の並列処理を改善するために機能リクエストを追跡/賛成/コメントするには、SERVER-4355をチェックしてください。


おかげで、これはチャンク移行メカニズムをmongodbのドキュメントよりもはるかに多く説明しています。
rendybjunior 2014年

間違いなくあなたのコースに参加します。:)以前に述べた速度についてどう思いますか?正常ですか、遅いですか。私はこの質問が多くの側面に基づいて相対的であることを知っています。しかし、私はあなた自身の意見を求めています
rendybjunior

あなたの説明に基づいて少し遅いようですが、確かに中程度のインスタンスをベンチマークする必要があります。あなたの現在のレートは彼らができるすべてのものかもしれません、またはあなたは私が答えで述べた問題の1つを持っているかもしれません。試すことができる1つのコントロールは、手動でチャンクを移動することです。バランサーをオフにして、基本的に自分で行って、問題が発生していないかどうか、移動がソース/ターゲットシステムにどのような影響を与えるかを確認します。moveChunkの関連詳細は、次の場所にあります:docs.mongodb.org/manual/reference/method/sh.moveChunk
Adam C

チャンクの移行はmongoDBでは優先度が低く、ハイパフォーマンスシステムであってもビジー状態の場合は時間がかかる場合があることを追加します。
アントニオ2014年

@Antonis-優先順位の意味がわからない、チャンク移行はソースシャードからの読み取り(他の読み取りと同じ)とターゲットシャードへの書き込み(前述の書き込みに関する懸念事項)であり、これらの操作の優先順位付けはありません対他。これらはビジーなシステムでは遅くなりますが、固有の優先順位の違いによるものではありません。
Adam C
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.