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

Sampai level berapa MongoDB mengunci penulisan? (atau:apa yang dimaksud dengan per koneksi

Penguncian MongoDB Berbeda

Mengunci di MongoDB tidak berfungsi seperti mengunci di RDBMS, jadi ada sedikit penjelasan. Di versi MongoDB sebelumnya, ada satu kait pembaca/penulis global. Dimulai dengan MongoDB 2.2, ada kait pembaca/penulis untuk setiap database.

Kait pembaca-penulis

Kaitnya adalah multi-pembaca, penulis tunggal, dan serakah penulis. Artinya:

  • Bisa ada jumlah pembaca simultan yang tidak terbatas di database
  • Hanya ada satu penulis dalam satu waktu pada koleksi mana pun dalam satu basis data (lebih lanjut tentang ini sebentar lagi)
  • Penulis memblokir pembaca
  • Dengan "writer-greedy", maksud saya begitu permintaan menulis masuk, semua pembaca diblokir hingga penulisan selesai (lebih lanjut tentang ini nanti)

Perhatikan bahwa saya menyebutnya "gerendel" daripada "kunci". Ini karena ringan, dan dalam skema yang dirancang dengan benar, kunci tulis ditahan pada urutan selusin mikrodetik. Lihat di sini untuk informasi lebih lanjut tentang penguncian pembaca-penulis.

Di MongoDB, Anda dapat menjalankan kueri simultan sebanyak yang Anda suka:selama data yang relevan ada di RAM, semuanya akan dipenuhi tanpa mengunci konflik.

Pembaruan Dokumen Atom

Ingat bahwa di MongoDB tingkat transaksi adalah satu dokumen. Semua pembaruan untuk satu dokumen adalah Atom. MongoDB mencapai ini dengan menahan kait tulis hanya selama diperlukan untuk memperbarui satu dokumen dalam RAM. Jika ada operasi yang berjalan lambat (khususnya, jika dokumen atau entri indeks perlu di-page dari disk), maka operasi itu akan menghasilkan kait tulis. Ketika operasi menghasilkan latch, maka operasi antrian berikutnya dapat dilanjutkan.

Ini berarti bahwa penulisan ke semua dokumen dalam satu database menjadi serial. Ini bisa menjadi masalah jika Anda memiliki desain skema yang buruk, dan penulisan Anda memakan waktu lama, tetapi dalam skema yang dirancang dengan benar, penguncian tidak menjadi masalah.

Penulis Serakah

Beberapa kata lagi tentang menjadi penulis-rakus:

Hanya satu penulis yang dapat memegang kait pada satu waktu; beberapa pembaca dapat memegang kait sekaligus. Dalam implementasi naif, penulis bisa kelaparan tanpa batas jika ada satu pembaca yang beroperasi. Untuk menghindari hal ini, dalam implementasi MongoDB, setelah satu utas membuat permintaan tulis untuk latch tertentu

  • Semua pembaca berikutnya yang membutuhkan kait itu akan memblokir
  • Penulis itu akan menunggu sampai semua pembaca saat ini selesai
  • Penulis akan mendapatkan kait tulis, melakukan pekerjaannya, dan kemudian melepaskan kait tulis
  • Semua pembaca yang mengantre sekarang akan melanjutkan

Perilaku sebenarnya adalah kompleks, karena perilaku serakah penulis ini berinteraksi dengan mengalah dengan cara yang tidak jelas. Ingatlah bahwa, dimulai dengan rilis 2.2, ada terpisah latch untuk setiap database, jadi menulis ke koleksi mana pun di database 'A' akan memperoleh latch terpisah daripada menulis ke koleksi mana pun di database 'B'.

Pertanyaan khusus

Mengenai pertanyaan spesifik:

  • Kunci (sebenarnya kait) dipegang oleh kernel MongoDB hanya selama diperlukan untuk memperbarui satu dokumen
  • Jika Anda memiliki beberapa koneksi yang masuk ke MongoDB, dan masing-masing dari koneksi tersebut melakukan serangkaian penulisan, latch akan ditahan berdasarkan basis data hanya selama yang diperlukan untuk menyelesaikan penulisan tersebut
  • Beberapa koneksi yang masuk saat melakukan penulisan (perbarui/masukkan/hapus) semuanya akan disisipkan

Meskipun ini terdengar seperti masalah kinerja yang besar, dalam praktiknya itu tidak memperlambat segalanya. Dengan skema yang dirancang dengan benar dan beban kerja tipikal, MongoDB akan memenuhi kapasitas I/O disk -- bahkan untuk SSD -- sebelum persentase penguncian pada basis data apa pun melebihi 50%.

Cluster MongoDB berkapasitas tertinggi yang saya ketahui saat ini melakukan 2 juta penulisan per detik.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Panggil fungsi di dalam agregat mongodb?

  2. Mongodb tidak akan dimulai

  3. Masukkan elemen ke dalam array bersarang di MongoDB

  4. Dorong ke dua larik terpisah dalam satu panggilan pembaruan di mongodb

  5. Bisakah mongo memasukkan data array?