Atunci când volumul de date depășește capacitatea fizică a memoriei RAM a unui singur server sau debitul de scriere necesar întrece performanța unui singur fir CPU, soluția arhitecturală este Redis Cluster.
Redis Cluster implementează o arhitectură Shared-Nothing fără niciun nod central sau proxy intermediar obligatoriu: datele sunt partiționate automat între nodurile master, fiecare master având una sau mai multe replici pentru redundanță.
# În Redis Cluster, spațiul de chei este împărțit întotdeauna în exact 16.384 de sloturi:
# Slotul unei chei se calculează determinist:
# HASH_SLOT = CRC16(Cheie) MOD 16384
# EXEMPLU DE DISTRIBUIRE PE 3 MASTERI:
# - Nodul A (Master): deține sloturile 0 - 5460
# - Nodul B (Master): deține sloturile 5461 - 10922
# - Nodul C (Master): deține sloturile 10923 - 16383
# Inițializarea clusterului oficial din linia de comandă:
# Creăm un cluster cu 3 Masteri și 3 Replici (total 6 noduri):
redis-cli --cluster create \
10.0.0.1:7000 10.0.0.1:7001 \
10.0.0.2:7000 10.0.0.2:7001 \
10.0.0.3:7000 10.0.0.3:7001 \
--cluster-replicas 1
Tranzacții Multi-Key și Mecanismul Hash Tags
Într-un cluster distribuit, operațiunile care implică mai multe chei simultan (cum ar fi MGET, MSET, SUNION sau tranzacțiile MULTI/EXEC) sunt permise doar dacă toate cheile aparțin aceluiași Hash Slot. Dacă cheile cad pe sloturi diferite pe noduri diferite, Redis va arunca eroarea CROSSSLOT Keys in request don't hash to the same slot.
Pentru a forța maparea mai multor chei pe același slot fizic, folosim Hash Tags: includem o parte comună între acolade {...}. Redis va calcula algoritmul CRC16 exclusiv pe textul aflat între acolade:
# Fără Hash Tag (cheile pot cădea pe sloturi și noduri complet diferite):
SET utilizator:1001:profil "Date profil" # Slot 7812 (Nodul B)
SET utilizator:1001:comenzi "Date comenzi" # Slot 14210 (Nodul C) -> MGET va eșua!
# Cu Hash Tag (garantează alocarea pe EXACT același Hash Slot!):
SET {user:1001}:profil "Date profil" # CRC16 se calculează doar pentru 'user:1001' -> Slot 5310
SET {user:1001}:comenzi "Date comenzi" # Același slot 5310 (Nodul A)
# Acum operațiunile atomice multi-key funcționează perfect:
MGET {user:1001}:profil {user:1001}:comenzi
Redirecționările de Cluster: -MOVED vs. -ASK
| Eroare Protocol | Semnificație Tehnică | Acțiunea Clientului |
|---|---|---|
-MOVED 5310 10.0.0.2:7000 |
Slotul 5310 este deținut permanent de nodul 10.0.0.2. | Clientul actualizează cache-ul intern de sloturi și retrimite interogarea la noua adresă. |
-ASK 5310 10.0.0.2:7000 |
Slotul se află în curs de migrare (Resharding) între două noduri. | Clientul trimite comanda specială ASKING urmată de interogare către noul nod, fără a-și actualiza harta permanentă de sloturi. |