14
Varnish & blue/green deployments Faire glisser l'image vers l'espace réservé ou cliquer sur l'icône

Varnish & blue/green deployments

  • Upload
    oxalide

  • View
    1.174

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Varnish & blue/green deployments

Varnish & blue/green deployments

Faire glisser l'image vers l'espace réservé ou cliquer sur l'icône pour l'ajouter

Page 2: Varnish & blue/green deployments

$ whoami

Oxalide

Conseil, Infogérance & HébergementMedia / SaaS / E-commerce

Varnish everywhere

Consultant Architecture & DevOps

Théo [email protected] @MrTrustor

Page 3: Varnish & blue/green deployments

blue/green deployments

Page 4: Varnish & blue/green deployments

Déploiement blue/green• Zero-downtime deployment• Facilite le rollback• Facilite le canary-testing

App v1 App v2

Load Balancer

Page 5: Varnish & blue/green deployments

Exemple avec TomcatApp v1 App v2

Tomcat Parallel Deployment

Catalina

Sessions déjà existantes

Nouvelles sessions

Page 6: Varnish & blue/green deployments

Avec Varnish

Page 7: Varnish & blue/green deployments

Et avec Varnish ?

Mix du cache des 2 versions→ Solution ? Canary-testing ?

App v1 App v2

VarnishCache app v1Cache app v2

Page 8: Varnish & blue/green deployments

Ébauche de solution

• Séparation du cache entre les versions → vcl_hash

• Varnish doit connaître la version de l’application

→ L’application doit exposer sa version

$ curl http://mon.app/version11a3e229084349bc25d97e29393ced1d

Page 9: Varnish & blue/green deployments

Solution : vmod curl !

import curl;

sub vcl_recv { if (req.url == "/version") { return(pass); } curl.header_add("Host: "+req.http.host); curl.get("http://localhost/version"); if (curl.status() == 200) { set req.http.X-Version = curl.body(); } else { error 500 "Internal Server Error"; } curl.free();}

sub vcl_hash { hash_data(req.http.X-Version); return(hash);}

Toujours la dernière version car pas de session !

Page 10: Varnish & blue/green deployments

Un curl par requête ? Hmm…On peut faire mieux !

sub app_version { if (req.http.Cookie ~ "version=") { set req.http.X-Version = \ regsub(req.http.Cookie, ".*version=([^;]+).*", "\1"); } else {

[algo avec curl]

}}

Le cookie « version » est ajouté par :• L’application• Ou vcl_deliver

Page 11: Varnish & blue/green deployments

Si on récapitule…

Un « ancien » utilisateur :• Cookie → X-Version• HIT ou MISS• On réécrit le cookie

« version » dans tous les cas

Un « nouvel » utilisateur :• Appel curl → X-Version• HIT ou MISS• On écrit le cookie « version »

Page 12: Varnish & blue/green deployments

Mise en production d’une nouvelle version

temps

# sess

ions

MeP green Undeploy blue

# ob

jets

MeP green

temps

Prune blue

hitra

te

MeP green

temps

Page 13: Varnish & blue/green deployments

Et en vrai ?

MeP

Page 14: Varnish & blue/green deployments

README

• Cluster Tomcat : http://bit.ly/1Nol9Qo

• Cluster-wide deployment : http://bit.ly/1T7hPsg

Blog Oxalide

• Part 1 : http://bit.ly/1WkQVRP• Part 2 : http://bit.ly/1WkQXsG