Di mana-mana saya melihat, saya melihat bahwa MongoDB adalah CP. Tetapi ketika saya menggali lebih dalam, saya melihatnya pada akhirnya konsisten. Apakah CP saat Anda menggunakan safe = true? Jika demikian, apakah itu berarti ketika saya menulis dengan safe = true, semua replika akan diperbarui sebelum mendapatkan hasilnya?
121
Saya setuju dengan posting Luccas. Anda tidak bisa begitu saja mengatakan bahwa MongoDB adalah CP / AP / CA, karena sebenarnya ini adalah pertukaran antara C, A dan P, tergantung pada konfigurasi database / driver dan jenis bencana : berikut adalah rekap visualnya, dan di bawah a penjelasan lebih detail.
Konsistensi:
MongoDB sangat konsisten ketika Anda menggunakan satu koneksi atau Tingkat Masalah Tulis / Baca yang benar ( Yang akan membuat Anda kehilangan kecepatan eksekusi ). Segera setelah Anda tidak memenuhi ketentuan tersebut (terutama saat Anda membaca dari replika sekunder) MongoDB menjadi Konsisten Akhirnya.
Ketersediaan:
MongoDB mendapatkan ketersediaan tinggi melalui Replica-Sets . Segera setelah primer mati atau tidak tersedia lagi, sekunder akan menentukan primer baru agar tersedia lagi. Ada kerugian untuk ini: Setiap penulisan yang dilakukan oleh primer lama, tetapi tidak disinkronkan ke sekunder akan dibatalkan dan disimpan ke file rollback, segera setelah terhubung kembali ke set (primer lama adalah sekunder sekarang). Jadi dalam hal ini beberapa konsistensi dikorbankan demi ketersediaan.
Toleransi Partisi:
Melalui penggunaan Replica-Sets tersebut, MongoDB juga mencapai toleransi partisi: Selama lebih dari separuh server Replica-Set terhubung satu sama lain, primer baru dapat dipilih . Mengapa? Untuk memastikan dua jaringan terpisah tidak dapat memilih utama baru. Ketika tidak cukup sekunder yang terhubung satu sama lain, Anda masih dapat membaca dari mereka (tetapi konsistensi tidak dijamin), tetapi tidak dapat menulis. Set ini praktis tidak tersedia demi konsistensi.
sumber
Saat artikel baru yang brilian muncul dan juga beberapa eksperimen luar biasa oleh Kyle di bidang ini, Anda harus berhati-hati saat memberi label MongoDB, dan database lain, sebagai C atau A.
Tentu saja CAP membantu untuk melacak tanpa banyak kata apa yang berlaku database tentang itu, tetapi orang sering lupa bahwa C dalam CAP berarti konsistensi atom (kelinearisasi), misalnya. Dan ini membuat saya sangat kesakitan untuk mengerti saat mencoba mengklasifikasikan. Jadi, selain MongoDB memberikan konsistensi yang kuat, bukan berarti itu C. Dengan cara ini, jika salah membuat klasifikasi ini, saya sarankan untuk juga memberikan lebih dalam bagaimana sebenarnya cara kerjanya agar tidak meninggalkan keraguan.
sumber
Ya, itu CP saat menggunakan
safe=true
. Ini berarti, data berhasil sampai ke disk master. Jika Anda ingin memastikannya juga tiba di beberapa replika, lihat parameter 'w = N' di mana N adalah jumlah replika tempat data harus disimpan.lihat ini dan ini untuk informasi lebih lanjut.
sumber
Saya tidak yakin tentang P untuk Mongo. Bayangkan situasi:
Masalahnya di sini adalah ukuran file dump terbatas dan jika Anda memiliki partisi untuk waktu yang lama, Anda dapat kehilangan data selamanya.
Anda dapat mengatakan bahwa itu tidak mungkin terjadi - ya, kecuali di cloud di mana hal itu lebih umum daripada yang diperkirakan.
Contoh ini adalah mengapa saya akan sangat berhati-hati sebelum menetapkan surat apa pun ke database apa pun. Banyak sekali skenario dan implementasi yang tidak sempurna.
Jika ada yang tahu jika skenario ini telah diatasi dalam rilis Mongo nanti, silakan beri komentar! (Saya belum mengikuti semua yang terjadi selama beberapa waktu ..)
sumber
Mongodb tidak pernah mengizinkan penulisan ke sekunder. Ini memungkinkan pembacaan opsional dari sekunder tetapi tidak menulis. Jadi jika primer Anda turun, Anda tidak dapat menulis sampai sekunder menjadi primer lagi. Begitulah, Anda mengorbankan Ketersediaan Tinggi dalam teorema CAP. Dengan menjaga agar bacaan Anda hanya dari awal, Anda dapat memiliki konsistensi yang kuat.
sumber
MongoDB memilih Konsistensi atas Ketersediaan setiap kali ada Partisi. Artinya adalah ketika ada partisi (P) ia memilih Konsistensi (C) daripada Ketersediaan (A).
Untuk memahami ini, Mari kita pahami bagaimana MongoDB melakukan set replika bekerja. Sebuah Replika Set memiliki satu simpul utama. Satu-satunya cara yang "aman" untuk memasukkan data adalah dengan menulis ke node tersebut dan kemudian menunggu data tersebut berkomitmen ke sebagian besar node dalam kumpulan. (Anda akan melihat bendera itu untuk w = mayoritas saat mengirim tulisan)
Partisi dapat terjadi dalam dua skenario sebagai berikut:
Pada dasarnya, setiap kali partisi terjadi dan MongoDB perlu memutuskan apa yang harus dilakukan, ia akan memilih Konsistensi daripada Ketersediaan. Ini akan berhenti menerima penulisan ke sistem sampai ia yakin dapat menyelesaikan penulisan tersebut dengan aman.
sumber
Mongodb memberikan konsistensi dan toleransi partisi .
Dalam konteks database terdistribusi (NoSQL), ini berarti akan selalu ada trade-off antara konsistensi dan ketersediaan. Ini karena sistem terdistribusi selalu selalu toleran terhadap partisi (yaitu, database tidak akan terdistribusi jika tidak toleran terhadap partisi.)
Konsistensi - Sistem pada akhirnya akan menjadi konsisten. Cepat atau lambat, data akan menyebar ke mana-mana, tetapi sistem akan terus menerima masukan dan tidak memeriksa konsistensi setiap transaksi sebelum berpindah ke transaksi berikutnya.
Ketersediaan - Secara default, Klien DB Mongo (driver MongoDB), mengirim semua permintaan baca / tulis ke node pemimpin / utama. Itu membuat sistem konsisten tetapi tidak tersedia karena - Jika seorang pemimpin memutuskan koneksi dari cluster, dibutuhkan beberapa detik untuk memilih pemimpin baru. Jadi, membuatnya tidak tersedia untuk menulis dan membaca dalam durasi tersebut.
sumber