Mongodumpがアプリのパフォーマンスに本当に悪い影響を与える


8

シャーディングのない非常に大きなmongoインスタンス(150 GB)があり、定期的なバックアップ(mongodump)はアプリのパフォーマンスに非常に大きな影響を与えます。さらに悪いことに、アプリはmongoを頻繁に使用するため、バックアップは10時間以上かかります。

シャーディングが必要であることはわかっています。ElasticSearchに移行する計画があるので、短期的な解決策を探しています。

mongodumpの1秒あたりのクエリ数を制限するなど、これを改善するために何かできることはありますか?

32コアの190 GB RAMサーバーにスタンドアロンのmongoがあり、それをnginx、rabbitmqなどと共有しています。今までで最もクリーンなセットアップではない、私は知っている:)

回答:


16

経由でダンプされたすべてのデータmongodumpは、MongoDBサーバーによってメモリに読み込まれる必要があります。また、mongodumpデータとインデックスの定義をバックアップすることにも注意してください。mongorestoreデータのロード後にセカンダリインデックスを再作成する必要があるため、他のアプローチと比較して、復元にかか​​る時間も大幅に長くなる可能性があります。

以下のようにMongoDBのドキュメントで述べたmongodump小規模な展開のバックアップと復元のために有用であるが、大規模なシステムのフルバックアップを取得するための理想的ではありません。

MongoDBインスタンスに接続すると、mongodumpはmongodのパフォーマンスに悪影響を与える可能性があります。データがシステムメモリよりも大きい場合、クエリによってワーキングセットがメモリから押し出され、ページ違反が発生します。

スタンドアロンサーバーでは、バックアップ中に展開を利用できるようにしたい場合、バックアップオプションが制限されます。

以下に、推奨されるアプローチを推奨順に並べます。

アプローチ#1:クラウドバックアップサービスを使用する

最も簡単な短期ソリューションとして、MongoDB Cloud Managerのような商用クラウドバックアップサービスの使用を検討します。MongoDB Cloud Managerは、スケジュールされたスナップショットと保持ポリシーによる継続的なバックアップを提供します(詳細については、バックアップの準備を参照してください)。クラウドサービスでは、追加のサーバーやインフラストラクチャを展開する必要もないため、将来的に展開する予定がある場合でも、これは有用な短期的なソリューションです。

一般的なアプローチは次のとおりです。

追加の利点として、Cloud Managerにはモニタリングエージェントも含まれており、デプロイからメトリック履歴をキャプチャして、アラートを構成できます。

アプローチ2:展開をレプリカセットに変換し、非表示のセカンダリからバックアップする

このアプローチでは、追加のインフラストラクチャをプロビジョニングする必要がありますが、バックアップの影響をプライマリサーバーからオフロードします。通常、レプリカセットは高可用性と自動フェイルオーバーのために少なくとも3つのメンバーでプロビジョニングされますが、唯一の目標がバックアップである場合は、理想的ではない2サーバー構成を使用できます。

一般的なアプローチは次のとおりです。

  • バックアップに使用される2番目のサーバーをプロビジョニングする
  • スタンドアロンサーバーをレプリカセットに変換します
  • 優先度0(プライマリにはならない)と投票数0の隠しセカンダリとしてバックアップサーバーを追加します。
  • 非表示のセカンダリでバックアップを作成するには、サポートされているバックアップ方法のいずれかを使用してください。バックアップ方法は、推奨の一般的な順序でリストされています。ファイルシステムのスナップショット(構成でサポートされている場合)またはファイルのコピー(停止を想定している場合mongod)の方が望ましいmongodumpです。
  • (理想的には)レプリカセット構成の高可用性とフェイルオーバーの利点が必要な場合は、別のデータベアリングセカンダリを追加します。

アプローチ#3:ファイルシステムのスナップショットを使用する(利用可能で適切な場合)

スナップショットをサポートするファイルシステムがある場合(およびすべてのデータとジャーナルファイルが単一のボリューム上にあるため、実行中の一貫したスナップショットを取得できる)を前提として、現在よりも影響の少ないバックアップ戦略はファイルシステムスナップショットmongodumpを使用しますmongod。ファイルシステムのスナップmongodショットの利点は、すべてのデータをによってメモリに読み込む必要がないことですが、スナップショットは依然として影響を与える可能性があります(特に、ビジーなシステムで初期スナップショットを作成する場合)。連続したスナップショットはより効率的で影響が少ないですが、スナップショットはサーバーに対してローカルであるため、完全なバックアップソリューションではありません(現時点ではスタンドアロンのみです)。

注意事項

  • アプローチ#1と#2はどちらも、レプリケーションを有効にしてバックアップを容易にすることを含みます。すべての書き込み操作はoplog(操作ログ)と呼ばれる特別な制限付きコレクションに記録されるため、レプリケーションにより、プライマリサーバーにローカルI / Oが追加されます

  • 将来シャーディングが必要になる可能性が高いとおっしゃいましたが、その前に、MongoDBのワークロードを同じサーバーを共有する他のプロセスから分離します。バックアップ戦略をより効率的なものに変更し、mongodumpリソースの競合を取り除き、ベースラインメトリックの履歴をキャプチャして確認することができる場合...シャーディングはまだ必要ない場合があります。


3

私はパーティーに遅れましたが、RAMが比較的少ないVM(4 GB RAM、50 GB HD、5 GBデータ)でつい最近同じ問題に遭遇しました。私たちの回避策は、mongodumpのオプション--forceTableScanを使用すること--readPreference secondaryです。セカンダリを使用する必要がある場合は、も追加します。これにより、ダンプが10倍から30倍にスピードアップしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.