Durability adalah “D” dalam properti “ACID” (A – Atomicity, C – Consistency, I – Isolation), dipopulerkan oleh sistem manajemen database relasional tradisional (RDBMS). Ketahanan adalah jaminan bahwa data tertulis telah disimpan dan akan bertahan secara permanen. Basis data NoSQL seperti MongoDB memberi developer kontrol mendetail atas ketahanan panggilan tulis mereka. Hal ini memungkinkan pengembang untuk memilih model daya tahan, keamanan, dan kinerja yang berbeda untuk kelas data yang berbeda. Namun, ini juga membebani pengembang untuk membedakan dan memahami nuansa dari opsi keamanan penulisan yang berbeda. Dalam postingan ini, kita akan melihat berbagai opsi untuk keamanan penulisan yang disediakan di driver Java.
Dalam bahasa MongoDB, ini disebut “Tulis Kekhawatiran”. Masalah penulisan bervariasi dari "lemah" hingga "kuat". Kekhawatiran penulisan yang lemah dapat menyebabkan throughput yang lebih tinggi tetapi memberikan keamanan data yang lebih sedikit dan kekhawatiran penulisan yang kuat adalah sebaliknya.
Driver Java memungkinkan Anda menentukan opsi keamanan penulisan menggunakan beberapa konstruktor telescoping. Inilah konstruktor dengan semua opsi:
WriteConcern(int w, int wtimeout, boolean fsync, boolean j, boolean continueOnError)
Seperti yang Anda lihat, konstruktor ini memiliki banyak opsi. Untuk memudahkan pengembang, "Tag" disediakan untuk nilai masalah penulisan umum – Tidak Diakui, Diakui, Dijurnal, Disinkronkan, dan Diakui Replika. Setiap tag memetakan ke permintaan tertentu dari konstruktor di atas.
Mode MongoDB Tidak Diakui
Ini adalah mode "api dan lupakan". Driver MongoDB tidak berusaha untuk mengakui penerimaan operasi tulis. Misalnya, jika layanan MongoDB Anda tidak aktif dan Anda menggunakan mode ini, semua kesalahan diabaikan secara diam-diam dan data Anda hilang. Jelas, Anda hanya boleh menggunakan mode ini untuk data bernilai rendah di mana throughput tulis lebih penting daripada kehilangan sejumlah data tertentu. Mode ini dapat ditentukan sebagai berikut:
new WriteConcern(0) / WriteConcern.UNACKNOWLEDGED
Mode MongoDB yang Diakui
Ini adalah mode penulisan default untuk MongoDB. Dalam mode ini, driver MongoDB mencoba untuk mengakui penerimaan operasi tulis di server, memungkinkan driver untuk menangkap kesalahan jaringan, kesalahan kunci duplikat, dll. Namun, ini tidak menjamin bahwa data disimpan di disk. Jika server MongoDB lumpuh setelah mengakui penulisan, tetapi sebelum memasukkannya ke disk, data akan hilang. Mode ini dapat ditentukan sebagai berikut:
new WriteConcern(1) / WriteConcern.ACKNOWLEDGED
Mode MongoDB Terjurnal
Dalam mode ini, server MongoDB hanya mengakui penulisan setelah memasukkan data ke jurnal. Saat menggunakan mode ini, bahkan jika server macet saat server dihidupkan ulang, data diterapkan kembali dari jurnal. Jelas, penjurnalan perlu diaktifkan agar ini berfungsi. Semua sistem produksi harus mengaktifkan penjurnalan, dan Anda dapat mempelajari lebih lanjut tentang ini di postingan kami Haruskah Anda mengaktifkan penjurnalan MongoDB?
Dalam skenario kumpulan replika, masalah penulisan penjurnalan hanya berlaku untuk yang utama. Secara default, jurnal berkomitmen ke disk setiap 100 ms. Saat Anda menentukan penulisan dengan opsi terjurnal, jurnal berkomitmen ke disk dalam 30 ms. Jadi, jika Anda menentukan j:true untuk setiap penulisan, throughput Anda akan menjadi maksimum 1000/30 =33,3 penulisan/dtk. Jika Anda menginginkan hasil yang lebih baik, Anda harus mengelompokkan pembaruan dan menyetel j:true untuk pembaruan terakhir dari kumpulan tersebut. Mode ini dapat ditentukan sebagai berikut:
WriteConcern( 1, 0, false, true ) / WriteConcern.JOURNALLED
Mode MongoDB Tersinkronisasi
Dalam mode ini, server MongoDB mengakui penulisan hanya setelah penulisan ditulis ke disk. Mode ini dapat ditentukan sebagai berikut:
new WriteConcern(true) / WriteConcern.FSYNCED
Mode MongoDB yang Diakui Replika
Mode keamanan penulisan sebelumnya hanya berlaku untuk satu server. Saat Anda menjalankan kumpulan replika, Anda memiliki opsi untuk mengontrol berapa banyak replika yang perlu ditulis untuk ditulis sebelum dianggap berhasil. Misalnya, dengan masalah penulisan "w:2", penulisan harus ditulis ke satu primer dan setidaknya satu sekunder sebelum dianggap berhasil. Ini mengurangi throughput tetapi memberi Anda keamanan yang lebih baik. Jika Anda tidak mengetahui jumlah replika sebelumnya, Anda dapat menggunakan tag WriteConcern.MAJORITY untuk memastikan bahwa data disimpan di sebagian besar replika. Ini adalah opsi teraman di MongoDB. Jika Anda akan menggunakan opsi ini, pastikan juga untuk menyetel nilai "wtimeout" untuk menunjukkan berapa lama perintah harus menunggu sebelum mengembalikan kegagalan:
new WriteConcern(2)/ REPLICA_ACKNOWLEDGED new Majority()/ WriteConcern.MAJORITY
Tag berikut tidak digunakan lagi (atau rencananya akan) – ERRORS_IGNORED, NORMAL, SAFE, FSYNC_SAFE, JOURNAL_SAFE, REPLICAS_SAFE. Harap gunakan opsi yang lebih baru daripada opsi ini. Seperti biasa, jika Anda memiliki komentar atau pertanyaan, hubungi kami di [email protected].