Kodeloka
  1. Kodeloka
  2. Kelas Redis
  3. Materi

Advanced ยท Modul 16 dari 21

Redis Cluster & Sharding Horizontal

Membagi data ke banyak node dengan 16.384 hash slot, memahami error CROSSSLOT dan MOVED, serta memakai hash tag untuk mengelompokkan key.

๐Ÿ“Œ Ringkasan Eksekutif Modul:
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

โš ๏ธ Jangan pakai Cluster kalau belum perlu

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.
๐Ÿ“Œ Pakai client sadar-cluster

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
๐Ÿšซ Hash tag yang terlalu luas = hot slot

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

redis.conf tiap node
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
Terminal
# 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
โš ๏ธ Minimal 3 master, dan replika itu wajib

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 SELECT tidak 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.
  • KEYS dan SCAN bersifat 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.