Mongo DBレプリカがRECOVERING状態でスタックする


14

レプリカセットを作成しましたが、問題はレプリカセットの2メンバー[3メンバーセット]が48時間から復旧モードになっていることです。最初は、回復するノードのサイズが増加していましたが、現在では停止しています。そのため、ノードを復旧する際に、90 GBのデータと60 GBを超えるローカルデータの後にスタックします。

このモードから抜け出す方法は?

回答:


13

簡単ですが、少し安全ではない方法

  1. 最初のセカンダリを停止します
  2. のコンテンツを削除します dbpath
  3. セカンダリを再起動します
  4. プライマリに追いつくまで待ちます
  5. 2番目のセカンダリでプロセスを繰り返します

セカンダリが回復状態に入った理由は不明であるため、これは少し安全ではありません。

より安全ですが、より侵入的な方法

上記と同じですが、プロセス中はアプリケーションを停止します。これにより、アプリケーションがセカンダリが複製できるよりも多くのデータを挿入する可能性を防ぎます。ただし、問題は生産中に発生する可能性があります。

最も安全でありながら最も侵入的な方法

  1. レプリカセット全体をシャットダウンする
  2. コンテンツ削除dbpath両方のセカンダリを
  3. の内容dbpathを両方のセカンダリにコピーしますdbpath
  4. 古いプライマリを起動します。
  5. 古いセカンダリのいずれかを起動します。
  6. 新しいプライマリが選出されるまで待ちます。
  7. 残りのセカンダリを起動します。

いくつかのメモ:

MMSを使用します。無料で、セットアップが簡単で、レプリカセットに関する適切な情報を提供します。「レプリケーションラグ」の値を0付近に維持し、レプリケーションラグが「レプリケーションoplogウィンドウ」より大きくならないようにするために必要なすべての手段を講じるようにしてください。

常に1Gbネットワークと(ごめん)大量のRAMがあることを確認してください。より多くの、より良い。追加の経験則:RAMとSSDの2倍よりもむしろRAMとSSDの半分を使用し、SSDを使用しない(RAMは妥当な制限内に収まる)。

免責事項: 本番データをいじる前に、常に本番データのバックアップを作成してください。


1
現時点では、レプリカセットにセカンダリノードはありません。1つはPRIMARYモードで、他の2つはRECOVERINGモードです。
アビナッシュサフ

1
論理的なセカンダリ。プロセスは同じです。
マーカスWマールバーグ

Mongoインスタンスの開始と再同期を何度も試みましたが、毎回、固定サイズ(〜96gb)まで他のノードへのデータのコピーを開始し、その後スタックします。oplogサイズはそれで何かをする必要がありますか?
アビナッシュサフ

1
そうではありませんが、最初の再同期中にoplogが保持できる量を超えるデータを挿入すると、再同期が停止する可能性があるという事実を除きます。この場合、オプション2または3を選択してください。
マルクスWマールバーグ

1
これについてもう少し説明できますか?「RAMを2倍にしてSSDを搭載しない(RAMを妥当な範囲内に収める)のではなく、RAMとSSDの半分を搭載します。」
スティーブングエン

1

レプリケーション・プロセスは、あなたが事がいくつか作ることですsecondary.Soに新しいDBPATHからスクラッチを起動しても失敗しoplogの変化を。oplogのサイズは、アプリケーションへのすべての書き込みを処理できるように最適な値に設定する必要があります。

oplogサイズの増加:

プライマリサーバーをシャットダウンする

use admin

db.shutdownServer()

スタンドアロンとしてプライマリを起動し、異なるポートで実行します37017

ポート37017でmongoにログインします

mongo --port 37017

ローカルデータベースの古いコンテンツを削除する

安全のために、削除する前に古いoplogのbackopを用意してください

mongodump --db local --collection 'oplog.rs' --port 37017

ローカルデータベースに古いコンテンツをドロップします

use local

db.oplog.rs.drop()

db.me.drop()

db.replset.election.drop()

db.replset.minvalid.drop()

db.startup_log.drop()

Replsetコレクションは削除できないため、必要なIDで削除します。

db.system.replset.remove({ "_id" : "your_replsetname"})

必要なサイズ、たとえば50 GBの新しいoplogを作成します

db.runCommand( { create: "oplog.rs", capped: true, size: (50 * 1024 * 1024 * 1024) } )

また、mongod.confファイルでoplogサイズをMB単位で指定できます。たとえば、50 GBの場合は429496 MBです

replication:
   oplogSizeMB: 429496

お役に立てれば !!!

編集:

Nicholas Tolley Cottrellがコメントで述べたように。MongoDB バージョン3.6では、再起動せずに実行時にoplogサイズを変更できます。

現在のoplogサイズを確認する

use local
db.oplog.rs.stats().maxSize

oplogサイズを10 GBに変更するには

db.adminCommand({replSetResizeOplog: 1, size: 10000})

1
上記は3.6の時点で古くなっています。コンテンツを削除したり、ノードを再起動したりすることなくoplogのサイズを変更できます。docs.mongodb.com/ manual
Nicholas Tolley Cottrell

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