Nesta página, fornecemos orientações sobre como usar o Memorystore for Redis Cluster da melhor maneira. Esta página também aponta possíveis problemas que devem ser evitados.
Práticas recomendadas de gerenciamento de memória
Nesta seção, descrevemos estratégias para gerenciar a memória de clusters para que o Memorystore for Redis Cluster funcione de maneira eficiente para seus aplicativos cliente.
Conceitos de gerenciamento de memória
Carga de gravação: o volume e a velocidade com que você adiciona ou atualiza chaves no cluster do Redis. A carga de gravação pode variar de normal a muito alta, dependendo do caso de uso do Redis e dos padrões de uso do aplicativo.
Política de remoção: o Memorystore for Redis Cluster usa a política de remoção
volatile-lru. É possível usar comandos como EXPIRE para definir remoções de chaves.
Monitorar um cluster com uma carga de gravação normal
Confira a métrica /cluster/memory/maximum_utilization. Se /cluster/memory/maximum_utilization estiver em 100% ou menos, o
cluster do Redis terá um bom desempenho quando você usar uma carga de gravação normal.
No entanto, se o uso da memória se aproximar de 100% e você esperar que o uso de dados aumente, aumente o tamanho do cluster para abrir espaço para novos dados.
Monitorar um cluster com uma carga de gravação alta
Confira a métrica /cluster/memory/maximum_utilization. Dependendo da gravidade da alta carga de gravação, o cluster pode
ter problemas de desempenho nos seguintes limites:
Cargas de gravação muito altas podem apresentar problemas se
/cluster/memory/maximum_utilizationatingir 65% ou mais.Cargas de gravação moderadamente altas podem apresentar problemas se
/cluster/memory/maximum_utilizationatingir 85% ou mais.
Nesses cenários, aumente o tamanho do cluster para melhorar o desempenho.
Se você tiver problemas ou estiver preocupado com uma alta carga de gravação no cluster, entre em contato com o suporte doGoogle Cloud .
Escalonar fragmentos
Ao escalonar o número de fragmentos em um cluster, faça isso durante períodos de poucas gravações. O escalonamento durante períodos de alta carga de gravação pode colocar pressão de memória no cluster devido à sobrecarga de memória causada pela replicação ou migração de slots.
Se o caso de uso do Redis usar remoções de chaves, o escalonamento para um tamanho de cluster menor poderá reduzir a proporção de ocorrência em cache. Nesse caso, no entanto, você não precisa se preocupar com a perda de dados, já que a remoção de chaves é esperada.
Para casos de uso do Redis em que você não quer perder chaves, reduza a escala vertical para um cluster menor que ainda tenha espaço suficiente para seus dados. A nova
contagem de fragmentos de destino precisa permitir pelo menos 1,5 vez a memória usada pelos dados.
Em outras palavras, provisione fragmentos suficientes para 1,5 vez a quantidade de dados no cluster. Use a métrica /cluster/memory/total_used_memory para ver quantos dados estão armazenados no
cluster.
Práticas recomendadas para uso da CPU
Se ocorrer uma interrupção zonal inesperada, isso vai reduzir os recursos de CPU do cluster devido à perda de capacidade dos nós na zona indisponível. Recomendamos o uso de clusters de alta disponibilidade. O uso de várias réplicas por fragmento (em vez de uma réplica por fragmento) fornece recursos de CPU adicionais durante uma interrupção. É possível ter até cinco réplicas por fragmento.
Além disso, recomendamos gerenciar o uso da CPU do nó para que os nós tenham sobrecarga de CPU suficiente para lidar com o tráfego extra da capacidade perdida se houver uma interrupção inesperada na zona. Monitore o uso da CPU para primárias e réplicas usando
a métrica Segundos de CPU da linha de execução principal /cluster/cpu/maximum_utilization.
Dependendo do número de réplicas provisionadas por nó, recomendamos as seguintes metas de uso de CPU do /cluster/cpu/maximum_utilization:
- Para clusters com uma réplica por nó, use um valor de
/cluster/cpu/maximum_utilizationde 0,5 segundo para o nó principal e 0,5 segundo para a réplica. - Para clusters com duas ou mais réplicas por nó, use um valor de
/cluster/cpu/maximum_utilizationde 0,9 segundo para o nó principal e 0,5 segundo para cada réplica.
Se os valores da métrica excederem essas recomendações, recomendamos aumentar o número de fragmentos no cluster. Se você tiver menos de cinco réplicas no cluster, também poderá escalonar verticalmente o número de réplicas, até um máximo de cinco.
Se o cluster tiver alta utilização da CPU ou se os recursos do cluster forem esgotados (por exemplo, por ter muitas conexões), o cluster poderá se comportar de maneira inadequada e as métricas externas poderão estar ausentes.
Comandos do Redis que consomem muitos recursos
Recomendamos que você evite usar comandos do Redis que consomem muitos recursos. O uso desses comandos pode resultar nos seguintes problemas de desempenho:
- Latência alta e tempos limite do cliente
- Pressão de memória causada por comandos que aumentam o uso da memória
- Perda de dados durante a replicação e sincronização de nós porque a linha de execução principal do Redis está bloqueada
- Verificações de integridade, observabilidade e replicação sem recursos
A tabela a seguir lista exemplos de comandos do Redis que consomem muitos recursos e oferece alternativas que são eficientes em termos de recursos.
| Categoria | Comando que consome muitos recursos | Alternativa com uso eficiente de recursos |
|---|---|---|
| Executar para todo o keyspace | KEYS |
SCAN |
| Executar para um conjunto de chaves de comprimento variável | LRANGE |
Limite o tamanho do intervalo usado para uma consulta. |
ZRANGE |
Limite o tamanho do intervalo usado para uma consulta. | |
HGETALL |
HSCAN |
|
SMEMBERS |
SSCAN |
|
| Bloquear a execução de um script | EVAL |
Verifique se o script não é executado indefinidamente. |
EVALSHA |
Verifique se o script não é executado indefinidamente. | |
| Remover arquivos e links | DEL |
UNLINK |
| Publicar e assinar | PUBLISH |
SPUBLISH |
SUBSCRIBE |
SSUBSCRIBE |
Práticas recomendadas para limites de escalonamento
Os cenários de limite de escalonamento se enquadram nas seguintes categorias:
- Escalonamento para uso da memória
- Escalonamento para uso da CPU
- Escalonamento para reduzir pontos de acesso
Se a carga de trabalho depende da remoção de chaves, o Google não recomenda a redução da escala vertical para uso da CPU ou uso da memória. Nessas cargas de trabalho, o uso da memória costuma atingir a capacidade máxima antes que as remoções ocorram automaticamente. Os picos de memória resultantes bloqueiam as operações de redução de escala vertical.
As seções a seguir detalham cenários comuns e limites de métricas que podem justificar o escalonamento.
Escalonamento de uso da memória
Para determinar quando escalonar com base no uso da memória, monitore as métricas /cluster/memory/average_utilization e /cluster/memory/maximum_utilization. Para mais informações sobre essas métricas, consulte Métricas de monitoramento compatíveis.
Se o cluster atender a uma das seguintes condições, considere acionar uma operação de escalonamento horizontal:
- O uso médio da memória do cluster excede o limite sugerido de 70%.
- O uso máximo da memória excede 80% e o uso médio da memória excede 50%.
Se o cluster atender a uma das seguintes condições, considere acionar uma operação de redução de escala vertical:
- O uso médio da memória do cluster cai abaixo do limite sugerido de 50%.
- O uso máximo da memória cai para menos de 60%, e o uso médio da memória cai para menos de 40%.
Escalonamento de uso da CPU
Para determinar quando escalonar com base no uso da CPU, monitore as métricas
/cluster/cpu/average_utilization e
/cluster/cpu/maximum_utilization.
Se o cluster atender a uma das seguintes condições, considere acionar uma operação de escalonamento horizontal:
- A utilização média da CPU do cluster excede o limite sugerido de 70%.
- A utilização máxima da CPU excede 80% e a utilização média da CPU excede 50%.
Se o cluster atender a uma das seguintes condições, considere acionar uma operação de redução:
- A utilização média da CPU do cluster cai abaixo do limite sugerido de 50%.
- A utilização máxima da CPU cai abaixo de 60% e a utilização média da CPU cai abaixo de 40%.
Escalonamento para reduzir pontos de acesso
O Memorystore for Redis Cluster fornece variações médias e máximas da mesma métrica, que podem ser usadas para identificar pontos de acesso para essa família de métricas. O valor máximo representa o nó do cluster mais carregado, enquanto o valor médio representa a carga de todo o cluster. Se o valor máximo for significativamente maior que o valor médio, isso indica que um nó específico está carregado de maneira desproporcional (um ponto de acesso). Para resolver esse problema, recomendamos que você escalonar horizontalmente o cluster. Para mais informações, consulte Escalonar a capacidade do cluster.
Quando você observar uma divergência significativa entre as variações média e máxima, execute os comandos INFO memory e INFO cpu nos nós do cluster para coletar dados em tempo real diretamente do cluster. Para mais informações sobre como usar esses comandos, consulte INFO na documentação do Redis.
Práticas recomendadas para clientes Redis
Seu aplicativo precisa usar um cliente Redis compatível com cluster ao se conectar a um cluster. Para exemplos de clientes que reconhecem clusters e configurações de amostra, consulte Exemplos de código da biblioteca de cliente. O cliente precisa manter um mapa de slots de hash para os nós correspondentes no cluster para enviar solicitações aos nós certos e evitar a sobrecarga de desempenho causada por redirecionamentos de cluster.
Mapeamento de clientes
Os clientes precisam receber uma lista completa de slots e os nós mapeados nas seguintes situações:
Quando o cliente é inicializado, ele precisa preencher o mapeamento inicial de slots para nós.
Quando um redirecionamento
MOVEDé recebido do servidor, como em uma situação de failover em que todos os slots atendidos pelo nó principal anterior são assumidos pela réplica, ou em uma nova fragmentação em que os slots são movidos do nó principal de origem para o nó principal de destino.Quando um erro
CLUSTERDOWNé recebido do servidor ou as conexões com um servidor específico atingem o tempo limite de forma persistente.Quando um erro
READONLYé recebido do servidor. Isso pode acontecer quando uma instância principal é rebaixada para réplica.Além disso, os clientes precisam atualizar periodicamente a topologia para se manterem preparados para qualquer mudança e saber sobre alterações que podem não resultar em redirecionamentos ou erros do servidor, como quando novos nós de réplica são adicionados. Todas as conexões inativas também precisam ser fechadas como parte da atualização da topologia para reduzir a necessidade de lidar com conexões com falha durante o ambiente de execução do comando.
Descoberta de clientes
A descoberta de clientes geralmente é feita emitindo um comando CLUSTER SLOT, CLUSTER NODE ou
CLUSTER SHARDS para o servidor Redis. Recomendamos o uso do comando CLUSTER SHARDS. CLUSTER SHARDS substitui o comando CLUSTER SLOTS
(descontinuado), fornecendo uma representação mais eficiente e extensível do
cluster.
O tamanho da resposta para os comandos de descoberta do cliente do cluster pode variar com base no tamanho e na topologia do cluster. Clusters maiores com mais nós produzem uma resposta maior. Por isso, é importante garantir que o número de clientes que fazem a descoberta da topologia do cluster não cresça sem limites.
Essas atualizações de topologia são caras no servidor Redis, mas também são importantes para a disponibilidade do aplicativo. Portanto, é importante garantir que cada cliente faça uma única solicitação de descoberta em um determinado momento (e armazene em cache o resultado na memória) e que o número de clientes que fazem as solicitações seja limitado para evitar a sobrecarga do servidor.
Por exemplo, quando o aplicativo cliente é iniciado ou perde a conexão com o servidor e precisa realizar a descoberta de cluster, um erro comum é o aplicativo cliente fazer várias solicitações de reconexão e descoberta sem adicionar espera exponencial na nova tentativa. Isso pode fazer com que o servidor Redis pare de responder por um período prolongado, causando um uso muito alto da CPU.
Evitar sobrecarga de descoberta no Redis
Para reduzir o impacto causado por um fluxo repentino de solicitações de conexão e descoberta, recomendamos o seguinte:
Implemente um pool de conexões de cliente com um tamanho finito e pequeno para limitar o número de conexões de entrada simultâneas do aplicativo cliente.
Quando o cliente se desconectar do servidor devido ao tempo limite, tente novamente com espera exponencial com instabilidade. Isso ajuda a evitar que vários clientes sobrecarreguem o servidor ao mesmo tempo.
Use o endpoint de descoberta do Memorystore for Redis Cluster para realizar a descoberta de cluster. O endpoint de descoberta é altamente disponível e tem balanceamento de carga em todos os nós do cluster. Além disso, o endpoint de descoberta tenta encaminhar as solicitações de descoberta de cluster para nós com a visualização de topologia mais atualizada.
Detectar e processar conexões que não respondem
Recomendamos configurar o aplicativo cliente para detectar conexões que não respondem ao Memorystore for Redis Cluster. Quando uma conexão que não responde é detectada, o cliente precisa redefini-la. Para criar um aplicativo resiliente, recomendamos as seguintes configurações de cliente:
- Configure os parâmetros de sinal de atividade do TCP: defina os parâmetros
TCP keepalive time,TCP keepalive intervaleTCP keepalive probespara que os clientes detectem e descartem conexões que não respondem de maneira proativa, mesmo quando as conexões estão inativas. Por exemplo, se você definir o parâmetroTCP keepalive timecomo 30 segundos,TCP keepalive intervalcomo 10 segundos eTCP keepalive probescomo 3, os clientes vão redefinir as conexões inativas que não respondem em um minuto. - Configurar tempos limite do usuário TCP: defina esse tempo limite nos clientes para redefinir conexões que têm solicitações pendentes e parar de responder. Por exemplo, se você definir o tempo limite como 15 segundos, os clientes vão redefinir as conexões que não respondem e que têm solicitações pendentes após 15 segundos.
Práticas recomendadas de persistência
Nesta seção, explicamos as práticas recomendadas para persistência.
Persistência de RDB e adição de réplicas
Para ter os melhores resultados ao fazer backup do cluster com snapshots de RDB ou adicionar réplicas ao cluster, use as seguintes práticas recomendadas:
Gerenciamento de memória
Os snapshots do RDB usam uma bifurcação de processo e um mecanismo de cópia em gravação para criar um snapshot dos dados do nó. Dependendo do padrão de gravações nos nós, a memória usada deles aumenta à medida que as páginas afetadas pelas gravações são copiadas. O consumo de memória pode ser até o dobro do tamanho dos dados no nó.
Para garantir que os nós tenham memória suficiente para concluir o snapshot, mantenha ou defina
maxmemory como 80% da
capacidade do nó para que 20% seja reservado para sobrecarga. Essa sobrecarga de memória,
além de monitorar snapshots, ajuda a gerenciar a carga de trabalho para ter
snapshots bem-sucedidos. Além disso, ao adicionar réplicas, reduza o tráfego de gravação o máximo
possível. Consulte Monitorar um cluster com uma carga de gravação alta para saber mais.
Snapshots desatualizados
A recuperação de nós de um snapshot desatualizado pode causar problemas de desempenho no aplicativo, já que ele tenta reconciliar uma quantidade significativa de chaves desatualizadas ou outras mudanças no banco de dados, como uma mudança de esquema. Se você estiver preocupado com a recuperação de um snapshot desatualizado, desative o recurso de persistência do RDB. Depois que você reativar a persistência, um snapshot será criado no próximo intervalo de snapshot programado.
Impacto no desempenho dos snapshots do RDB
Dependendo do padrão de carga de trabalho, os snapshots do RDB podem afetar o desempenho do cluster e aumentar a latência dos aplicativos. É possível minimizar o impacto no desempenho dos snapshots do RDB programando-os para serem executados durante períodos de baixo tráfego do cluster, se você não se importar com snapshots menos frequentes.
Por exemplo, se o cluster tiver pouco tráfego entre 1h e 4h, defina o horário de início como 3h e o intervalo como 24 horas.
Se o sistema tiver uma carga constante e exigir snapshots frequentes, avalie cuidadosamente o impacto no desempenho e pondere os benefícios de usar snapshots do RDB para a carga de trabalho.
Adicionar uma réplica
Para adicionar uma réplica, é necessário um snapshot do RDB. Para mais informações sobre snapshots de RDB, consulte Gerenciamento de memória.
Quando usar um cluster de zona única
Se você configurar um cluster para que ele não use réplicas, recomendamos usar um cluster de zona única. Geralmente, estes são os motivos:
Custo e desempenho
Se os principais fatores forem minimizar o custo e ter o melhor desempenho para os clientes localizados na mesma região, recomendamos que você escolha um cluster de zona única.
Minimizar o impacto da interrupção
Quando você escolhe um cluster de zona única, as interrupções zonais têm menos probabilidade de afetar seu cluster. Ao colocar todos os nós em uma única zona, a chance de uma interrupção zonal afetar o servidor cai de 100% para 33%. Há uma chance de 33% de que a zona em que o cluster está localizado fique inativa, em vez de uma chance de 100% de que os nós, que estão localizados na zona indisponível, sejam afetados.
Recuperação rápida
Se ocorrer uma interrupção zonal em um cluster de zona única, o Memorystore for Redis Cluster simplifica a recuperação dos dados. É possível provisionar um novo cluster em uma zona em funcionamento rapidamente e redirecionar o aplicativo para operações com o mínimo de interrupção.
Práticas recomendadas para planejamento de capacidade
Para garantir que você possa provisionar recursos e criar arquiteturas resilientes, recomendamos as seguintes práticas recomendadas de planejamento de capacidade:
- Implante em vários locais: se não for possível criar um cluster na zona preferida devido a restrições temporárias de recursos, tente criá-lo em uma zona diferente na mesma região ou em uma região diferente.
- Usar o acesso entre regiões: configure os clientes para acessar os clusters localizados em regiões diferentes. Se você precisar provisionar um cluster que esteja em uma região diferente devido a restrições de recursos locais, seus clientes poderão se conectar ao cluster.
- Use a replicação entre regiões: para promover um cluster secundário em uma região alternativa para um cluster de leitura ou gravação principal para recuperação de desastres, realize uma alternância.
Práticas recomendadas do Lettuce
Nesta seção, descrevemos as práticas recomendadas para usar o Lettuce para se conectar a um cluster.
Atualizar valores de parâmetro
Ao usar o Lettuce, mude o parâmetro validateClusterNodeMembership para
false. Caso contrário, quando a topologia mudar, você poderá receber erros
unknownPartition.
Ativar o Transport Layer Security (TLS)
Nesta seção, explicamos os benefícios de segurança e as implicações de desempenho do uso do Transport Layer Security (TLS), além de recomendações para a ativação dele.
Benefícios de segurança
Ao usar o TLS, você tem os seguintes benefícios de segurança:
- Autenticação do Identity and Access Management (IAM): o TLS usa esse tipo de autenticação para proteger contra ataques de spoofing de servidor, como ataques de person-in-the-middle.
- Criptografia em trânsito: a criptografia integrada doGoogle Cloudprotege o tráfego na rede do Google em um nível de infraestrutura. No entanto, isso envolve confiar nas pilhas de host e de rede do Google. Embora essa criptografia seja transparente e ativada por padrão, ela não é de ponta a ponta. Por outro lado, o TLS usa criptografia em trânsito na camada do aplicativo. Essa criptografia de ponta a ponta oferece mais controle sobre as chaves e os processos de criptografia.
- Proteção de token de autenticação: se você usa a autenticação do IAM, ativar o TLS minimiza o risco de exposição e vazamento dos tokens de autenticação.
Implicações no desempenho
O TLS afeta o desempenho das seguintes maneiras:
Estabelecer conexões: um cliente e um servidor que estabeleceram uma sessão TLS podem retomá-la sem repetir o processo de estabelecimento da conexão entre eles, que consome muitos recursos. Ao ativar a retomada de TLS, você reduz a sobrecarga de estabelecer uma conexão entre o cliente e o servidor.
Se você não estabelecer a retomada do TLS, o estabelecimento de conexões consumirá muitos recursos. Para conexões novas e atuais, muitas conexões entre o cliente e o servidor podem levar a tempos limite de conexão. Isso pode causar um efeito bola de neve, porque o Memorystore para Redis Cluster tenta restabelecer as conexões que expiraram, o que aumenta os recursos usados para estabelecer conexões.
Criptografar e descriptografar dados: a criptografia e a descriptografia de dados envolvem operações que consomem muita CPU e afetam o cliente e o servidor. Isso pode reduzir a capacidade do cluster e aumentar a latência dele.
Recomendações
Ao considerar se deve ativar o TLS, recomendamos que você avalie suas políticas de segurança e considere os benefícios e as desvantagens do TLS. Se você optar por ativar o TLS, considere o seguinte:
- Ativar a retomada do TLS reduz a sobrecarga para estabelecer conexões. Uma conexão entre o cliente e o servidor é necessária apenas para a conexão inicial. No entanto, uma expansão repentina do tamanho do cluster do cliente pode resultar em uma breve interrupção causada pelo handshake completo inicial de cada novo host do cliente.
- Embora algumas bibliotecas de cliente não ofereçam controles integrados para ativar o TLS, é possível usar um código personalizado para integrar essa funcionalidade aos clusters.