Caches compartilhados com clusters de cache do NGINX Plus, parte 2

NGINX | 09 de fevereiro de 2017

Editor – Esta é a segunda parte de uma série sobre cache de alta capacidade e alta disponibilidade:

Como criar um cluster de cache de alta capacidade e alta disponibilidade usando o NGINX ou o NGINX Plus? Este post descreve como usar dois ou mais servidores de cache NGINX ou NGINX Plus para criar um cluster de cache de alta disponibilidade. (Salvo indicação em contrário, o método descrito aqui se aplica igualmente ao NGINX Open Source e ao NGINX Plus, mas, para simplificar, faremos referência apenas ao NGINX Plus.)

Revisão – A solução de cache fragmentado

A primeira parte desta série descreveu um padrão para a criação de clusters de cache fragmentados e de grande escala.

O particionamento do cache nos servidores de cache da Web cria uma configuração tolerante a falhas, na qual cada recurso é armazenado em cache em apenas um servidor

Esse padrão é eficaz quando você precisa criar um cache de capacidade muito grande que possa ser ampliado conforme necessário. Como cada recurso é armazenado em cache em apenas um servidor, ele não é totalmente tolerante a falhas, mas o balanceamento de carga com hash consistente garante que, se um servidor falhar, apenas a parte do conteúdo em cache correspondente a ele seja invalidada.

Como criar um cluster de cache de alta disponibilidade

Se o seu principal objetivo for minimizar a qualquer custo o número de solicitações aos servidores de origem, a solução de particionamento de cache não será a melhor opção. Em vez disso, uma solução com uma configuração cuidadosa das instâncias primárias e secundárias do NGINX Plus pode atender aos seus requisitos:

Um cluster de cache com uma configuração de alta disponibilidade para failover automático entre os servidores de cache primário e secundário minimiza a carga no servidor de origem.

A instância primária do NGINX Plus recebe todo o tráfego e encaminha as solicitações para a instância secundária. A instância secundária recupera o conteúdo do servidor de origem e o armazena em cache; a instância primária também armazena em cache a resposta da instância secundária e a retorna ao cliente.

Ambos os dispositivos têm caches totalmente preenchidos, e o cache é atualizado de acordo com os tempos limite configurados.

Configurando o servidor de cache primário

Configure o servidor de cache primário para encaminhar todas as solicitações ao servidor secundário e armazenar as respostas em cache. Conforme indicado pelo parâmetro backup da diretiva server no grupo upstream, o servidor primário encaminha as solicitações diretamente ao servidor de origem caso o servidor secundário falhe:

proxy_cache_path /tmp/mycache keys_zone=mycache:10m;
server {
    status_zone mycache;          # for NGINX Plus extended status

    listen 80;

    proxy_cache mycache;
    proxy_cache_valid 200 15s;

    location / {
        proxy_pass http://secondary;
    }
}

upstream secondary {
    zone secondary 128k;          # for NGINX Plus extended status

    server 192.168.56.11;         # secondary
    server 192.168.56.12 backup;  # origin
}

Configurando o servidor de cache secundário

Configure o servidor de cache secundário para encaminhar as solicitações ao servidor de origem e armazenar as respostas em cache.

proxy_cache_path /tmp/mycache keys_zone=mycache:10m;
server {
    status_zone mycache;          # for NGINX Plus extended status

    listen 80;

    proxy_cache mycache;
    proxy_cache_valid 200 15s;

    location / {
        proxy_pass http://origin;
    }
}

upstream origin {
    zone origin 128k;            # for NGINX Plus extended status

    server 192.168.56.12;        # origin
}

Configurando a alta disponibilidade

Por fim, você precisa configurar a alta disponibilidade (HA) para que o servidor secundário assuma o tráfego de entrada caso o servidor primário falhe; quando o servidor primário se recuperar, ele voltará a assumir o tráfego.

Neste exemplo, usamos a solução de alta disponibilidade ativa-passiva para o NGINX Plus. O endereço IP virtual anunciado externamente é 192.168.56.20, e o servidor de cache primário atua como o nó primário de alta disponibilidade no cluster. Se você estiver usando o NGINX Open Source, poderá instalar e configurar manualmente o keepalived ou outra solução de alta disponibilidade.

Cenários de failover

Lembre-se de que queremos criar um cluster de cache de alta disponibilidade que continue operando mesmo em caso de falha de um servidor de cache. Não queremos que a carga no servidor de origem aumente, seja quando um servidor de cache falhar, seja quando ele se recuperar e precisar atualizar conteúdo desatualizado.

Suponha que o servidor primário falhe e a solução de alta disponibilidade do NGINX Plus transfira o endereço IP externo para o servidor secundário.

Quando o servidor de cache primário de um cluster de cache falha, o servidor de cache secundário recebe e atende diretamente às solicitações dos clientes, garantindo alta disponibilidade do cache.

O servidor secundário tem um cache completo e continua operando normalmente. Não há carga adicional no servidor de origem.

Quando o servidor de cache primário se recuperar e começar a receber tráfego dos clientes, seu cache estará desatualizado e muitas entradas terão expirado. O servidor primário atualizará seu cache local a partir do servidor de cache secundário; como o cache do servidor secundário já está atualizado, não haverá aumento no tráfego para o servidor de origem.

Agora, suponha que o servidor secundário falhe. O servidor primário detecta essa falha (usando uma verificação de integridade configurada como parte da solução de alta disponibilidade) e encaminha o tráfego diretamente para o servidor de backup (que é o servidor de origem).

Quando o servidor de cache secundário em um cluster de cache falha, o servidor de cache primário o ignora e encaminha as solicitações dos clientes diretamente ao servidor de origem, garantindo alta disponibilidade do cache.

O servidor primário tem um cache completo e continua operando normalmente. Novamente, não há carga adicional no servidor de origem.

Quando o servidor secundário se recuperar, seu cache estará desatualizado. No entanto, ele só receberá solicitações do servidor primário quando o cache deste expirar, momento em que a cópia do servidor secundário também terá expirado. Embora o servidor secundário precise solicitar conteúdo ao servidor de origem, isso não aumenta a frequência das solicitações ao servidor de origem. Não há nenhum efeito adverso sobre o servidor de origem.

Testando o comportamento de failover

Para testar nossa solução de alta disponibilidade, configuramos o servidor de origem para registrar as solicitações e retornar a hora atual para cada solicitação. Isso significa que a resposta do servidor de origem muda a cada segundo:

access_log /var/log/nginx/access.log;
location / {
    return 200 "It's now $time_localn";
}

Os servidores de cache primário e secundário já estão configurados para armazenar em cache respostas com o código de status 200 por 15 segundos. Isso normalmente resulta em atualizações do cache a cada 15 ou 16 segundos.

proxy_cache_valid 200 15s;

Verificando o comportamento do cache

Uma vez por segundo, enviamos uma solicitação HTTP para o endereço IP virtual de alta disponibilidade do cluster de cache. A resposta não muda até que os caches nos servidores primário e secundário expirem e a resposta seja atualizada a partir do servidor de origem. Isso acontece a cada 15 ou 16 segundos.

$ while sleep 1 ; do curl http://192.168.56.20/ ; done
It's now 9/Feb/2017:06:35:03 -0800
It's now 9/Feb/2017:06:35:03 -0800
It's now 9/Feb/2017:06:35:03 -0800
It's now 9/Feb/2017:06:35:19 -0800
It's now 9/Feb/2017:06:35:19 -0800
^C

Também podemos inspecionar os logs no servidor de origem para confirmar que ele está recebendo uma solicitação apenas a cada 15 ou 16 segundos.

Verificando o failover

Podemos verificar se o failover está funcionando corretamente interrompendo o servidor primário ou o secundário, por exemplo, encerrando os processos do nginx. O teste de carga constante continua em execução, e a resposta permanece armazenada em cache de forma consistente.

A inspeção do log de acesso no servidor de origem confirma que ele recebe apenas uma solicitação a cada 15 a 16 segundos, independentemente de qual dos servidores de cache falhe ou se recupere.

Periodicidade das atualizações do cache

Em uma situação estável, o conteúdo armazenado em cache normalmente é atualizado a cada 15 a 16 segundos. O conteúdo expira após 15 segundos, e há um atraso de até 1 segundo até que a próxima solicitação seja recebida, acionando uma atualização do cache.

Ocasionalmente, o cache pode parecer ser atualizado mais lentamente (com intervalos de até 30 segundos entre as alterações no conteúdo). Isso ocorre quando o conteúdo do servidor de cache primário expira e ele recupera do servidor secundário um conteúdo em cache que está prestes a expirar. Se isso for um problema, você pode configurar um tempo limite de cache menor no servidor secundário.

Resumo

Organizar caches em camadas entre dois ou mais servidores de cache NGINX, da maneira descrita aqui, é uma forma eficaz de criar um cluster de cache de alta disponibilidade que minimize a carga nos servidores de origem, protegendo-os contra picos de tráfego quando um dos servidores de cache falha ou se recupera.

A capacidade total do cache é limitada à capacidade de um único servidor de cache. A primeira parte desta série descreve um padrão alternativo de cache fragmentado, que distribui o cache entre um cluster de servidores de cache. Nesse caso, a capacidade total corresponde à soma das capacidades de todos os servidores de cache, mas o conteúdo não é replicado para proteger o servidor de origem contra picos de tráfego caso um servidor de cache falhe.

Experimente o cache de alta disponibilidade em seus próprios servidores – comece hoje mesmo sua avaliação gratuita de 30 dias ou entre em contato conosco para conversar sobre seus casos de uso.


Compartilhar

Sobre o autor

Owen Garrett
Owen GarrettDiretor Sênior de Gestão de Produtos

Mais publicações de Owen Garrett

Publicações relacionadas no blog

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade
NGINX | 10/10/2024

Como o F5 NGINX One aprimora o gerenciamento e a observabilidade

Descubra como o F5 NGINX One aprimora o gerenciamento e a observabilidade de ambientes híbridos e multicloud ao oferecer um console web centralizado baseado em SaaS, com insights em tempo real, conformidade automatizada e gerenciamento simplificado de configurações.

Do OpenAPI ao NGINX como gateway de API usando uma API declarativa
NGINX | 17/06/2024

Do OpenAPI ao NGINX como gateway de API usando uma API declarativa

Descubra como transformar uma definição de esquema OpenAPI em uma configuração NGINX totalmente funcional, operando como um API Gateway com a segurança de um Web Application Firewall e um Portal do Desenvolvedor, usando uma abordagem declarativa de API.

Como gerenciar picos repentinos de tráfego e sobrecarga do servidor
NGINX | 14/07/2021

Como gerenciar picos repentinos de tráfego e sobrecarga do servidor

Picos de tráfego e sobrecarga de servidores são preocupações sérias para varejistas online em qualquer época, mas especialmente durante a “Cyber Season” de compras de fim de ano. Detalhamos como você pode aproveitar as soluções de entrega de aplicações de nível de produção da NGINX para se preparar para aumentos repentinos de tráfego.

Distribuição segura de chaves privadas SSL com o NGINX
NGINX | 02/04/2019

Distribuição segura de chaves privadas SSL com o NGINX

Descrevemos três maneiras progressivamente mais seguras de proteger chaves privadas SSL ao configurar o NGINX para processar tráfego HTTPS: permitir acesso de leitura apenas ao usuário root, criptografar as chaves com senhas armazenadas separadamente e distribuir as senhas a partir de um repositório central.

Agrupando solicitações de API em lotes com NGINX Plus e o módulo JavaScript do NGINX
NGINX | 24/05/2018

Agrupando solicitações de API em lotes com NGINX Plus e o módulo JavaScript do NGINX

O módulo JavaScript do NGINX lançado com o NGINX Plus R15 oferece suporte a subsolicitações, possibilitando uma classe totalmente nova de casos de uso para o NGINX Plus. Este exemplo completo também usa a API do NGINX Plus e os módulos de chave-valor para converter solicitações de API dos clientes em solicitações separadas para as APIs dos microsserviços que compõem um aplicativo.

Como superar o esgotamento de portas efêmeras no NGINX e no NGINX Plus
NGINX | 19/04/2016

Como superar o esgotamento de portas efêmeras no NGINX e no NGINX Plus

Confira dicas para evitar o esgotamento de portas efêmeras com ajustes no kernel do Linux, conexões keepalive e conexões vinculadas dinamicamente a endereços IP locais.