Replika Mongo DB Terjebak di kondisi RECOVERING

14

Kami telah membuat set replika dan sekarang masalahnya adalah 2 anggota set replika [3 set anggota] dalam mode pemulihan dari 48 jam. Awalnya ukuran memulihkan node meningkat dan sekarang bahkan sudah berhenti. Jadi dalam memulihkan node, mereka terjebak setelah 90 GB data dengan 60+ GB data lokal.

Bagaimana cara keluar dari mode ini?

Avinash Sahu
sumber

Jawaban:

13

Cara yang mudah, meskipun agak tidak aman

  1. Hentikan menengah pertama
  2. Hapus konten itu dbpath
  3. Mulai ulang yang kedua
  4. Tunggu sampai ketinggalan dengan yang utama
  5. Ulangi proses dengan sekunder kedua

Ini agak tidak aman karena tidak diketahui mengapa secondaries memasuki kondisi Sembuh.

Cara yang lebih aman, tetapi juga lebih mengganggu

Seperti di atas, tetapi hentikan aplikasi Anda selama proses. Ini mencegah kemungkinan aplikasi Anda memasukkan lebih banyak data daripada yang dapat ditiru oleh sekunder. Namun, masalah dapat terjadi selama produksi.

Cara yang paling aman, tetapi juga yang paling mengganggu

  1. Matikan seluruh set replika
  2. Hapus konten dbpathpada kedua sekunder
  3. Salin konten dbpathke kedua menengahdbpath
  4. Mulai primer lama.
  5. Mulai salah satu dari sekretaris lama.
  6. Tunggu hingga primer baru terpilih.
  7. Mulai sekunder yang tersisa.

Beberapa catatan:

Gunakan MMS . Ini gratis, mudah diatur dan memberi Anda informasi yang baik tentang set replika Anda. Cobalah untuk menjaga nilai untuk "lag replikasi" sekitar 0, dan ambil semua cara yang diperlukan agar lag replikasi Anda tidak pernah lebih besar dari "jendela oplog replikasi".

Selalu pastikan Anda memiliki jaringan 1Gb dan beban RAM (maaf). Lebih banyak lebih baik. Aturan tambahan: bukan setengah dari RAM dan SSD dari dua kali lipat RAM dan tidak ada SSD (dengan RAM yang tersisa dalam batas wajar).

Penafian: Selalu buat cadangan data produksi sebelum mengutak-atiknya.

Markus W Mahlberg
sumber
1
Sampai sekarang kami tidak memiliki simpul sekunder dalam set replika. Satu dalam mode PRIMARY dan dua lainnya dalam mode RECOVERING.
Avinash Sahu
1
Sekunder logis, lalu. Prosesnya sama.
Markus W Mahlberg
Saya telah mencoba berkali-kali memulai instance Mongo dan melakukan sinkronisasi ulang, setiap kali ia mulai menyalin data ke node lain hingga ukuran tetap (~ 96gb) dan kemudian macet. Apakah ukuran oplog harus melakukan sesuatu dengannya?
Avinash Sahu
1
Tidak juga, kecuali fakta bahwa sinkronisasi ulang mungkin berhenti ketika Anda memasukkan lebih banyak data daripada yang bisa disimpan oleh oplog selama penyinkronan awal. Ambil opsi 2 atau 3 dalam hal ini.
Markus W Mahlberg
1
Bisakah Anda jelaskan sedikit lebih jauh? "Lebih dari setengah RAM dan SSD daripada dua kali lipat RAM dan tidak ada SSD (dengan RAM yang tersisa dalam batas wajar)."
Stephen Nguyen
1

Proses replikasi gagal bahkan jika Anda mulai menggaruk dari dbpath baru di sekunder. Jadi masalahnya adalah membuat beberapa perubahan dalam oplog . Ukuran oplog harus diatur ke nilai optimal sehingga harus dapat menangani semua aplikasi menulis ke dalamnya.

Meningkatkan ukuran oplog:

Matikan server utama

use admin

db.shutdownServer()

Mulai primer sebagai mandiri & jalankan di port yang berbeda katakan 37017

Masuk ke mongo di port 37017

mongo --port 37017

Hapus konten lama di basis data lokal

Untuk keamanan, miliki backop oplog lama sebelum dijatuhkan

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

Letakkan konten lama di basis data lokal

use local

db.oplog.rs.drop()

db.me.drop()

db.replset.election.drop()

db.replset.minvalid.drop()

db.startup_log.drop()

Pengumpulan ulang koleksi tidak dapat dibatalkan, jadi hapus dengan id yang diperlukan:

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

Buat oplog baru dengan ukuran yang diperlukan, ucapkan 50 GB

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

Anda juga dapat menentukan ukuran oplog dalam MB di file mongod.conf, katakanlah 50 GB-nya 429496 MB

replication:
   oplogSizeMB: 429496

Semoga ini membantu !!!

Edit:

Seperti yang disebutkan oleh Nicholas Tolley Cottrell dalam komentar. Dalam MongoDB versi 3.6 kita dapat mengubah ukuran oplog dalam runtime tanpa restart.

Periksa ukuran oplog saat ini

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

Untuk mengubah ukuran oplog menjadi 10 GB

db.adminCommand({replSetResizeOplog: 1, size: 10000})
JERRY
sumber
1
Di atas sudah ketinggalan zaman pada 3.6. Anda sekarang dapat mengubah ukuran oplog tanpa menjatuhkan konten atau bahkan memulai ulang node: docs.mongodb.com/manual/tutorial/change-oplog-size
Nicholas Tolley Cottrell
1
@NicholasTolleyCottrell ya, saya sudah mengedit jawabannya.
JERRY