NoSQL mengacu pada penyimpanan data non-relasional yang tidak sesuai dengan riwayat basis data relasional dan jaminan ACID. Toko data NoSQL open source yang populer meliputi:
- Cassandra (tabel, ditulis dalam Java, digunakan oleh Cisco, WebEx, Digg, Facebook, IBM, Mahalo, Rackspace, Reddit dan Twitter)
- CouchDB (dokumen, ditulis dalam bahasa Erlang, digunakan oleh BBC dan Engine Yard)
- Dynomite (nilai kunci, ditulis dalam bahasa Erlang, digunakan oleh Powerset)
- HBase (nilai kunci, ditulis dalam Java, digunakan oleh Bing)
- Hypertable (tabel, ditulis dalam C ++, digunakan oleh Baidu)
- Kai (nilai kunci, ditulis dalam bahasa Erlang)
- MemcacheDB (nilai kunci, ditulis dalam C, digunakan oleh Reddit)
- MongoDB (dokumen, ditulis dalam C ++, digunakan oleh Electronic Arts, Github, NY Times dan Sourceforge)
- Neo4j (grafik, ditulis dalam bahasa Jawa, digunakan oleh beberapa universitas Swedia)
- Project Voldemort (nilai kunci, ditulis dalam Java, digunakan oleh LinkedIn)
- Redis (nilai kunci, ditulis dalam C, digunakan oleh Craigslist, Engine Yard, dan Github)
- Riak (nilai kunci, ditulis dalam bahasa Erlang, digunakan oleh Comcast dan Mochi Media)
- Ringo (nilai kunci, ditulis dalam bahasa Erlang, digunakan oleh Nokia)
- Scalaris (nilai kunci, ditulis dalam bahasa Erlang, digunakan oleh OnScale)
- Terrastore (dokumen, ditulis dalam bahasa Jawa)
- ThruDB (dokumen, ditulis dalam C ++, digunakan oleh JunkDepot.com)
- Tokyo Cabinet / Tokyo Tyrant (nilai kunci, ditulis dalam C, digunakan oleh Mixi.jp (situs jejaring sosial Jepang))
Saya ingin tahu tentang masalah khusus Anda - pembaca SO - telah dipecahkan menggunakan penyimpanan data dan penyimpanan data NoSQL apa yang Anda gunakan.
Pertanyaan:
- Masalah skalabilitas apa yang Anda gunakan untuk menyelesaikan penyimpanan data NoSQL?
- Penyimpanan data NoSQL apa yang Anda gunakan?
- Database apa yang Anda gunakan sebelum beralih ke penyimpanan data NoSQL?
Saya mencari pengalaman langsung, jadi tolong jangan menjawab kecuali Anda memilikinya.
Jawaban:
Saya telah mengalihkan sub proyek kecil dari MySQL ke CouchDB, untuk dapat menangani beban. Hasilnya luar biasa.
Sekitar 2 tahun yang lalu, kami telah merilis perangkat lunak yang ditulis sendiri di http://www.ubuntuusers.de/ (yang mungkin merupakan situs web komunitas Linux Jerman terbesar). Situs ini ditulis dalam Python dan kami telah menambahkan middleware WSGI yang dapat menangkap semua pengecualian dan mengirimkannya ke situs web kecil bertenaga MySQL lainnya. Situs web kecil ini menggunakan hash untuk menentukan bug yang berbeda dan menyimpan jumlah kejadian dan kejadian terakhir juga.
Sayangnya, tak lama setelah rilis, situs web traceback-logger tidak merespons lagi. Kami memiliki beberapa masalah penguncian dengan db produksi situs utama kami yang melemparkan pengecualian hampir setiap permintaan, serta beberapa bug lainnya, yang belum kami eksplorasi selama tahap pengujian. Cluster server situs utama kami, yang disebut traceback-logger submit page beberapa k kali per detik. Dan itu terlalu banyak untuk server kecil yang meng-host traceback logger (itu sudah server lama, yang hanya digunakan untuk tujuan pengembangan).
Pada saat ini CouchDB agak populer, jadi saya memutuskan untuk mencobanya dan menulis traceback-logger kecil dengannya. Logger baru hanya terdiri dari satu file python, yang menyediakan daftar bug dengan opsi penyortiran dan filter serta halaman kirim. Dan di latar belakang saya sudah memulai proses CouchDB. Perangkat lunak baru merespons sangat cepat untuk semua permintaan dan kami dapat melihat laporan bug otomatis dalam jumlah besar.
Satu hal yang menarik adalah, bahwa solusi sebelumnya, berjalan pada server khusus yang lama, di mana situs berbasis CouchDB baru di sisi lain hanya berjalan pada instance xen bersama dengan sumber daya yang sangat terbatas. Dan saya bahkan belum menggunakan kekuatan dari penyimpanan nilai kunci untuk mengukur secara horizontal. Kemampuan CouchDB / Erlang OTP untuk menangani permintaan bersamaan tanpa mengunci apa pun sudah cukup untuk melayani kebutuhan.
Sekarang, logger CouchDB-traceback yang ditulis dengan cepat masih berjalan dan merupakan cara yang bermanfaat untuk menjelajahi bug di situs web utama. Bagaimanapun, sekitar sebulan sekali database menjadi terlalu besar dan proses CouchDB terbunuh. Tapi kemudian, perintah compact-db dari CouchDB mengurangi ukuran dari beberapa GB menjadi beberapa KB lagi dan basis data sudah naik dan berjalan kembali (mungkin saya harus mempertimbangkan untuk menambahkan cronjob di sana ... 0o).
Dalam ringkasan, CouchDB jelas merupakan pilihan terbaik (atau setidaknya pilihan yang lebih baik daripada MySQL) untuk sub proyek ini dan melakukan tugasnya dengan baik.
sumber
Proyek saya saat ini sebenarnya.
Menyimpan 18.000 objek dalam struktur yang dinormalisasi: 90.000 baris di 8 tabel berbeda. Butuh waktu 1 menit untuk mengambil dan memetakannya ke model objek Java kami, semuanya sudah diindeks dengan benar, dll.
Menyimpannya sebagai pasangan kunci / nilai menggunakan representasi teks ringan: 1 tabel, 18.000 baris, 3 detik untuk mengambil semuanya dan merekonstruksi objek Java.
Dalam istilah bisnis: opsi pertama tidak layak. Opsi kedua berarti aplikasi kami berfungsi.
Detail teknologi: berjalan di MySQL untuk SQL dan NoSQL! Tetap menggunakan MySQL untuk mendukung transaksi yang baik, kinerja, dan rekam jejak yang terbukti untuk tidak merusak data, penskalaan yang cukup baik, dukungan untuk pengelompokan dll.
Model data kami di MySQL sekarang hanya bidang kunci (bilangan bulat) dan bidang "nilai" besar: pada dasarnya hanya bidang TEKS besar.
Kami tidak mengikuti salah satu pemain baru (CouchDB, Cassandra, MongoDB, dll) karena meskipun mereka masing-masing menawarkan fitur / kinerja hebat dalam hak mereka sendiri, selalu ada kekurangan untuk keadaan kita (mis. Dukungan Java yang hilang / belum matang).
Manfaat ekstra dari (ab) menggunakan MySQL - bit dari model kami yang melakukan pekerjaan secara relasional dapat dengan mudah dihubungkan ke data penyimpanan kunci / nilai kami.
Pembaruan: inilah contoh bagaimana kami merepresentasikan konten teks, bukan domain bisnis kami yang sebenarnya (kami tidak bekerja dengan "produk") karena bos saya akan menembak saya, tetapi menyampaikan gagasannya, termasuk aspek rekursif (satu entitas, disini suatu produk, "mengandung" orang lain). Mudah-mudahan sudah jelas bagaimana dalam struktur yang dinormalisasi ini bisa menjadi beberapa tabel, misalnya bergabung dengan produk dengan berbagai rasa, yang terkandung produk lain, dll
sumber
Highscalability.com Todd Hoff memiliki banyak cakupan NoSQL, termasuk beberapa studi kasus.
DBMS kolom Vertica komersial mungkin sesuai dengan tujuan Anda (meskipun mendukung SQL): sangat cepat dibandingkan dengan DBMS relasional tradisional untuk kueri analitik. Lihat Stonebraker, kertas CACM baru - baru ini membandingkan Vertica dengan pengurangan peta.
Pembaruan: Dan Cassandra yang dipilih Twitter atas beberapa yang lain, termasuk HBase, Voldemort, MongoDB, MemcacheDB, Redis, dan HyperTable.
Pembaruan 2: Rick Cattell baru saja menerbitkan perbandingan beberapa sistem NoSQL di Toko Data Kinerja Tinggi . Dan highscalability.com mengambil kertas Rick ada di sini .
sumber
Kami memindahkan sebagian data kami dari mysql ke mongodb, bukan untuk skalabilitas tetapi lebih karena lebih cocok untuk file dan data non-tabular.
Dalam produksi kami saat ini menyimpan:
dengan omset harian sekitar 10GB.
Basis data ditempatkan dalam konfigurasi "berpasangan" pada dua node (6x450GB sas raid10) dengan klien apache / wsgi / python menggunakan mongodb python api (pymongo). Pengaturan disk mungkin berlebihan tetapi itulah yang kami gunakan untuk mysql.
Terlepas dari beberapa masalah dengan pymongo threadpools dan sifat pemblokiran server mongodb, ini merupakan pengalaman yang baik.
sumber
Saya minta maaf karena melanggar teks tebal Anda, karena saya tidak memiliki pengalaman langsung, tetapi serangkaian posting blog ini adalah contoh yang baik untuk menyelesaikan masalah dengan CouchDB.
CouchDB: Studi Kasus
Pada dasarnya, aplikasi textme menggunakan CouchDB untuk menangani masalah data yang meledak. Mereka menemukan bahwa SQL terlalu lambat untuk menangani sejumlah besar data arsip, dan memindahkannya ke CouchDB. Ini adalah bacaan yang sangat baik, dan ia membahas seluruh proses mencari tahu masalah apa yang bisa diselesaikan CouchDB dan bagaimana mereka akhirnya menyelesaikannya.
sumber
Kami telah memindahkan beberapa data yang kami gunakan untuk menyimpan di Postgresql dan Memcached ke Redis . Toko nilai utama jauh lebih cocok untuk menyimpan data objek hierarkis. Anda dapat menyimpan data gumpalan jauh lebih cepat dan dengan waktu dan usaha pengembangan yang jauh lebih sedikit daripada menggunakan ORM untuk memetakan gumpalan Anda ke RDBMS.
Saya memiliki klien open source c # redis yang memungkinkan Anda menyimpan dan mengambil objek POCO dengan 1 baris:
Toko nilai utama juga jauh lebih mudah untuk 'ditingkatkan' karena Anda dapat menambahkan server baru dan kemudian mempartisi beban Anda secara merata untuk memasukkan server baru. Yang penting, tidak ada server pusat yang akan membatasi skalabilitas Anda. (meskipun Anda masih memerlukan strategi untuk hashing yang konsisten untuk mendistribusikan permintaan Anda).
Saya menganggap Redis sebagai 'file teks terkelola' pada steroid yang menyediakan akses cepat, konkuren dan atom untuk banyak klien, jadi apa pun yang saya gunakan untuk menggunakan file teks atau basis data tertanam untuk saya sekarang menggunakan Redis. mis. Untuk mendapatkan log kesalahan bergulir gabungan waktu-nyata untuk semua layanan kami (yang terkenal merupakan tugas yang sulit bagi kami), sekarang diselesaikan dengan hanya beberapa baris dengan hanya menunggu kesalahan di daftar sisi server Redis dan kemudian memangkas daftar sehingga hanya 1000 yang terakhir disimpan, misalnya:
sumber
Saya tidak punya pengalaman langsung, tetapi saya menemukan entri blog ini cukup menarik.
sumber
Saya menemukan upaya untuk memetakan objek domain perangkat lunak (misalnya aSalesOrder, aCustomer ...) ke basis data relasional dua dimensi (baris dan kolom) membutuhkan banyak kode untuk menyimpan / memperbarui dan kemudian lagi untuk membuat instance objek domain dari beberapa tabel . Belum lagi hit kinerja memiliki semua bergabung, semua disk membaca ... hanya untuk melihat / memanipulasi objek domain seperti pesanan penjualan atau catatan pelanggan.
Kami telah beralih ke Object Database Management Systems (ODBMS). Mereka berada di luar kemampuan sistem noSQL yang terdaftar. The GemStone / S (untuk Smalltalk) adalah contoh seperti itu. Ada solusi ODBMS lain yang memiliki driver untuk banyak bahasa. Manfaat utama bagi pengembang, hierarki kelas Anda secara otomatis adalah skema basis data, subkelas, dan semuanya. Cukup gunakan bahasa berorientasi objek Anda untuk membuat objek bertahan ke database. Sistem ODBMS memberikan integritas transaksi tingkat ACID, sehingga itu juga akan berfungsi dalam sistem keuangan.
sumber
Saya beralih dari MySQL (InnoDB) ke cassandra untuk sistem M2M, yang pada dasarnya menyimpan sensor rangkaian waktu untuk setiap perangkat. Setiap data diindeks oleh (device_id, date) dan (device_id, type_of_sensor, date). Versi MySQL berisi 20 juta baris.
MySQL:
Cassandra:
Catatan: Saya juga menggunakan elasticsearch (berorientasi pada dokumen berdasarkan lucene) dan saya pikir itu harus dianggap sebagai basis data NoSQL. Ini didistribusikan, dapat diandalkan dan seringkali cepat (beberapa permintaan kompleks dapat berkinerja sangat buruk).
sumber
Bukan saya. Saya ingin menggunakan toko nilai kunci sederhana dan gratis yang dapat saya hubungi dalam proses tetapi hal seperti itu tidak ada afaik pada platform Windows. Sekarang saya menggunakan Sqlite tetapi saya ingin menggunakan sesuatu seperti Kabinet Tokyo. BerkeleyDB memiliki lisensi "masalah".
Namun jika Anda ingin menggunakan OS Windows pilihan Anda dari database NoSQL terbatas. Dan tidak selalu ada penyedia C #
Saya memang mencoba MongoDB dan itu 40 kali lebih cepat dari Sqlite, jadi mungkin saya harus menggunakannya. Tapi saya masih berharap untuk solusi proses yang sederhana.
sumber
Saya menggunakan redis untuk menyimpan pesan logging di mesin. Itu sangat mudah diimplementasikan, dan sangat berguna. Redis benar-benar batu
sumber
Kami mengganti database postgres dengan database dokumen CouchDB karena tidak memiliki skema tetap adalah keuntungan yang kuat bagi kami. Setiap dokumen memiliki sejumlah variabel indeks yang digunakan untuk mengakses dokumen itu.
sumber
Saya telah menggunakan Couchbase di masa lalu dan kami menemui masalah penyeimbangan dan sejumlah masalah lainnya. Saat ini saya menggunakan Redis di beberapa proyek produksi. Saya menggunakan redislabs.com yang merupakan layanan terkelola untuk Redis yang menangani penskalaan kluster Redis Anda. Saya telah menerbitkan video tentang kegigihan objek di blog saya di http://thomasjaeger.wordpress.com yang menunjukkan cara menggunakan Redis dalam model penyedia dan cara menyimpan objek C # ke Redis. Lihatlah.
sumber
Saya akan mendorong siapa pun yang membaca ini untuk mencoba Couchbase sekali lagi sekarang 3.0 sudah di luar pintu. Ada lebih dari 200 fitur baru untuk pemula. Kinerja, ketersediaan, skalabilitas, dan fitur manajemen yang mudah dari Couchbase Server menjadikannya basis data yang sangat fleksibel dan sangat tersedia. UI manajemen adalah bawaan dan API secara otomatis menemukan node cluster sehingga tidak perlu penyeimbang beban dari aplikasi ke DB. Meskipun kami tidak memiliki layanan terkelola saat ini, Anda dapat menjalankan couchbase pada hal-hal seperti AWS, RedHat Gears, Cloudera, Rackspace, Wadah Docker seperti CloudSoft, dan banyak lagi. Mengenai penyeimbangan kembali itu tergantung pada apa yang Anda maksud secara spesifik tetapi Couchbase tidak secara otomatis menyeimbangkan kembali setelah kegagalan simpul, seperti yang dirancang, tetapi seorang administrator dapat mengatur failover otomatis untuk kegagalan simpul pertama dan menggunakan API kami, Anda juga dapat memperoleh akses ke vbuckets replika untuk membaca sebelum membuatnya aktif atau menggunakan RestAPI, Anda dapat menerapkan failover dengan alat pemantauan. Ini adalah kasus khusus tetapi mungkin dilakukan.
Kita cenderung untuk tidak menyeimbangkan kembali dalam hampir semua mode apa pun kecuali node benar-benar offline dan tidak pernah kembali atau node baru siap untuk diseimbangkan secara otomatis. Berikut adalah beberapa panduan untuk membantu siapa saja yang tertarik melihat apa salah satu dari database NoSQL yang paling berkinerja tinggi.
Terakhir, saya juga mendorong Anda untuk memeriksa N1QL untuk kueri terdistribusi:
Terima kasih telah membaca dan beri tahu saya atau orang lain jika Anda membutuhkan lebih banyak bantuan!
Austin
sumber
Saya telah menggunakan Vertica di masa lalu. Ini bergantung pada kompresi kolom & mempercepat disk membaca dan menurunkan kebutuhan penyimpanan untuk memaksimalkan perangkat keras Anda. Pemuatan data yang lebih cepat dan konkurensi yang lebih tinggi memungkinkan Anda menyajikan data analitik kepada lebih banyak pengguna dengan latensi minimum.
Sebelumnya, kami meminta database Oracle yang memiliki milyaran catatan & kinerjanya sangat tidak optimal. Permintaan membutuhkan 8 hingga 12 untuk dijalankan, bahkan setelah dioptimalkan dengan SSD. Karenanya, kami merasa perlu menggunakan basis data analitik yang dioptimalkan untuk membaca yang lebih cepat. Dengan Vertica Clusters di belakang lapisan lean service, kami dapat menjalankan API dengan kinerja sub-detik.
Vertica menyimpan data dalam proyeksi dalam format yang mengoptimalkan eksekusi query. Mirip dengan pandangan terwujud, proyeksi menyimpan set hasil pada disk atau SSD daripada menghitungnya setiap kali digunakan dalam kueri. Proyeksi memberikan manfaat berikut:
Vertica mengoptimalkan database dengan mendistribusikan data lintas cluster menggunakan Segmentasi.
Untuk lebih lanjut, silakan merujuk ke dokumentasi Vertica @ https://www.vertica.com/knowledgebase/
sumber