Bisakah basis data NoSQL menyebabkan hilangnya data sesekali?

8

Saat ini saya sedang mengevaluasi database yang akan digunakan untuk proyek baru, yang akan membutuhkan penyisipan dan permintaan sejumlah besar data perdagangan. Tim kami condong ke arah Cassandra, tetapi kemudian saya membaca artikel ini yang tampaknya menyarankan penggunaan database yang tidak ACID dapat menyebabkan hilangnya data sesekali:

http://www.dbms2.com/2010/09/21/acid-compliant-transaction-integrity/

Saya tidak dapat menemukan informasi lebih lanjut tentang ini di web dan tidak dapat memahami bagaimana kepatuhan non-ACID berarti kehilangan data dapat terjadi. Adakah yang bisa menjelaskan?

del
sumber
Neo4j adalah database NOSQL (grafik) yang sebenarnya sesuai dengan ACID . Itu datang dengan dukungan transaksi penuh dan ketekunan yang tahan lama. Neo4j juga menggunakan log transaksi untuk mengamankan operasi penulisan sebelum menerapkannya ke datastore. Penafian: Saya bekerja untuk Neo Technology.
Michael Hunger
3
Menurut hukum Murphy (dan pengalaman saya sendiri), Anda dapat kehilangan data dengan basis data apa pun .
a_horse_with_no_name
Ungkapan yang lebih baik mungkin "apakah basis data NoSQL memiliki peluang kehilangan atau korupsi data yang jauh lebih besar daripada RDBMS tradisional?" Masih agak kabur.
Jon of All Trades
Beberapa produk NoSQL menawarkan ACIDity baris tunggal. Beberapa menawarkan ACID multi-baris. Jika case-use Anda adalah stream single-key write maka Anda dapat berhasil. Dengan banyak bidang bisnis, penting untuk memiliki beberapa baris yang konsisten secara bersamaan sebelum melakukan perubahan.
Michael Green

Jawaban:

6

ASAM berarti

  • Atomicity
  • Konsistensi
  • Isolasi
  • Daya tahan

Apa artinya ini bagi Anda adalah "setiap tindakan tulis akan dilakukan hanya sekali (tidak ada catatan duplikat) tetapi akan sepenuhnya disimpan dalam database ketika tindakan dilakukan" dan bahwa setiap kali Anda membaca, Anda mendapatkan data yang Anda inginkan. .

Satu hal tentang database NoSQL adalah bahwa mereka sering didistribusikan (itulah yang diinginkan orang, sistem yang dapat diskalakan datar dan murah), yang berarti perlu waktu untuk mereplikasi data ke semua node. Kadang-kadang mungkin untuk membaca saat menulis dan berakhir dengan data lama saat data baru keluar.

Anda mengorbankan kemurnian untuk kecepatan.

Ini adalah versi singkat dari jawaban saya, dan saya tidak yakin apa yang perlu saya jelaskan lebih lanjut. Beri saya pertanyaan!

jcolebrand
sumber
1
Apa yang Anda gambarkan terdengar seperti konsistensi langsung (RDBMS) vs. konsistensi akhirnya (NoSQL). Namun, artikel yang ditautkan berbicara tentang kehilangan data (tidak hanya memiliki data yang tidak konsisten), dan saya tidak mengerti apa yang harus dilakukan kepatuhan ACID dengan kehilangan data.
del
1
Kemungkinan besar daya tahan. Dan itu masalahnya, itulah yang saya jelaskan (yang membuatnya tampak seperti data telah hilang). Intinya ACID adalah Anda tidak bisa kehilangan data. Pernah. (Yah, itu bisa hilang dari kerusakan)
jcolebrand
Semua database NoSQL yang pernah saya lihat (HBase, Cassandra, Redis) menggunakan log tulis-depan yang dapat diputar ulang jika database macet sebelum perubahan telah dilakukan. Apakah itu berarti kritik ini tidak berlaku untuk semua database ini?
del
Saya akan membayangkannya. Saya akan meninjau kembali ini besok, tetapi untuk sekarang, waktu tidur. Semoga Anda mendapatkan masukan lain selain dari saya sebelum itu ;-)
jcolebrand
6

Meskipun ini adalah pertanyaan lama ...

Singkatnya, Anda dapat memahami ACID sebagai jaminan integritas / keamanan data dalam kondisi apa pun yang diharapkan . Seperti dalam pemrograman generik, semua sakit kepala berasal dari multi-threading.

Masalah terbesar pada NoSQL sebagian besar adalah ACI. D (urability) biasanya merupakan masalah yang terpisah.

Jika DB Anda single-threaded - jadi hanya satu pengguna yang dapat mengakses sekaligus -, itu sesuai dengan ACI. Tapi saya yakin hampir tidak ada server yang dapat memiliki kemewahan ini.

Jika DB Anda perlu multi-utas - melayani beberapa pengguna / klien secara bersamaan - Anda harus membutuhkan transaksi yang sesuai dengan ACI. Atau Anda akan mendapatkan korupsi data diam-diam daripada kehilangan data sederhana. Yang jauh lebih mengerikan. Sederhananya, ini persis sama dengan pemrograman multi-threaded generik. Jika Anda tidak memiliki mekanisme yang tepat seperti kunci, Anda akan mendapatkan data yang tidak ditentukan. Dan mekanisme dalam DB disebut kepatuhan ACID sepenuhnya .

Banyak database YesSQL / NoSQL mengiklankan diri mereka sendiri yang kompatibel dengan ACID, tetapi sebenarnya, sangat sedikit dari mereka yang benar-benar melakukannya.

  • Tidak ada kepatuhan ACID = Anda akan selalu mendapatkan hasil yang tidak ditentukan dalam lingkungan multi-pengguna (klien). Saya bahkan tidak berpikir DB seperti apa yang melakukan ini.

  • Baris tunggal / kunci ACID compliant = Anda akan mendapatkan hasil yang dijamin jika Anda hanya mengubah satu nilai sekaligus. Tetapi hasil yang tidak terdefinisi (= korupsi data diam-diam) untuk pembaruan multi baris / kunci secara bersamaan. Sebagian besar DB NoSQL yang saat ini populer termasuk Cassandra, MongoDB, CouchDB, ... DB semacam ini hanya aman untuk transaksi baris tunggal. Jadi, Anda perlu menjamin bahwa logika DB Anda tidak akan menyentuh banyak baris dalam transaksi.

  • Kepatuhan multi baris / kunci ACID = Anda akan selalu mendapatkan hasil yang dijamin untuk operasi apa pun. Ini adalah persyaratan minimal sebagai RDBMS. Di bidang NoSQL, sangat sedikit dari mereka yang melakukan ini. Spanner, MarkLogic, VoltDB, FoundationDB. Saya bahkan tidak yakin ada lebih banyak solusi. DB semacam ini benar-benar segar dan baru, jadi sebagian besar tidak diketahui tentang kemampuan atau keterbatasan mereka.

Bagaimanapun, ini adalah perbandingan kecuali D (urability). Jadi jangan lupa untuk memeriksa atribut ketahanan juga. Sangat sulit untuk membandingkan daya tahan karena rentang menjadi terlalu lebar. Saya tidak tahu topik ini dengan baik ...

  • Tidak ada daya tahan. Anda akan kehilangan data kapan saja.

  • Disimpan dengan aman di disk. Ketika Anda dapatkan COMMIT OK, maka data dijamin pada disk. Anda kehilangan data jika disk rusak.

Juga, ada perbedaan bahkan pada DB yang sesuai dengan ACID.

  • Terkadang ACID compliant / Anda memerlukan konfigurasi / tidak ada sesuatu yang otomatis .. / beberapa komponen tidak ACID-complient / sangat cepat tetapi Anda perlu mematikan sesuatu untuk ini ... / ACID-compliant jika Anda menggunakan modul tertentu ... = kami tidak akan mengikat keamanan data secara default. Itu add-on, opsi atau penjualan terpisah. Jangan lupa mengunduh, memasang, mengatur, dan mengeluarkan perintah yang tepat. Bagaimanapun, keamanan data dapat diabaikan secara diam-diam. Lakukan sendiri. Periksa sendiri. Semoga beruntung tidak membuat kesalahan. Semua orang di tim Anda harus menjadi DBA sempurna untuk menggunakan DB jenis ini dengan aman. MySQL

  • Selalu mematuhi ACID = Kami tidak menukar keamanan data dengan kinerja atau apa pun. Keamanan data adalah paket paksa dengan paket DB ini. RDBMS paling komersial, PostgreSQL.

Di atas adalah implementasi khas DB. Namun tetap saja, kegagalan perangkat keras lainnya dapat merusak database. Seperti kesalahan memori, kesalahan saluran data, atau kesalahan lainnya yang mungkin terjadi. Jadi Anda perlu redundansi tambahan, dan DB berkualitas nyata harus menawarkan fitur toleransi kesalahan.

  • Tidak ada redundansi. Anda kehilangan semua data jika data Anda rusak.

  • Cadangkan. Anda membuat salinan / pengembalian foto. Anda kehilangan data setelah cadangan terakhir.

  • Cadangan online. Anda dapat melakukan backup snapshot saat database sedang berjalan.

  • Replikasi asinkron. Cadangkan untuk setiap detik (atau periode tertentu). Jika mesin mati, DB ini dijamin untuk mendapatkan kembali data hanya dengan me-reboot. Anda kehilangan data setelah detik terakhir.

  • Replikasi sinkron. Segera buat cadangan untuk setiap pembaruan data. Anda selalu memiliki salinan data asli yang tepat. Gunakan salinan jika asal rusak.

Sampai sekarang, saya melihat banyak implementasi DB kurang banyak. Dan saya pikir jika mereka tidak memiliki dukungan ACID dan redundansi yang tepat, pengguna pada akhirnya akan kehilangan data.

Eonil
sumber
5

"Itu tergantung" adalah jawabannya - ada opsi konfigurasi, yang disebutkan di sini .

Nitpick kecil: database bisa tahan lama tetapi tidak sesuai dengan ACID, karena ACID adalah superset fitur (ACID). Saya tidak berpikir basis data NoSQL dapat mengklaim sepenuhnya ACID, tetapi banyak dari mereka yang mengklaim lulus sub-persyaratan individual, seperti daya tahan.

Morgan Tocker
sumber