Escalando o Redis: Guia para Configurar um Cluster Redis
O Redis, um poderoso armazenamento de estrutura de dados em memória, é amplamente utilizado como banco de dados, cache e message broker. Embora uma única instância do Redis possa lidar com uma carga significativa, muitas aplicações acabam exigindo maior disponibilidade e a capacidade de escalar horizontalmente para acomodar volumes crescentes de dados e tráfego. O Redis Cluster fornece uma solução nativa para alcançar ambos os objetivos.
Este guia o guiará pelo processo de configuração, ajuste e gerenciamento de um Cluster Redis. Abordaremos os conceitos fundamentais, forneceremos instruções passo a passo para instalação e configuração, e discutiremos tarefas essenciais de gerenciamento para garantir que seu cluster permaneça robusto e performático.
Entendendo os Conceitos do Redis Cluster
Antes de mergulhar na configuração, é crucial entender os conceitos centrais que sustentam o Redis Cluster:
- Sharding (Particionamento): O Redis Cluster particiona seu conjunto de dados entre múltiplos nós Redis. Cada nó é responsável por um subconjunto dos hash slots (16384 no total). Quando um cliente precisa acessar uma chave, a biblioteca do cliente calcula a qual hash slot a chave pertence e direciona a solicitação ao nó apropriado.
- Replicação: Para alta disponibilidade, cada nó primário no cluster pode ter um ou mais nós de réplica. Se um nó primário falhar, uma de suas réplicas pode ser promovida para tomar seu lugar, minimizando o tempo de inatividade (downtime).
- Protocolo Gossip: Os nós do Redis Cluster se comunicam usando um protocolo gossip. Isso permite que os nós se descubram, troquem informações sobre seu estado e detectem falhas.
- Consenso: Quando um nó primário falha, o cluster precisa chegar a um consenso entre os nós primários restantes para eleger um novo primário a partir de suas réplicas. Este processo garante que o cluster permaneça operacional.
Pré-requisitos
Para configurar um Cluster Redis, você precisará de:
- Múltiplos servidores ou máquinas virtuais (pelo menos 6 nós são recomendados para uma configuração pronta para produção: 3 primários e 3 réplicas).
- Redis instalado em cada servidor. Certifique-se de estar usando o Redis versão 3.0 ou posterior.
- Conectividade de rede entre todos os nós. Os nós precisam ser capazes de se comunicar entre si em sua porta de cliente e sua porta de barramento de cluster (cluster bus port) (porta de cliente + 10000).
redis-cli, a interface de linha de comando do Redis, que inclui o scriptredis-trib.rbpara a criação do cluster.
Configurando um Cluster Redis: Passo a Passo
Esta seção fornece um guia prático e passo a passo para a criação de um Cluster Redis básico. Para simplificar, assumiremos que você está configurando um cluster em uma única máquina usando portas diferentes para cada nó. Em um ambiente de produção, você normalmente distribuiria esses nós por diferentes máquinas físicas ou virtuais.
1. Instalar o Redis
Se o Redis ainda não estiver instalado, siga o guia oficial de instalação do Redis para o seu sistema operacional. Por exemplo, no Debian/Ubuntu:
sudo apt update
sudo apt install redis-server
2. Configurar Instâncias do Redis para o Modo Cluster
Para cada nó em seu cluster, você precisará de um arquivo de configuração Redis separado. Crie diretórios para cada nó e copie o arquivo redis.conf padrão.
Vamos supor que estamos configurando um cluster primário de 3 nós sem réplicas para esta configuração inicial. Usaremos as portas 7000, 7001 e 7002.
# Criar diretórios para cada nó
mkdir cluster
cd cluster
mkdir 7000 7001 7002
# Copiar redis.conf para cada diretório
cp /etc/redis/redis.conf ./7000/
cp /etc/redis/redis.conf ./7001/
cp /etc/redis/redis.conf ./7002/
Agora, edite o arquivo de configuração para cada nó. Para 7000/redis.conf, 7001/redis.conf e 7002/redis.conf, faça as seguintes alterações:
port 700X(onde X é 0, 1 ou 2)cluster-enabled yescluster-config-file nodes-700X.conf(Este arquivo é gerenciado pelo próprio Redis e não deve ser editado manualmente. Ele armazena o estado do cluster.)cluster-node-timeout 5000(Tempo limite recomendado em milissegundos para um nó ser considerado falho.)appendonly yes(Recomendado para durabilidade dos dados, especialmente em produção)
Exemplo para 7000/redis.conf:
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
# Certifique-se de que bind esteja definido como 0.0.0.0 ou o IP correto se estiver rodando em uma máquina remota
bind 0.0.0.0
Repita essas alterações para 7001/redis.conf (porta 7001) e 7002/redis.conf (porta 7002).
3. Iniciar as Instâncias do Redis
Inicie cada instância do Redis usando seu arquivo de configuração específico:
redis-server ./7000/redis.conf
redis-server ./7001/redis.conf
redis-server ./7002/redis.conf
Se você tiver o Redis rodando como um serviço, pode ser necessário parar a instância padrão (sudo systemctl stop redis-server) e iniciá-las manualmente conforme mostrado acima, ou configurar múltiplos arquivos de serviço.
4. Criar o Cluster usando redis-trib.rb
O script redis-trib.rb é um gem Ruby que ajuda a automatizar a criação de um Cluster Redis. Ele está incluído nas distribuições do Redis.
Navegue até o diretório onde redis-trib.rb está localizado (frequentemente em /usr/share/redis/ ou você pode precisar encontrá-lo dentro de sua instalação do Redis). Você pode precisar instalar o Ruby se ele não estiver presente (sudo apt install ruby-full).
Execute o script para criar um cluster com 3 nós mestre:
# Certifique-se de estar no diretório do cluster ou forneça caminhos completos
# ruby /path/to/redis/src/redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
# Ou se redis-trib.rb estiver no seu PATH
redis-trib.rb create --replicas 0 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
Este comando:
* create: Informa ao redis-trib.rb para criar um novo cluster.
* --replicas 0: Especifica que queremos 0 réplicas por mestre. Para uma configuração de produção, você usaria --replicas 1 (ou mais).
* 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002: Lista os nós que participarão do cluster.
O script pedirá confirmação. Digite yes para continuar. Ele então atribuirá hash slots a cada nó mestre e configurará o cluster.
5. Verificar o Cluster
Depois que redis-trib.rb terminar, você pode se conectar a qualquer nó e verificar o status do cluster:
redis-cli -c -p 7000
CLUSTER INFO
CLUSTER NODES
O comando CLUSTER INFO deve mostrar cluster_state:ok. O comando CLUSTER NODES listará todos os nós no cluster, suas funções e seus slots atribuídos.
Dica: Use o flag -c com redis-cli (redis-cli -c) para habilitar o modo cluster. Isso permite que o redis-cli redirecione automaticamente os comandos para o nó correto quando uma migração ou redirecionamento de hash slot for necessário.
Adicionando Réplicas a um Cluster Existente
Para alta disponibilidade, você deve adicionar réplicas. Vamos adicionar uma réplica para o nó na porta 7000 (mestre) na porta 7003.
- Configurar o novo nó: Crie um novo diretório (por exemplo,
cluster/7003), copieredis.confe atualize-o para a porta 7003, habilitando o modo cluster e definindo ocluster-config-file.
ini port 7003 cluster-enabled yes cluster-config-file nodes-7003.conf cluster-node-timeout 5000 appendonly yes bind 0.0.0.0 - Iniciar o novo nó:
redis-server ./7003/redis.conf -
Adicionar a réplica usando
redis-trib.rb: Conecte-se ao seu cluster existente usandoredis-cli -c -p 7000e use o comandoCLUSTER REPLICATEou useredis-trib.rbnovamente. Usarredis-trib.rbé geralmente mais simples para a configuração inicial.```bash
Exemplo usando redis-trib.rb para adicionar uma réplica para o nó 7000
Você precisa do ID do nó mestre que deseja replicar.
Primeiro, obtenha o ID do nó: redis-cli -p 7000 CLUSTER NODES
Digamos que o ID do nó mestre seja 'your_master_node_id'
redis-trib.rb --cluster-add-node 127.0.0.1:7003 --cluster-slave --cluster-master-id
127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
`` *Nota*: O comandoredis-trib.rbpara adicionar nós pode ser um pouco complexo. Uma abordagem mais simples para adicionar réplicas é primeiro iniciar a nova instância de réplica, depois conectar-se ao nó mestre viaredis-clie emitir o comandoCLUSTER REPLICATE`. Alternativamente, você pode usar
redis-trib.rbpara reconfigurar um cluster existente com réplicas:```bash
Exemplo para adicionar réplicas a um cluster existente de 3 mestres
redis-trib.rb replace-node-master --replicas 1 127.0.0.1:7000 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
```
Este comando é mais elaborado e assume que você configurou nós adicionais (7003, 7004, 7005) como réplicas.
6. Gerenciando o Cluster
- Adicionar/Remover Nós: Você pode adicionar novos nós mestres e réplicas para escalar o cluster.
redis-trib.rbou comandos manuais podem ser usados. A remoção de nós envolve primeiro migrar os slots para fora do nó. - Failover: O Redis Cluster lida automaticamente com o failover. Se um nó mestre se tornar inacessível, suas réplicas tentarão ser promovidas. Você pode simular falhas usando
CLUSTER FAILOVER(em uma réplica) ou parando um nó. - Movendo Slots: Você pode mover manualmente os hash slots entre nós mestres usando os comandos
CLUSTER SETSLOT <slot> IMPORTING/NODEeMIGRATE. Isso é útil para reequilibrar o cluster ou preparar a remoção de um nó.
Melhores Práticas para o Redis Cluster
- Use pelo menos 6 nós: Um cluster pronto para produção deve ter pelo menos 3 mestres e 3 réplicas (uma réplica por mestre) para tolerância a falhas.
- Distribua nós por zonas de disponibilidade: Para implantações em nuvem, coloque os nós em diferentes zonas de disponibilidade para proteger contra falhas no nível da zona.
- Monitore seu cluster: Use as ferramentas de monitoramento do Redis e sistemas de monitoramento externos para rastrear desempenho, uso de memória e saúde dos nós.
- Configure
protected-mode no: Se estiver rodando o Redis Cluster em uma rede, garanta queprotected-mode noesteja definido em seuredis.confe use um firewall para restringir o acesso. - Use
appendonly yes: Para durabilidade dos dados, garanta que a persistência de arquivo append-only esteja habilitada. - Suporte da biblioteca Cliente: Certifique-se de que sua biblioteca cliente Redis suporte o Redis Cluster e lide com o redirecionamento corretamente.
Conclusão
Configurar um Cluster Redis é um passo fundamental para aplicações que exigem alta disponibilidade e escalabilidade horizontal. Ao compreender os conceitos centrais de sharding, replicação e comunicação de cluster, você pode implantar e gerenciar com sucesso um Cluster Redis robusto. Lembre-se de planejar a topologia do seu cluster, monitorar sua saúde e seguir as melhores práticas para garantir desempenho e confiabilidade ideais.