O verniz pode ignorar hit-for-pass quando os backends estão doentes

1

Existe uma maneira de fazer com que o Varnish 4 ignore qualquer objeto hit-for-pass no cache se todos os back-ends tiverem sido marcados como "doentes"?

Aqui está o cenário de falhas que estou tentando melhorar:

  • No início, os back-ends estão saudáveis e se comportando bem, retornando conteúdo válido com status de 200. O verniz armazena essas páginas em cache e as atende de acordo com seu TTL.
  • Algo quebra, digamos que uma consulta de banco de dados começa a demorar mais que o normal. Os backends começam a devolver as páginas lentamente. Então, eventualmente, solicita o início do tempo limite, e os backends começam a retornar "Internal Server Error" (status 500).
  • O Varnish vê essas respostas e as marca como hit-for-pass com um TTL de 120s, de acordo com as padrão vcl_backend_response .
  • Finalmente, as verificações de saúde entram em ação, e Varnish eventualmente marca todos os backends doentes.
  • Agora, à medida que mais solicitações chegam, o Varnish vê um objeto hit-for-pass no cache e decide que precisa fazer uma busca de back-end. Exceto que todos os back-ends estão doentes, então isso resulta em uma "recuperação de Back-end 503 com falha".
    Essas 503 respostas continuam por até 2 minutos, dependendo do tempo da primeira resposta não armazenável em cache (marcado como hit-for-pass) e quando os backends ficam marcados como doentes.
  • Depois que os objetos hit-for-pass expirarem do cache (120s), o Varnish começará a tratar essas solicitações como ocorrências regulares novamente e exibirá as páginas em cache de 200 status no modo de graça (de acordo com o default vcl_hit -" if (obj.ttl + obj.grace > 0) .... )

Uma solução que resolvi é encurtar o TTL de objetos hit-for-pass se eles vierem de uma resposta de status 500:

sub vcl_backend_response {
  if (beresp.ttl <= 0s && beresp.status == 500) {
    set beresp.ttl = 10s;
    set beresp.uncacheable = true;
    # return inside this if statement to allow builtin vcl_backend_response to run
    return (deliver);
  }
}

Outras possibilidades são ajustar o intervalo e o limite das verificações de saúde ou obter uma melhor verificação de integridade.

Mas além disso, existe uma maneira de dizer explicitamente ao Varnish "sim, você tem um hit-para-passe, mas olhe - todos os backends estão doentes! Não se incomode, mude para o modo graça agora".

    
por larcher 01.09.2015 / 22:25

1 resposta

2

Se você quiser esse comportamento, evite criar objetos hit-for-pass quando receber 500 respostas do back-end .

Vamos supor que (1) você esteja sempre solicitando o mesmo URL / objeto em cache X; e (2) o objeto X está atualmente armazenado no armazenamento do verniz com um TTL de 1h e uma cortesia de 24h. Vamos agora assumir a seguinte linha do tempo:

  • t = 0: algumas solicitações do cliente X para Varnish. O objeto já está em cache e está fresco, então o Varnish o retorna ao cliente. Não há solicitações de back-end.
  • t = 1: o back-end é quebrado e responde a partir de agora com 500 solicitações.
  • t = 3601: algumas solicitações do cliente X para verniz. O objeto é armazenado em cache, mas parado, então Varnish o retorna ao cliente e aciona uma solicitação de back-end em segundo plano para atualizar o objeto em cache X.
  • t = 3602: a solicitação de back-end em segundo plano recebe uma resposta 500. Um objeto hit-for-pass é armazenado com um TTL de 120s. Este objeto sobrescreve o objeto parado X.
  • t = 3603: alguns pedidos do cliente X para verniz. Um objeto hit-for-pass é encontrado e uma solicitação de back-end é executada. Uma resposta 500 é enviada para o lado do cliente.
  • t = 4000: alguns pedidos do cliente X para verniz. O objeto X não está mais em cache e o backend foi marcado como doente há algum tempo. Uma resposta 503 será enviada para o lado do cliente: O verniz não pode entrar em contato com o back-end (está marcado como doente) e o Varnish não pode retornar o conteúdo da cortesia (foi substituído pelo objeto hit-for-pass em t = 3602).

A solução aqui seria evitar criar objetos hit-for-pass quando você receber 500 respostas do back-end. Em vez disso, simplesmente abandone a solicitação. Dessa forma, em t = 3603 e t = 4000, você enviará uma cópia paralisada do objeto para o lado do cliente.

    
por 02.09.2015 / 11:19

Tags