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.
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?