Em arquiteturas de replicação primário-secundário no Redis, o split-brain ocorre quando uma partição de rede isola o nó primário, permitindo que sentinelas promovam um secundário, resultando em dois primários ativos. Isso conduz a escritas divergentes, inconsistência de dados e potencial perda de informações.
A diretiva min-replicas-to-write no Redis impõe um mecanismo de proteção, exigindo que um número mínimo de réplicas esteja conectado para que o primário aceite operações de escrita. Combinada com min-replicas-max-lag, que define o atraso máximo permitido, assegura a coerência das escritas em cenários de falha.
Implementação via Cliente Predis
No Predis, é possível configurar uma estratégia de replicação baseada em sentinelas para failover automático. Exemplo de inicialização:
$conexao_redis = new Predis\Client([
'replicacao' => 'sentinela',
'servico' => 'cluster_principal',
'sentinelas' => [
'tcp://192.0.2.10:26379',
'tcp://192.0.2.11:26380',
],
'parametros' => [
'banco_de_dados' => 2,
'senha' => 'token_seguro',
],
]);
Procedimentos de Configuração
1. Configuração do Servidor Redis
Edite o arquivo de configuração do Redis (redis.conf) para ativar as proteções de replicação:
min-replicas-to-write 2
min-replicas-max-lag 8
Esta configuração requer pelo menos duas réplicas ativas com latência inferior a 8 segundos para permitir escritas.
2. Configuração Avançada no Predis com Sentinelas
Para monitoramento e failover dinâmico, utilize a classe de replicação via sentinelas:
$replicacao_sentinela = new Predis\Connection\Replication\SentinelReplication([
'tcp://192.0.2.10:26379?role=sentinela&password=token_seguro',
'tcp://192.0.2.11:26380?role=sentinela&password=token_seguro',
], 'cluster_principal');
$cliente_redis = new Predis\Client($replicacao_sentinela);
Essa abordagem garante detecção automática do primário atual e redistribuição de tráfego em caso de falha.
Estratégias de Reforço
1. Dimensionamento de Sentinelas
Implemente um conjunto de sentinelas distribuídas geograficamente para aumentar a resiliência:
$replicacao_distribuida = new Predis\Connection\Replication\SentinelReplication([
'tcp://10.10.1.1:26379?role=sentinela',
'tcp://10.10.1.2:26380?role=sentinela',
'tcp://10.10.1.3:26381?role=sentinela',
], 'servico_critico');
2. Validação de Dados após Escritas
Utilize a separação de leitura e escrita do Predis para confirmar a consistência em operações críticas:
// Operação de escrita no primário
$cliente_redis->set('chave_importante', $valor_esperado);
// Leitura a partir de um secundário para verificação
$cliente_redis->readOnly();
$valor_lido = $cliente_redis->get('chave_importante');
$cliente_redis->readWrite();
if ($valor_lido !== $valor_esperado) {
// Mecanismo de correção ou log de inconsistência
}
Soluções para Cenários Comuns
Impacto no desempenho com min-replicas-to-write?
Ajuste o parâmetro min-replicas-max-lag para um valor menor ou implemente operações de escrita em lote para reduzir a sobrecarga de sincronização.
Monitoramento do estado de replicação?
Execute o comando INFO através do Predis para obter métricas em tempo real:
$status_replicacao = $cliente_redis->info('replicacao');
$numero_replicas = $status_replicacao['connected_slaves'];
$offset_primario = $status_replicacao['master_repl_offset'];