Operações distribuídas e concorrência

Sharding e particionamento

Entenda Redis Cluster, hash slots, resharding, consistent hashing e estratégias de particionamento para escalar horizontalmente.

Avançado 30 min 25 pontos Leitura 0%

Nesta aula você vai

  • Compreender o modelo de hash slots do Redis Cluster
  • Configurar e operar um cluster com sharding automático
  • Aplicar estratégias de particionamento para evitar hot spots

Sharding e particionamento

Objetivos

Nesta aula você vai:

  • Compreender o modelo de 16384 hash slots do Redis Cluster
  • Configurar e operar sharding horizontal com Redis Cluster
  • Aplicar estratégias de design de chaves para distribuição uniforme

Conteúdo

Quando um volume não cabe em um capítulo

Há histórias que excedem um único volume. Quando o dataset de um Redis ultrapassa a RAM de um servidor, ou quando o throughput de um único thread não sustenta a carga, é hora de particionar — dividir os dados entre múltiplos nós, cada um responsável por um fragmento do todo.

Sharding é a arte de distribuir o enredo entre múltiplos narradores, garantindo que cada leitor encontre seu capítulo no nó certo.

Redis Cluster: hash slots

Redis Cluster divide o keyspace em 16384 hash slots. Cada chave é mapeada a um slot via:

slot = CRC16(chave) mod 16384
┌─────────────────────────────────────────────────────┐
│              16384 Hash Slots                        │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │ Slots    │  │ Slots    │  │ Slots    │          │
│  │ 0-5460   │  │ 5461-    │  │ 10923-   │          │
│  │          │  │ 10922    │  │ 16383    │          │
│  │ Master A │  │ Master B │  │ Master C │          │
│  │ +Replica │  │ +Replica │  │ +Replica │          │
│  └──────────┘  └──────────┘  └──────────┘          │
└─────────────────────────────────────────────────────┘
# Verificar em qual slot uma chave cai
redis-cli CLUSTER KEYSLOT usuario:42
# 12345

# Verificar qual nó possui o slot
redis-cli CLUSTER NODES
# Nó responsável pelo slot 12345

Hash tags: co-localização de chaves

Chaves que precisam estar no mesmo nó (ex.: para operações multi-key) usam hash tags:

# Sem hash tag: chaves em slots diferentes
SET usuario:42:nome "Ana"
SET usuario:42:email "ana@exemplo.com"
# CLUSTER KEYSLOT → slots diferentes

# Com hash tag {42}: ambas no mesmo slot
SET usuario:{42}:nome "Ana"
SET usuario:{42}:email "ana@exemplo.com"
# CRC16 calculado apenas sobre "42" → mesmo slot

# Operação multi-key agora funciona no cluster
MGET usuario:{42}:nome usuario:{42}:email

Regra: use {tag} na chave quando precisar de operações multi-key ou transações no mesmo nó.

Configurando Redis Cluster

# Criar cluster com 3 masters + 3 replicas
redis-cli --cluster create \
  node1:6379 node2:6379 node3:6379 \
  node4:6379 node5:6379 node6:6379 \
  --cluster-replicas 1

# Verificar estado
redis-cli --cluster check node1:6379

# Informações do cluster
redis-cli -c CLUSTER INFO
# cluster_state:ok
# cluster_slots_assigned:16384
# cluster_known_nodes:6

O flag -c (cluster mode) no redis-cli segue redirecionamentos MOVED/ASK automaticamente.

Redirecionamentos: MOVED e ASK

Quando um cliente acessa chave no slot errado, o cluster responde:

# Cliente conecta ao nó A, pede chave no slot do nó B
redis-cli -h nodeA GET usuario:99
# (error) MOVED 12345 nodeB:6379

# Com -c, redis-cli segue automaticamente
redis-cli -c -h nodeA GET usuario:99
# "valor"
Resposta Significado
MOVED Slot permanentemente em outro nó (resharding completo)
ASK Slot em migração temporária (resharding em andamento)

Resharding: adicionar nós sem downtime

# Adicionar novo master ao cluster
redis-cli --cluster add-node new-node:6379 existing-node:6379

# Rebalancear slots para o novo nó
redis-cli --cluster rebalance new-node:6379 --cluster-weight new-node=1

# Migrar slots específicos manualmente
redis-cli --cluster reshard node1:6379 \
  --cluster-from node1 \
  --cluster-to new-node \
  --cluster-slots 100 \
  --cluster-yes

Durante resharding, o cluster permanece operacional — clientes recebem ASK para chaves em migração.

Consistent hashing: a teoria por trás

Antes do Redis Cluster, clientes implementavam sharding com consistent hashing:

Chave → hash(chave) → posição no anel → nó responsável

     Nó A
    ╱      ╲
   ╱  anel   ╲
  │  hash    │
   ╲  ring   ╱
    ╲      ╱
     Nó B

Adicionar Nó C: apenas ~1/N das chaves remapeiam
(vs hash simples: quase todas remapeiam)
Abordagem Remapeamento ao adicionar nó Gerenciamento
Hash simples (hash % N) Quase 100% das chaves Cliente
Consistent hashing ~1/N das chaves Cliente (libmemcached)
Redis Cluster (hash slots) Slots migrados incrementalmente Servidor

Estratégias de design de chaves

Padrão Exemplo Distribuição
ID numérico sequencial pedido:1, pedido:2 Uniforme (CRC16)
ID com prefixo comum tenant:acme:pedido:1 Uniforme
Hot key sem sharding contador:global Ruim — um slot
Hot key com sharding contador:global:{0} ... {15} Boa — 16 slots
Hash tag para co-localização carrinho:{user42}:itens Intencional — um slot
# Verificar distribuição de slots (amostragem)
for i in $(seq 1 1000); do
  redis-cli CLUSTER KEYSLOT "usuario:$i" 2>/dev/null
done | sort | uniq -c | sort -rn | head

Limitações do Redis Cluster

Limitação Impacto Workaround
Sem operações multi-key cross-slot MGET/MSET limitados Hash tags
Sem JOIN entre chaves Design de dados Desnormalizar
Sem transações cross-slot MULTI/EXEC limitado Hash tags ou Lua
Mínimo 3 masters Custo mínimo Redis Sentinel para HA menor
Resharding manual Operação planejada Automatizar com operadores

Comparativo de sharding

Solução Sharding Resharding Multi-key
Redis standalone Não N/A Sim
Redis Sentinel Não (replica) N/A Sim
Redis Cluster 16384 slots Online Mesmo slot apenas
Client-side (Twemproxy) Consistent hash Manual Limitado
Memcached Client-side Manual Não
Aerospike 4096 partitions Automático Não

Monitoramento de cluster

# Estado geral
redis-cli CLUSTER INFO

# Nós e slots
redis-cli CLUSTER NODES

# Slots não cobertos (problema!)
redis-cli CLUSTER SLOTS | grep -c "null"

# Verificar balanceamento
redis-cli --cluster check node1:6379

Resumo

  • Redis Cluster divide dados em 16384 hash slots distribuídos entre masters
  • Hash tags {tag} co-localizam chaves relacionadas no mesmo slot
  • Resharding é online — cluster permanece operacional durante migração
  • Evite hot keys sem sharding; projete chaves para distribuição uniforme

Para refletir

Suas chaves Redis usam hash tags onde necessário? Um redis-cli --cluster check revelaria slots desbalanceados?