MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Apakah penjurnalan MongoDB menjamin daya tahan?

Posting jawaban baru untuk membersihkan ini. Saya melakukan tes dan membaca kode sumber lagi dan saya yakin kejengkelan berasal dari kalimat yang tidak menguntungkan dalam dokumentasi masalah tulis. Dengan penjurnalan diaktifkan dan j:true menulis keprihatinan, menulis tahan lama, dan tidak ada jendela misterius untuk kehilangan data.

Meskipun penjurnalan aktif, apakah masih ada kemungkinan kehilangan penulisan di MongoDB?

Ya, karena daya tahan juga bergantung pada masing-masing operasi penulisan.

"Secara default, jumlah terbesar dari penulisan yang hilang, yaitu yang tidak dibuat ke jurnal, adalah yang dibuat dalam 100 milidetik terakhir."

Ini dari Manage Journaling, yang menunjukkan Anda bisa kehilangan penulisan yang dibuat sejak terakhir kali jurnal dipindahkan ke disk.

Itu betul. Jurnal di-flush oleh utas terpisah secara asinkron, sehingga Anda bisa kehilangan semuanya sejak flush terakhir.

Jika saya ingin lebih tahan lama, "Untuk memaksa mongod untuk berkomitmen ke jurnal lebih sering, Anda dapat menentukan j:true . Saat operasi tulis dengan j:true tertunda, mongod akan mengurangi journalCommitInterval hingga sepertiga dari nilai yang ditetapkan."

Ini membuatku kesal juga. Berikut artinya:

Saat Anda mengirim operasi tulis dengan j:true , itu tidak langsung memicu flush disk, dan tidak pada utas jaringan. Itu masuk akal, karena mungkin ada lusinan aplikasi yang berbicara dengan instance mongod yang sama. Jika setiap aplikasi banyak menggunakan penjurnalan, db akan menjadi sangat lambat karena selalu disinkronkan.

Alih-alih, yang terjadi adalah 'utas daya tahan' akan mengambil semua komitmen jurnal yang tertunda dan membuangnya ke disk. Utas diimplementasikan seperti ini (komentar milik saya):

sleepmillis(oneThird); //dur.cpp, line 801
for( unsigned i = 1; i <= 2; i++ ) {
  // break, if any j:true write is pending
  if( commitJob._notify.nWaiting() )
    break;
  // or the number of bytes is greater than some threshold
  if( commitJob.bytes() > UncommittedBytesLimit / 2  )
    break;
  // otherwise, sleep another third
  sleepmillis(oneThird);
}

// fsync all pending writes                                      
durThreadGroupCommit();

Jadi j:true . yang tertunda operasi akan menyebabkan utas komit jurnal untuk dikomit lebih awal dari biasanya, dan itu akan mengkomit semua penulisan yang tertunda ke jurnal, termasuk yang tidak memiliki j:true ditetapkan.

Bahkan dalam kasus ini, sepertinya mem-flush jurnal ke disk tidak sinkron sehingga masih ada kemungkinan kehilangan penulisan. Apakah saya melewatkan sesuatu tentang bagaimana menjamin bahwa tulisan tidak hilang?

Penulisan (atau getLastError perintah) dengan j:true masalah penulisan jurnal akan menunggu utas daya tahan selesai disinkronkan , jadi tidak ada risiko kehilangan data (sejauh OS dan perangkat keras menjaminnya).

Kalimat "Namun, ada jendela antara komit jurnal saat operasi penulisan tidak sepenuhnya tahan lama" mungkin merujuk pada mongod yang berjalan dengan penjurnalan diaktifkan yang menerima penulisan yang TIDAK gunakan j:true menulis keprihatinan. Dalam hal ini, ada kemungkinan penulisan hilang sejak jurnal terakhir dilakukan.

Saya mengajukan laporan bug dokumen untuk ini.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. data pegas - Mongodb - Metode findBy untuk objek bersarang

  2. MongoDB Opensource vs MongoDB Enterprise

  3. Opsi koneksi ulang otomatis luwak

  4. Temukan url duplikat di mongodb

  5. Bagaimana cara menambah bidang di mongodb?