Di mana posisi mongodb dalam teorema CAP?

121

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?

Gluz
sumber

Jawaban:

104

MongoDB sangat konsisten secara default - jika Anda menulis dan kemudian membaca, dengan asumsi penulisan berhasil, Anda akan selalu dapat membaca hasil tulisan yang baru saja Anda baca. Ini karena MongoDB adalah sistem master tunggal dan semua pembacaan masuk ke primer secara default. Jika Anda secara opsional mengaktifkan membaca dari sekunder maka MongoDB akhirnya menjadi konsisten di mana mungkin untuk membaca hasil yang sudah ketinggalan zaman.

MongoDB juga mendapatkan ketersediaan tinggi melalui failover otomatis dalam set replika: http://www.mongodb.org/display/DOCS/Replica+Sets

stbrody.dll
sumber
13
Menurut aphyr.com/posts/322-call-me-maybe-mongodb-stale-reads bahkan jika Anda membaca dari node utama dalam set replika, Anda mungkin mendapatkan data yang basi atau kotor. Jadi, apakah MongoDB konsisten kuat ??
Mike Argyriou
3
Eksperimen mengagumkan oleh Kyle. Itu benar-benar memburu mongo. Saya bertanya-tanya apakah ada sistem produksi, misalnya menggunakan MongoDB melakukan transaksi pembayaran? Jika itu hanya situs web pribadi, siapa yang peduli dengan konsistensi yang kuat.
xin
5
Sekadar catatan, MongoDB v3.4 lulus tes yang dirancang oleh Kyle jadi ya, MongoDB sangat konsisten, bahkan dengan ReplicaSet dan Sharding: mongodb.com/mongodb-3.4-passes-jepsen-test
Maxime Beugnet
2
Jawaban ini mungkin agak terlalu sederhana, karena MongoDB dapat mengorbankan ketersediaan dari waktu ke waktu, berdasarkan konfigurasi. JoCa lebih baik menjelaskan situasi di mana ia berperilaku CA / CP / AP
PaoloC
36

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.

    Scenario                   | Main Focus | Description
    ---------------------------|------------|------------------------------------
    No partition               |     CA     | The system is available 
                               |            | and provides strong consistency
    ---------------------------|------------|------------------------------------
    partition,                 |     AP     | Not synchronized writes 
    majority connected         |            | from the old primary are ignored                
    ---------------------------|------------|------------------------------------
    partition,                 |     CP     | only read access is provided
    majority not connected     |            | to avoid separated and inconsistent systems

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.

JoCa
sumber
Jadi jika saya menggunakan tingkat perhatian tulis / baca yang benar, itu berarti semua tulisan dan bacaan masuk ke primer (jika saya mengerti dengan benar), jadi apa sebenarnya yang dilakukan oleh yang sekunder? Duduk saja di sana dalam keadaan siaga kalau-kalau primer mati?
tomer.z
@ tomer.z Anda mungkin ingin membaca bagian manual ini: Anda dapat menggunakan sekunder untuk membaca. Jika Anda menggunakan Tingkat-Baca "mayoritas", bacaan tersebut akan berlaku segera setelah mayoritas anggota mengakui bacaan tersebut. Hal yang sama berlaku untuk Tingkat Tulis "mayoritas". Jika Anda menggunakan Tingkat Masalah "mayoritas" untuk keduanya, Anda memiliki database yang konsisten. Anda mungkin ingin membaca lebih lanjut tentang ini di manual .
JoCa
18

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.

Luccas
sumber
10

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.

Jan Prieser
sumber
3

Saya tidak yakin tentang P untuk Mongo. Bayangkan situasi:

  • Replika Anda terbagi menjadi dua partisi.
  • Penulisan terus berlanjut ke kedua sisi saat tuan baru terpilih
  • Partisi diselesaikan - semua server sekarang terhubung kembali
  • Apa yang terjadi adalah master baru dipilih - master yang memiliki oplog tertinggi, tetapi data dari master lain akan dikembalikan ke status umum sebelum partisi dan dibuang ke file untuk pemulihan manual
  • semua orang sekunder mengejar master baru

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 ..)

kubal5003
sumber
2
Protokol pemilihan MongoDB dirancang untuk memiliki (paling banyak) satu pemilihan utama. Primer hanya dapat dipilih (dan dipertahankan) oleh mayoritas ketat dari anggota pemungutan suara kumpulan replika yang dikonfigurasi (n / 2 +1). Dalam hal partisi jaringan, hanya satu partisi (dengan mayoritas anggota pemungutan suara) yang dapat memilih partisi primer; primer sebelumnya dalam partisi minoritas akan mundur dan menjadi sekunder. Ini adalah cara set replika selalu bekerja. Jika primer sebelumnya telah menerima penulisan yang tidak direplikasi, maka penulisan tersebut akan dibatalkan (disimpan ke disk) saat anggota tersebut bergabung kembali dengan kumpulan replika.
Stennie
2

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.

sn.anurag
sumber
2

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:

  • Ketika simpul utama mati: sistem menjadi tidak tersedia sampai primer baru dipilih.
  • Ketika node utama kehilangan koneksi dari terlalu banyak node Sekunder: sistem menjadi tidak tersedia. Sekunder lainnya akan mencoba memilih Pratama baru dan primer saat ini akan mundur.

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.

Rajneesh Prakash
sumber
"Ini akan berhenti menerima penulisan ke sistem sampai ia yakin dapat menyelesaikan penulisan tersebut dengan aman. " Bagaimana dengan membaca ? Apakah itu akan tetap tersedia untuk dibaca selama waktu itu?
Josh
1

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.

Satakshi Pandey
sumber