web-dev-qa-db-ja.com

これはMongoDBの有効なバックアップ戦略ですか?

約10GBのMongoDBデータベースを備えた単一の専用サーバーがあります。毎日バックアップを行う必要がありますが、データベースでダウンタイムを発生させることはできません。単一のディスク(異なるポートで実行されているmongodの2つのインスタンス)でレプリカセットを使用し、セカンダリのものをオフラインにして、データファイルをS3(ジャーナリングがオンになっている)などのオフサイトストレージにバックアップすることは可能ですか?または、マスター/スレーブを使用する方がレプリカセットよりも優れていますか?

これは実行可能ですか?もしそうなら、どのような潜在的な問題が発生する可能性がありますか?そうでない場合、これをどのように概念化して機能させるのですか?

11
James Simpson

このシナリオでは、ReplicaSetが機能します。ただし、同じサーバーに2つのMongoDBインスタンスを配置するのが良いかどうかはわかりません。これは、サーバーのハードウェア/ソフトウェアと負荷によって異なります。

backup MongoDBノードがマスターにならないようにするには、その priorityパラメーター0に設定します。

rs.add({_id: 1, Host: "localhost:<port>", priority: 0})

[〜#〜] note [〜#〜]:ダウンタイムが発生しない場合は、ReplicaSetに少なくとも2つのプライマリMongoDBノードが必要です。-を参照してください。 記事

6

考慮すべき戦略の1つは、レプリカセットのバックアップノードで「非表示」オプションを使用することです。 MongoDBブログから:

非表示のサーバーはisMaster()の結果には表示されません。これは、ドライバーが自動的に読み取りをスレーブに配布する場合、それらが使用されないことも意味します。非表示のサーバーの優先度は0である必要があります(非表示のプライマリを使用することはできません)。非表示のメンバーを追加するには、次のコマンドを実行します。

rs.add({"_ id":num、 "Host":ホスト名、 "priority":0、 "hidden":true})

2
Travis Dunn

レプリカセットが一般的に好まれますが、この場合も、自動回復および自動再同期機能のために単純に優先されます。あなたが説明しているバックアップ方法は完全に合理的に聞こえ、以前は他のデータベースでも使用されていました。

私が見る唯一の潜在的な問題は、特定の状況下でセカンダリがプライマリに昇格する可能性があり、a)新しいセカンダリからバックアップを取得する必要があるか、b)バックアップスクリプトをそのインスタンスに伝えるのに十分スマートにすることです。辞任するMongoDB。

良いニュースは、それはかなり些細なことです

  1. バックアップソースをクエリして、プライマリとセカンダリのインスタンスを見つけます(db.isMaster()
  2. rs.freeze()およびrs.stepDown()コマンドを使用してバックアップインスタンスをステップダウンするように説得しますまたはセカンダリに再接続します
1
Charles Hooper