Redis Cluster membagi keyspace ke 16.384 hash slot yang dibagikan ke node-node master. Slot ditentukan dari CRC16 nama key. Operasi multi-key hanya boleh menyentuh key yang berada di slot yang sama, kalau tidak akan muncul error CROSSSLOT. Hash tag dengan kurung kurawal memaksa beberapa key jatuh ke slot yang sama. Client harus sadar-cluster untuk menangani redirect MOVED dan ASK.
1. Kapan Anda Benar-benar Butuh Cluster
Cluster menambah banyak batasan. Satu node Redis modern sanggup menangani puluhan ribu operasi per detik dan ratusan GB RAM. Pakai Cluster hanya bila: (a) data melebihi RAM satu mesin, atau (b) throughput tulis melebihi kemampuan satu node. Kalau yang Anda butuhkan cuma ketersediaan tinggi, Sentinel jauh lebih sederhana.
2. Hash Slot: 16.384 Kotak
Cluster tidak membagi berdasarkan node, melainkan berdasarkan slot. Rumusnya:
slot = CRC16(nama_key) mod 16384
Slot-slot itu lalu dibagi ke master:
Master A : slot 0 โ 5460 Master B : slot 5461 โ 10922 Master C : slot 10923 โ 16383
Lapisan slot inilah yang membuat penambahan node menjadi mudah: Anda memindahkan slot dari node lama ke node baru, dan pemetaan key tidak perlu dihitung ulang seperti pada hashing modulo biasa.
# Lihat slot sebuah key CLUSTER KEYSLOT pesanan:1001 # => 12735 CLUSTER INFO CLUSTER NODES CLUSTER SHARDS
3. Redirect MOVED dan ASK
# Client menghubungi node yang salah GET pesanan:1001 (error) MOVED 12735 10.0.0.3:6379 # Artinya: slot 12735 milik node 10.0.0.3. Silakan ke sana. # Selama slot sedang dipindahkan antar node: (error) ASK 12735 10.0.0.4:6379 # Artinya: untuk kali ini saja, coba ke node itu.
Client yang benar akan mengambil peta slot saat pertama terhubung, mengarahkan tiap perintah langsung ke node yang tepat, dan memperbarui petanya saat menerima MOVED. Kalau Anda memakai redis-cli, tambahkan flag -c agar ia mengikuti redirect otomatis.
redis-cli -c -h 10.0.0.1 -p 6379
4. Batasan Terbesar: Operasi Multi-Key
# Kedua key ini kemungkinan besar ada di slot berbeda MGET user:1 user:2 (error) CROSSSLOT Keys in request don't hash to the same slot
Ini berlaku untuk MGET, MSET, SINTER, SUNIONSTORE, RENAME, transaksi MULTI multi-key, dan skrip Lua yang menyentuh beberapa key.
5. Solusinya: Hash Tag
Bila nama key mengandung {...}, Redis hanya menghitung isi kurung kurawal itu untuk menentukan slot.
# Tanpa hash tag -- slot berbeda-beda
user:1:profil -> slot 5321
user:1:pengaturan -> slot 14002
# Dengan hash tag -- keduanya dihitung dari "user:1" saja
{user:1}:profil -> slot 8115
{user:1}:pengaturan -> slot 8115 <-- sama!
# Sekarang operasi multi-key jadi legal
MGET {user:1}:profil {user:1}:pengaturan
Godaan terbesarnya adalah memakai satu tag untuk terlalu banyak key, misal {aplikasi}:apa-pun. Akibatnya seluruh data jatuh ke satu slot di satu node โ Anda mendapat semua kerumitan Cluster tanpa satu pun manfaatnya. Tag harus sesempit mungkin: satu pengguna, satu penyewa, satu pesanan.
6. Membangun Cluster
port 6379 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
# 3 master + 3 replika (--cluster-replicas 1) redis-cli --cluster create \ 10.0.0.1:6379 10.0.0.2:6379 10.0.0.3:6379 \ 10.0.0.4:6379 10.0.0.5:6379 10.0.0.6:6379 \ --cluster-replicas 1 # Memeriksa kesehatan dan keseimbangan slot redis-cli --cluster check 10.0.0.1:6379 redis-cli --cluster info 10.0.0.1:6379 # Menambah node baru lalu menyeimbangkan ulang slot redis-cli --cluster add-node 10.0.0.7:6379 10.0.0.1:6379 redis-cli --cluster rebalance 10.0.0.1:6379
Cluster butuh mayoritas master untuk tetap melayani. Dengan 2 master, matinya satu node membuat cluster berhenti total. Tanpa replika, matinya satu master berarti slot miliknya tidak terlayani dan seluruh cluster menolak permintaan (kecuali cluster-require-full-coverage no diaktifkan, yang membuat cluster tetap melayani slot lain tetapi datanya tidak lengkap).
7. Hal Lain yang Berubah di Cluster
- Hanya database 0. Perintah
SELECTtidak berlaku โ kalau kode Anda memakai database 1โ15, itu harus diubah. - Pub/Sub disiarkan ke seluruh cluster dan bisa membebani jaringan. Sejak Redis 7 ada
SPUBLISH/SSUBSCRIBE(sharded pub/sub) yang membatasi siaran hanya ke shard terkait. KEYSdanSCANbersifat per-node. Untuk menyapu seluruh keyspace, Anda harus melakukannya ke setiap master satu per satu.- Skrip Lua wajib melewatkan semua key lewat KEYS dan seluruhnya harus berada di slot yang sama.