Redis Cluster — konfiguracja 6 węzłów, hash slots, sharding i failover
Opublikowano: 9 kwietnia 2026 · Kategoria: VPS / Bazy danych
Pojedyncza instancja Redis ma limit: jeden rdzeń CPU, pojemność RAM jednego serwera i zero odporności na awarie. Redis Cluster rozwiązuje te problemy przez sharding danych na wiele masterów i automatyczny failover przez repliki. W tym przewodniku postawisz klaster 6 węzłów (3 master + 3 replica) na jednym lub wielu serwerach, skonfigurujesz hash sloty i przetestujesz automatyczne przełączanie awaryjne.
Architektura Redis Cluster
Redis Cluster używa dwóch portów per węzeł: standardowego portu klienta (np. 7001) i portu komunikacji między węzłami (port klienta + 10000, np. 17001). Komunikacja klastrowa używa binarnego protokołu gossip — każdy węzeł wie o stanie wszystkich pozostałych.
| Węzeł | Rola | Port klienta | Port klastra | Hash slots |
|---|---|---|---|---|
| node-1 | Master 1 | 7001 | 17001 | 0–5460 |
| node-2 | Master 2 | 7002 | 17002 | 5461–10922 |
| node-3 | Master 3 | 7003 | 17003 | 10923–16383 |
| node-4 | Replica → Master 1 | 7004 | 17004 | – |
| node-5 | Replica → Master 2 | 7005 | 17005 | – |
| node-6 | Replica → Master 3 | 7006 | 17006 | – |
Instalacja Redis i struktura katalogów
# Ubuntu 22.04 / Debian 12
sudo apt update
sudo apt install -y redis-server
# Sprawdź wersję (wymagana 3.0+, zalecana 7.x)
redis-server --version
# Utwórz katalogi per węzeł
for port in 7001 7002 7003 7004 7005 7006; do
sudo mkdir -p /etc/redis/cluster/${port}
sudo mkdir -p /var/lib/redis/${port}
done Pliki konfiguracyjne węzłów
Utwórz plik konfiguracyjny dla każdego węzła. Poniższy skrypt generuje konfiguracje dla portów 7001–7006:
#!/bin/bash
# gen-cluster-configs.sh
for port in 7001 7002 7003 7004 7005 7006; do
cat > /etc/redis/cluster/${port}/redis.conf <<EOF
# Podstawowe ustawienia
port ${port}
bind 127.0.0.1
daemonize yes
pidfile /var/run/redis/redis-${port}.pid
logfile /var/log/redis/redis-${port}.log
dir /var/lib/redis/${port}
# Klaster
cluster-enabled yes
cluster-config-file /etc/redis/cluster/${port}/nodes.conf
cluster-node-timeout 5000
# Persistence (opcjonalna, dla dev możesz wyłączyć)
appendonly yes
appendfilename "appendonly-${port}.aof"
# Hasło (opcjonalne, zalecane na produkcji)
# requirepass TwojeHaslo
# masterauth TwojeHaslo
EOF
echo "Wygenerowano konfigurację dla portu ${port}"
done sudo bash gen-cluster-configs.sh
# Utwórz katalog na logi
sudo mkdir -p /var/log/redis
# Uruchom wszystkie 6 węzłów
for port in 7001 7002 7003 7004 7005 7006; do
redis-server /etc/redis/cluster/${port}/redis.conf
done
# Sprawdź czy nasłuchują
ss -tlnp | grep redis Tworzenie klastra — CLUSTER MEET i przypisanie slotów
Narzędzie redis-cli --cluster create automatycznie łączy węzły i rozdziela hash slots:
# --cluster-replicas 1 = 1 replika per master # Kolejność: mastery PIERWSZE, repliki PO redis-cli --cluster create \ 127.0.0.1:7001 \ 127.0.0.1:7002 \ 127.0.0.1:7003 \ 127.0.0.1:7004 \ 127.0.0.1:7005 \ 127.0.0.1:7006 \ --cluster-replicas 1 # Potwierdź "yes" gdy narzędzie wyświetli plan # Sprawdź stan klastra redis-cli -p 7001 cluster info redis-cli -p 7001 cluster nodes
Podstawowe operacje i hashtagi
Klient redis-cli w trybie cluster używa flagi -c — automatycznie przekierowuje komendy
do właściwego węzła (MOVED redirect):
# -c = cluster mode (automatyczne przekierowania)
redis-cli -c -p 7001
# Ustaw klucze — klaster automatycznie wybierze właściwy shard
SET user:1:name "Jan Kowalski"
SET user:2:name "Anna Nowak"
GET user:1:name
# Hashtagi — wymuszają ten sam slot dla wielu kluczy
# {user:1} to hashtag — CRC16 liczy TYLKO wartość w nawiasach
SET {user:1}:name "Jan"
SET {user:1}:email "[email protected]"
SET {user:1}:age 30
# Wszystkie 3 klucze trafią do tego samego slotu!
# Sprawdź do którego slotu trafia klucz
redis-cli -p 7001 cluster keyslot "user:1:name"
redis-cli -p 7001 cluster keyslot "{user:1}:email" Resharding — przenoszenie hash slotów
Dodajesz nowy węzeł lub równoważysz obciążenie? Przenieś hash sloty między masterami bez przestoju:
# Sprawdź ID węzłów redis-cli -p 7001 cluster nodes # Przenieś 1000 slotów z mastera (ID: abc123) do innego (ID: def456) redis-cli --cluster reshard 127.0.0.1:7001 \ --cluster-from abc123 \ --cluster-to def456 \ --cluster-slots 1000 \ --cluster-yes # Sprawdź rozkład slotów po reshard redis-cli --cluster check 127.0.0.1:7001 # Automatyczne rebalansowanie (równa dystrybucja) redis-cli --cluster rebalance 127.0.0.1:7001 --cluster-use-empty-masters
Test failover — symulacja awarii mastera
# Sprawdź aktualny stan klastra redis-cli -p 7001 cluster nodes | grep master # Zasymuluj awarię mastera na porcie 7001 redis-cli -p 7001 DEBUG SLEEP 30 # lub zabij proces: # redis-cli -p 7001 shutdown nosave # W innym terminalu — obserwuj failover watch -n 1 "redis-cli -p 7002 cluster nodes" # Po ~15s replika (port 7004) powinna stać się masterem # Po przywróceniu węzła 7001 — stanie się repliką # Manualny failover (graceful, bez utraty danych) redis-cli -p 7004 cluster failover