52

MongoDB oplog を変更して再生することは可能ですか?

バグにより、想定よりも多くのドキュメントに更新が適用され、一部のデータが上書きされました。データはバックアップから復元され、再統合されたので、実際には何も失われませんでしたが、oplog を変更して問題のある更新を削除または変更し、それを再生する方法があるかどうか疑問に思っていました。

私は MongoDB の内部構造について深い知識を持っていないので、「仕組みがわからない、こんな感じだ」というような有益な回答も承認の対象と見なされます。

4

1 に答える 1

108

アプリケーションまたは人為的エラーデータの破損における大きな問題の1つは、プライマリへの問題のある書き込みがすぐにセカンダリに複製されることです。

これは、ユーザーが「slaveDelay」を利用する理由の1つです。これは、固定時間遅延でセカンダリノードの1つを実行するオプションです(もちろん、これは、より短い期間中にエラーまたはバグを発見した場合にのみ役立ちます)。そのセカンダリの遅延)。

このような設定がない場合は、バックアップを使用して、バグ前の状態に復元する必要のあるレコードの状態を再作成する必要があります。

データの個別のスタンドアロンコピーですべての操作を実行します。すべてが適切に再作成されたことを確認した後でのみ、修正したデータを本番システムに移動する必要があります。

これを実行できるようにするために必要なのは、バックアップの最新のコピー(たとえば、バックアップがX時間前のものである)であり、クラスター上のoplogはX時間以上のデータを保持する必要があります。(a)レプリカセットのすべてのメンバーのoplogの内容が同じであり、(b)ノードメンバーごとにoplogサイズが異なる可能性があるため、どのノードのoplogを指定しませんでした。この場合、確認する必要があります。「最大の」もの。

つまり、最新のバックアップが52時間前のものであるとしましょう。しかし、幸いなことに、75時間分のデータを保持するoplogがあります(イェーイ)。

すべてのノード(プライマリおよびセカンダリ)に「不良」データがあることにすでに気付いているので、この最新のバックアップを新しいモンゴッドに復元します。ここで、これらのレコードを問題のある更新の直前の状態に復元します。次に、それらを現在のプライマリに移動して、そこからすべてのセカンダリに複製することができます。

バックアップを復元するときに、次のコマンドを使用してoplogコレクションのmongodumpを作成します。

mongodump -d local -c oplog.rs -o oplogD

oplogを独自のディレクトリに移動し、名前をoplog.bsonに変更します。

mkdir oplogR
mv oplogD/local/oplog.rs.bson oplogR/oplog.bson

次に、「問題のある」操作を見つける必要があります。bsondumpoplogR / oplog.bsonファイルのコマンドを使用して、人間が読める形式にoplogをダンプできます(次に、grepまたはwhat-notを使用して「不良」アップデートを見つけます)。use localまたは、シェルのdb.oplog.rs.find()コマンドを使用して、レプリカセットの元のoplogに対してクエリを実行することもできます。

tsあなたの目標は、このエントリを見つけて、そのフィールドに注意することです。

次のようになります。

"ts" : Timestamp( 1361497305, 2789 )

mongorestoreコマンドには2つのオプションがあり、1つはと呼ばれ--oplogReplay、もう1つはと呼ばれることに注意してくださいoplogLimit。ここで、復元されたスタンドアロンサーバーでこのoplogを再生しますが、この問題のある更新操作の前に停止します。

コマンドは次のようになります(ホストとポートは新しく復元されたバックアップがある場所です):

mongorestore -h host --port NNNN --oplogReplay --oplogLimit 1361497305:2789 oplogR

これにより、oplogRディレクトリのoplog.bsonファイルから各操作が復元され、ts値Timestamp(1361497305、2789)のエントリの直前で停止します。

別のインスタンスでこれを行った理由は、復元と再生で作成された正しいデータを確認できるようにするためです。確認したら、復元されたレコードを実際のプライマリの適切な場所に書き込むことができます(レプリケーションの伝播を許可します)。セカンダリへの修正されたレコード)。

于 2013-03-16T15:55:44.093 に答える