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

MongoDB Menulis Kekhawatiran:3 Peringatan yang Harus Diketahui

'Tulis kekhawatiran' di MongoDB menjelaskan tingkat pengakuan penulisan yang dapat Anda harapkan darinya. Ini adalah pengaturan yang agak penting untuk diingat dalam operasi tulis Anda dan perilakunya berguna untuk dipahami, terutama dalam penerapan MongoDB terdistribusi (yaitu kumpulan replika dan kluster sharding). Dalam posting ini, kami membahas 3 gotcha saat menggunakan masalah penulisan MongoDB.

MongoDB Menulis Kekhawatiran

Dokumentasi MongoDB mendefinisikan masalah penulisan sebagai “tingkat pengakuan yang diminta dari MongoDB untuk operasi tulis ke mongod mandiri atau ke kumpulan replika atau ke kluster yang di-shard.

Sederhananya, masalah penulisan adalah indikasi 'daya tahan' yang diteruskan bersama dengan operasi tulis ke MongoDB. Untuk memperjelas, mari kita lihat sintaks:

{ w: <value>, j: <boolean>, wtimeout: <number> }
Where*,
 w can be an integer | "majority" | , it represents the number of members that must acknowledge the write. Default value is 1.
 j Requests that a write be acknowledged after it is written to the on-disk journal as opposed to just the system memory. Unspecified by default.
wtimeout specifies timeout for the applying the write concern. Unspecified by default.

* Anda dapat menemukan sintaks rinci dalam dokumentasi Spesifikasi Kekhawatiran Tulis.

* Pelajari lebih lanjut tentang "tag" berbeda yang dapat Anda gunakan untuk nilai masalah penulisan umum di blog Memahami Daya Tahan &Keamanan Penulisan di MongoDB.

Contoh:

db.inventory.insert(
    { sku: "abcdxyz", qty : 100, category: "Clothing" },
    { writeConcern: { w: 2, j: true, wtimeout: 5000 } }
)

Permasalahan penulisan sisipan di atas dapat dibaca sebagai berikut:  akui penulisan ini ketika 'setidaknya 2 anggota kumpulan replika telah menulisnya ke jurnal mereka dalam 5000 mdtk atau mengembalikan kesalahan '. Nilai kekhawatiran penulisan untuk opsi adalah mayoritas, yang berarti “rmeminta pengakuan bahwa operasi penulisan telah disebarkan ke sebagian besar node pemungutan suara, termasuk yang utama.

#MongoDB Tulis Kekhawatiran - 3 Peringatan yang Harus DiketahuiKlik Untuk Tweet

Pentingnya masalah penulisan terlihat jelas. Meningkatkan nilai w meningkatkan latensi penulisan sementara juga mengurangi kemungkinan tersesat. Memilih nilai yang benar untuk masalah penulisan bergantung pada persyaratan latensi dan ketahanan penulisan yang dilakukan.

Dengan latar belakang tentang apa itu masalah penulisan, mari beralih ke tiga peringatan yang perlu diingat saat menggunakan masalah penulisan.

CAVEAT 1: Menyetel masalah penulisan pada kumpulan replika tanpa wtimeout dapat menyebabkan penulisan diblokir tanpa batas waktu

Definisi mayoritas (berlaku MongoDB 3.0 dan seterusnya) di atas menyatakan bahwa pengakuan diminta dari mayoritas "node pemungutan suara". Perhatikan bahwa “Jika Anda tidak menentukan wtimeout opsi dan tingkat kekhawatiran penulisan tidak dapat dicapai, operasi penulisan akan diblokir tanpa batas waktu. “

Ini dapat memiliki konsekuensi yang tidak terduga, misalnya, pertimbangkan kumpulan replika 2+1 (yaitu, primer, sekunder, dan arbiter). Jika satu-satunya replika baca Anda mati, maka semua penulisan dengan kekhawatiran penulisan w opsi "mayoritas" akan diblokir tanpa batas. Hal yang sama akan terjadi jika opsi w disetel ke 2. Contoh ekstrem lainnya adalah dalam kasus set replika 3+2 (primer, 2 sekunder, dan 2 arbiter, bukan konfigurasi yang disarankan). Semua penulisan "mayoritas" akan diblokir meskipun satu node data tidak tersedia karena jumlah mayoritas, dalam hal ini, adalah 3.

Cara paling sederhana untuk mengatasi masalah ini adalah selalu menentukan nilai wtimeout sehingga kueri dapat timeout jika masalah penulisan tidak dapat diterapkan. Namun, jika terjadi kesalahan batas waktu seperti itu, MongoDB tidak membatalkan penulisan yang sudah berhasil dilakukan ke beberapa anggota sebelum batas waktu terjadi.

Saat ini juga tidak ada pengaturan untuk memastikan penulisan mencapai sebagian besar node yang saat ini dapat dijangkau, jadi berhati-hatilah dalam mengatur nilai kekhawatiran penulisan w berdasarkan topologi yang diinginkan daya tahan, dan ketersediaan.

PERINGATAN 2: Anda mungkin kehilangan data bahkan dengan w:mayoritas

Tampaknya intuitif bahwa setelah tulisan diakui oleh mayoritas anggota pemilih, daya tahannya dijamin. Namun, bukan itu masalahnya! Ingatlah bahwa ketika opsi j tidak ditentukan, penulisan diakui tepat setelah ditulis ke memori.

Jadi, penulisan seperti itu dapat hilang jika pemadaman listrik yang tidak biasa menghilangkan sebagian besar node tempat penulisan telah disebarkan (dan sebelum syncPeriodSecs yaitu sebelum dapat di-flush ke disk).

Untuk memastikan ketahanan penulisan, sebaiknya jangan matikan penjurnalan di database Anda dan setel opsi j ke true. Faktanya, mulai MongoDB 3.6, --nojournal flag tidak digunakan lagi untuk anggota kumpulan replika menggunakan mesin penyimpanan WiredTiger.

Dengan nilai w "mayoritas" dan opsi j tidak ditentukan pada set replika, perilaku ketahanan yang tepat bergantung pada nilai konfigurasi set replika writeConcernMajorityJournalDefault. Saat disetel ke true (dan saat penjurnalan diaktifkan), ia mengakui penulisan setelah ditulis ke jurnal mayoritas anggota pemungutan suara.

Selain:Meskipun penjurnalan diaktifkan, penulisan Anda mungkin masih hilang di mesin penyimpanan MMAPv1 jika pemadaman terjadi dalam durasi commitIntervalMs. Mesin penyimpanan WiredTiger, di sisi lain, memaksa sinkronisasi file jurnal saat menerima opsi tulis dengan j disetel ke true. Dan, bahkan dengan j disetel ke false, penulisan "mayoritas" yang diakui ke penerapan berbasis WiredTiger terbaru dapat hilang hanya jika sebagian besar node data mogok secara bersamaan.

CAVEAT 3: w:0 saat menyetel j:true tidak meningkatkan performa penulisan

Ini cukup mudah untuk dipikirkan begitu Anda memikirkannya, tetapi juga mudah untuk dilupakan. Menyetel opsi w ke 0 biasanya dilakukan untuk menulis ke database dengan cara “api-dan-lupakan” – ketika Anda memiliki cukup banyak kepercayaan pada infrastruktur database dan lebih peduli dengan latensi daripada daya tahan setiap penulisan. Namun, jika Anda menyetel opsi j ke true, opsi w Anda akan ditimpa secara efektif karena database akan memastikan bahwa penulisan ditulis ke jurnal di disk sebelum kembali.

Jika Anda menggunakan masalah penulisan untuk menjamin keberhasilan operasi penulisan Anda, pastikan Anda mengingat tiga peringatan penting ini! Kami siap membantu, jadi jangan ragu untuk menjawab pertanyaan apa pun melalui Twitter atau email.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara Mudah Mengelola Pembaruan Basis Data dan Patch Keamanan

  2. Apakah MongoDB menggunakan kembali ruang yang dihapus?

  3. MongoDB $dan Operator Pipa Agregasi

  4. Bagaimana cara memastikan item unik dalam array berdasarkan bidang tertentu - mongoDB?

  5. MongoDB:temukan dan temukanSatu dengan pemfilteran array bersarang