O Redis a partir da versão 3.0 introduziu suporte a clusters, com melhorias contínuas até a versão atual. Este artigo aborda a configuração e operação de um cluster Redis, utilizando a versão 5.0.4 em um sistema operacional baseado em Linux.
Fundamentos do Cluster Redis
Um cluster Redis é um conjunto de nós que compartilham dados de forma descentralizada. Cada nó mantém uma parte dos dados e informações de estado do cluster, comunicando-se via protocolo Gossip para sincronização. Os dados são distribuídos usando hash slots — existem 16.384 slots no total, e cada chave é atribuída a um slot através do cálculo CRC16 módulo 16.384.
Para alta disponibilidade, o cluster emprega um modelo de replicação mestre-escravo. Se um nó mestre falhar, um escravo corrsepondente asume automaticamente o papel de mestre.
Preparação do Ambiente
Para este exemplo, configuraremos um cluster com 3 nós mestres e 3 nós escravos em uma única máquina. Primeiro, crie um diretório principle e subdiretórios para cada nó:
mkdir -p /redis-cluster/{master1,master2,master3,slave1,slave2,slave3}
Em seguida, configure cada nó com uma porta exclusiva e ative o modo cluster. Exemplo para master1 (porta 6380):
port 6380
daemonize yes
pidfile /var/run/redis_master1.pid
cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes-master1.conf
Repita o processo para os demais nós, variando as portas (por exemplo, 6381, 6382, 6383, 6384, 6385) e os nomes de arquivos. Inicie todos os nós:
redis-server /redis-cluster/master1/redis.conf &
redis-server /redis-cluster/master2/redis.conf &
redis-server /redis-cluster/master3/redis.conf &
redis-server /redis-cluster/slave1/redis.conf &
redis-server /redis-cluster/slave2/redis.conf &
redis-server /redis-cluster/slave3/redis.conf &
Verifique se os processos estão em execução com o comando ps aux | grep redis-server.
Criação do Cluster
Use o utilitário redis-cli para formar o cluster especificando os endereços e portas dos nós, com a opção --replicas 1 para definir um escravo por mestre:
redis-cli --cluster create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 --cluster-replicas 1
Confirme a configuração digitando yes quando solicitado. A saída mostrará a alocação de slots e as associações mestre-escravo.
Testando o Cluster
Conecte-se a qualquer nó no modo cluster com a flag -c:
redis-cli -h 127.0.0.1 -p 6380 -c
Ao armazenar uma chave, o cliente redirecionará automaticamente para o nó responsável pelo slot correspondente. Por exemplo:
set chave valor
-> Redirecionado para slot [X] em 127.0.0.1:6382
OK
Isso confirma que o cluster está operacional.
Expansão do Cluster
Para adicionar novos nós, primeiro inicie-os com configurações semelhantes. Exemplo: adicione um novo mestre na porta 6386 e um escravo na porta 6387.
Adicione o novo mestre ao cluster:
redis-cli --cluster add-node 127.0.0.1:6386 127.0.0.1:6380
Em seguida, adicione o escravo associado ao mestre recém-adicionado (substitua MASTER_ID pelo ID do novo mestre):
redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6380 --cluster-slave --cluster-master-id MASTER_ID
Para distribuir slots ao novo mestre, execute uma redistribuição de slots. Mova uma quantidade desejada (por exemplo, 1000 slots) de todos os nós existentes:
redis-cli --cluster reshard 127.0.0.1:6386
Siga as instruções interativas para especificar o número de slots e o ID do nó de destino.
Redução do Cluster
Para remover um nó, primeiro remova seu escravo associado:
redis-cli --cluster del-node 127.0.0.1:6387 ESCRAVO_ID
Em seguida, redistribua os slots do mestre que será removido para outros nós existentes. Use o comando reshard para mover todos os slots do mestre alvo para um mestre de destino específico:
redis-cli --cluster reshard 127.0.0.1:6386
# Mova slots do mestre a ser removido para outro mestre
Source node #1: MESTRE_ID_REMOVER
Source node #2: done
Por fim, remova o nó mestre vazio:
redis-cli --cluster del-node 127.0.0.1:6386 MESTRE_ID_REMOVER
Use cluster nodes para verificar o estado final do cluster.