web-dev-qa-db-ja.com

Mongodb増分バックアップ

もちろん、開始点として、MongoDBレプリカセットの増分バックアップをセットアップするタスクが与えられました。もちろん、ググってみましたが、MongoDBドキュメントで何も見つかりませんでしたが、スタックオーバーフローで question を見つけました。 Tayraはあまり活発ではなかったので、自分のソリューションを開発することを奨励しました。

私はoplogについて読んで、ログを再生するための何かを開発するのは非常に簡単であることに気付きましたが、mongorestoreが私のためにそれを行う必要がなかったことがわかりました。

今私はbashスクリプトを使用した実用的なソリューションを持っていますが、それは非常に簡単でした。それが私のロジックに欠陥があるのか​​、あるいは将来私に噛み付くものがあるのか​​どうかをここで尋ねている理由です。

以下に私がそれを実装した方法:

完全バックアップ手順

  1. セカンダリメンバーへの書き込みのロックdb.fsyncLock()
  2. スナップショットを撮ります
  3. Oplogから最後の位置を記録

    _db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
    _
  4. 書き込みのロック解除db.fsyncUnlock()

増分バックアップ手順

  1. セカンダリメンバーへの書き込みのロック
  2. 完全(または最新の増分)バックアップ時に記録されたoplog位置からoplogをダンプします。

    _mongodump --Host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 
        --query '{ "ts" : { $gt :  Timestamp(1437725201, 50) } }'
    _
  3. 最新のoplog位置を記録する(完全バックアップの場合と同じ方法)

  4. 書き込みのロックを解除

完全バックアップの復元手順

  1. mongodのすべてのインスタンスを停止
  2. スナップショットをプライマリとなるボックスのデータディレクトリにコピーしますが、すべての_local*_および_mongod.lock_を必ず除外してください。この復元手法は次のように呼ばれます ミラーを解除して再構成
  3. プライマリを開始
  4. レプリカセットを再構成する
  5. データなしでセカンダリを開始し、初期同期を実行させます。または、新鮮なlocalデータベースを使用して、新しいプライマリからデータをコピーします

増分バックアップを復元する

増分バックアップを作成すると、次のように保存されます。

_/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
_

私たちは_oplog.rs.bson_に深く関わっていますが、名前を変更する必要があるため、以下に手順を示します。

  1. ディレクトリをバックアップに変更します:_cd /mnt/mongo-test_backup/1/local_
  2. jsonファイルを削除する_rm *.json_
  3. bsonファイルの名前を変更_mv oplog.rs.bson oplog.bson_
  4. それを復元する:

    _mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
    _

すべてスクリプト化してありますが、後でGitHubでコミットする可能性があります。

問題は、ロジックに欠陥があるかどうかです。手順が非常に単純であり、どこにも文書化されていないので、私は少し不審です。

26
Tiago

あなたの質問に答えるために。番号!ロジックに失敗はなく、問題なく動作するはずです。ただし、LVMスナップショットを使用できる場合は、バックアップを行うためのより良い方法です。

3
JJussi