2016-07-28 10 views
0

Ich habe einen Lack-Cache (Version 4) mit einem Backend, das manchmal "langsam" wird. Ich benutze den Gesundheitscheck, um Lack zu zwingen, veraltete Inhalte aus dem Cache zu holen, wenn dieses Backend "langsam" ist, um es nicht zu sättigen.Warum haben so viele Lackierungen bestanden?

So mi Backend definiert:

backend api { 
    .host = "111.111.111.111"; 
    .port = "80"; 
    .first_byte_timeout = 300s; 
    .probe = { 
      .url = "/some/url"; 
      .expected_response = 200; 
      .timeout = 80ms; 
      .interval = 120s; 
      .window = 1; 
      .threshold = 1; 
    } 

}

backend apibackup { 
    .host = "111.111.111.111"; 
    .port = "80"; 
    .first_byte_timeout = 300s; 
    .probe = { 
      .url = "/some/url"; 
      .expected_response = 200; 
      .timeout = 80ms; 
      .interval = 120s; 
      .window = 1; 
      .threshold = 1; 
    } 

}

Und die Gnade Modus konfigurieren:

sub vcl_hit { 
    if (obj.ttl > 0s) { 
      # A standard hit, deliver from cache 
      return (deliver); 
    } 
    elsif (std.healthy(req.backend_hint)) { 
      if (obj.ttl + 30s > 0s) { 
        # page expired within a limited grace time and backend 
        # is healthy: deliver from cache while cache is updated 
        # asynchronous 
        return (deliver); 
      } else { 
        # page expired too long ago - fetch from backend 
        return (fetch); 
      } 
    } 
    else { 
      if (obj.ttl + obj.grace > 0s) { 
        # backend is not healthy - provide the page from cache 
        # during full grace time set in vcl_backend_response 
        return (deliver); 
      } else { 
        # page expired for the full grace time and backend is 
        # considered unhealthy - try to contact the backend 
        # anyway 

        return (fetch); 
      } 
    } 

}

Aber nur mit dieser Konfiguration, wenn das Backend krank ist und das Objekt nicht im Cache existiert, gibt Lack einen 503 zurück (und ich möchte vom Backend holen). Um dieses Verhalten zu vermeiden, muss ich die gleiche conf in vcl_miss setzen zu zwingen Lack holen Inhalte aus dem „krank“ Backend:

sub vcl_miss{ 

    if (std.healthy(req.backend_hint)) { 
        return (fetch); 
      } 
    else { 
        set req.backend_hint = apibackup; 
        return (fetch); 
      } 

}

Auf diese Weise wird das Ergebnis wie erwartet, wenn Backend langsam Lackieren Sie veraltete Inhalte aus dem Cache und verbessern Sie die Antwortzeiten.

Aber ich entdeckte, dass ich jetzt viel mehr von "pass" Anfrage habe. Fordern Sie natürlich, Lack sollte Caching (und vorher). Aprox * 100 mehr. Also habe ich ein Problem behoben, aber ich habe ein anderes erstellt.

Der Cookie ist nicht gesetzt, sowohl im recv als auch in der Backend-Antwort, um den Lack zum Zwischenspeichern zu zwingen.

Also, meine Frage ist ... Warum habe ich eine Menge Pässe Anfragen? Wie kann ich das dann vermeiden?

Antwort

0

Aber nur mit dieser Konfiguration, wenn das Backend krank ist und das Objekt tun im Cache existiert nicht, Lack gibt eine 503 (und ich möchte von Backend holen). Um dieses Verhalten zu vermeiden, muss ich die gleiche conf in vcl_miss setzen zu zwingen Lack holen Inhalte aus dem „krank“ Backend:

...

Ich denke, diese Annahme falsch ist. Das vcl_miss Unterprogramm entspricht dem eingebauten; Sie führen immer eine return (fetch). Durch das Hinzufügen dieses Codes wird Varnish nicht gezwungen, ein fehlerhaftes Back-End zu verwenden, wenn Grace-Inhalt nicht verfügbar ist. Soweit ich weiß, kann man Varnis gar nicht zwingen, ein krankes Backend zu benutzen.

Ich habe einen Spielzeug-Varnish-Testfall erstellt, um zu zeigen, dass sich mit diesem Code nichts ändert. Varnish wird nie ein sickes Backend verwenden, wenn Grace-Inhalt nicht verfügbar ist und daher eine 503-Antwort an den Client senden wird.

varnishtest "" 

server s1 { 
    rxreq 
    expect req.url == "/1" 
    txresp -body "foo" 
} -start 

varnish v1 -vcl+backend { 
    import std; 

    sub vcl_hit { 
     if (obj.ttl > 0s) { 
      return (deliver); 
     } 
     elsif (std.healthy(req.backend_hint)) { 
      return (deliver); 
     } 
     else { 
      if (obj.ttl + obj.grace > 0s) { 
       return (deliver); 
      } else { 
       return (fetch); 
      } 
     } 
    } 

    # XXX: nonsense subroutine equivalent to the build-in one just to show this 
    # doesn't force Varnish to fetch contents from sick backends. 
    sub vcl_miss{ 
     if (std.healthy(req.backend_hint)) { 
      return (fetch); 
     } else { 
      return (fetch); 
     } 
    } 

    sub vcl_backend_response { 
     set beresp.ttl = 1s; 
     set beresp.grace = 1s; 
    } 
} -start 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

varnish v1 -cliok "backend.set_health s1 sick" 

delay 1.5 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

delay 1.0 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 503 

    txreq -url "/2" 
    rxresp 
    expect resp.status == 503 
} -run 

Aktualisiert Testfall:

varnishtest "" 

server s1 { 
    rxreq 
    expect req.url == "/1" 
    txresp -body "foo" 

    rxreq 
    expect req.url == "/1" 
    txresp -body "foobar" 

    rxreq 
    expect req.url == "/2" 
    txresp -body "hello" 
} -start 

varnish v1 -vcl { 
    import std; 

    backend default { 
     .host = "${s1_addr}"; 
     .port = "${s1_port}"; 
    } 

    backend backup { 
     .host = "${s1_addr}"; 
     .port = "${s1_port}"; 
    } 

    sub vcl_hit { 
     if (obj.ttl > 0s) { 
      return (deliver); 
     } 
     elsif (std.healthy(req.backend_hint)) { 
      return (deliver); 
     } 
     else { 
      if (obj.ttl + obj.grace > 0s) { 
       return (deliver); 
      } else { 
       return (fetch); 
      } 
     } 
    } 

    sub vcl_miss{ 
     if (!std.healthy(req.backend_hint)) { 
      set req.backend_hint = backup; 
     } 
     return (fetch); 
    } 

    sub vcl_backend_response { 
     set beresp.ttl = 1s; 
     set beresp.grace = 1s; 
    } 
} -start 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

varnish v1 -cliok "backend.set_health default sick" 

delay 1.5 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 3 
} -run 

delay 1.0 

client c1 { 
    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 6 

    txreq -url "/1" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 6 

    txreq -url "/2" 
    rxresp 
    expect resp.status == 200 
    expect resp.bodylen == 5 
} -run 

varnish v1 -expect cache_hit == 2 
varnish v1 -expect cache_hitpass == 0 
+0

Sorry, Sie haben Recht. Ich habe ein kleines Detail vergessen. Ich habe ein alternatives Backend (aber das selbe), um Lack zu zwingen, den Inhalt zu holen. –

+0

Danke! Dieses Detail war sehr wichtig :) Ich habe den Testfall so angepasst, dass er deine Einrichtung widerspiegelt und es funktioniert wie erwartet. Ich meine, Inhalte werden aus dem Backup-Backend geholt und der '' cache_hitpass''-Zähler erhöht sich nicht. Wie messen Sie diese "Pass" -Anfragen? –

Verwandte Themen