Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Zookeeper vs In-memory-data-grid vs Redis

https://zookeeper.apache.org/doc/current/zookeeperOver.html

Secara default, Zookeeper mereplikasi semua data Anda ke setiap node dan memungkinkan klien melihat data untuk perubahan. Perubahan dikirim dengan sangat cepat (dalam waktu terbatas) ke klien. Anda juga dapat membuat "node ephemeral", yang dihapus dalam waktu tertentu jika klien terputus. ZooKeeper sangat dioptimalkan untuk membaca , sedangkan penulisan sangat lambat (karena umumnya dikirim ke setiap klien segera setelah penulisan dilakukan). Terakhir, ukuran maksimum "file" (znode) di Zookeeper adalah 1 MB, tetapi biasanya berupa string tunggal.

Secara keseluruhan, ini berarti bahwa zookeeper tidak dimaksudkan untuk menyimpan banyak data, dan jelas bukan cache. Alih-alih, ini untuk mengelola detak jantung/mengetahui server apa yang sedang online, menyimpan/memperbarui konfigurasi, dan mungkin meneruskan pesan (meskipun jika Anda memiliki #s pesan yang besar atau permintaan throughput yang tinggi, sesuatu seperti RabbitMQ akan jauh lebih baik untuk tugas ini).

Pada dasarnya, ZooKeeper (dan Kurator, yang dibangun di atasnya) membantu menangani mekanisme pengelompokan -- detak jantung, mendistribusikan pembaruan/konfigurasi, kunci terdistribusi, dll.

Ini tidak benar-benar sebanding dengan Redis, tetapi untuk pertanyaan spesifik...

  1. Itu tidak mendukung komputasi apa pun dan untuk sebagian besar kumpulan data, tidak akan dapat menyimpan data dengan kinerja apa pun.

  2. Ini direplikasi ke semua node di cluster (tidak ada clustering Redis di mana data dapat didistribusikan). Semua pesan diproses secara atomik secara penuh dan diurutkan, sehingga tidak ada transaksi nyata. Ini dapat DIGUNAKAN untuk menerapkan kunci seluruh cluster untuk layanan Anda (sebenarnya sangat bagus untuk itu), dan ada banyak penguncian primitif pada znode itu sendiri untuk mengontrol node mana yang mengaksesnya.

  3. Tentu, tetapi ZooKeeper mengisi ceruk. Ini adalah alat untuk membuat aplikasi terdistribusi bermain bagus dengan banyak instance, bukan untuk menyimpan/berbagi data dalam jumlah besar. Dibandingkan dengan menggunakan IMDG untuk tujuan ini, Zookeeper akan lebih cepat, mengelola detak jantung dan sinkronisasi dengan cara yang dapat diprediksi (dengan banyak API untuk mempermudah bagian ini), dan memiliki paradigma "dorong" alih-alih "tarik" sehingga node diberitahu dengan sangat cepat tentang perubahan.

Kutipan dari pertanyaan terkait...

Contoh kanonik penggunaan Zookeeper adalah komputasi memori terdistribusi

... adalah, IMO, agak menyesatkan. Anda akan menggunakannya untuk mengatur perhitungan, bukan menyediakan data. Misalnya, Anda harus memproses baris 1-100 dari sebuah tabel. Anda dapat memasang 10 ZK node, dengan nama seperti "1-10", "11-20", "21-30", dll. Aplikasi klien akan diberitahu tentang perubahan ini secara otomatis oleh ZK, dan yang pertama akan mengambil " 1-10" dan setel simpul fana clients/192.168.77.66/processing/rows_1_10

Aplikasi berikutnya akan melihat ini dan pergi ke grup berikutnya untuk diproses. Data aktual yang akan dihitung akan disimpan di tempat lain (yaitu Redis, database SQL, dll). Jika node gagal di tengah proses komputasi, node lain dapat melihat ini (setelah 30-60 detik) dan mengambil pekerjaan lagi.

Saya akan mengatakan contoh kanonik ZooKeeper adalah pemilihan pemimpin. Katakanlah Anda memiliki 3 node -- satu adalah master dan 2 lainnya adalah slave. Jika master turun, node budak harus menjadi pemimpin baru. Jenis hal ini sangat cocok untuk ZK.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis sentinel vs pengelompokan

  2. cara mengkonfigurasi ttl yang berbeda untuk setiap cache redis saat menggunakan @cacheable di springboot2.0

  3. Konvensi penamaan kunci redis?

  4. Redis wildcard menghapus skrip menggunakan EVAL, SCAN, dan DEL mengembalikan perintah Tulis tidak diizinkan setelah perintah non-deterministik

  5. Bagaimana cara memeriksa apakah redis berjalan sebelum saya memulai flask (dan memulainya jika tidak)?