Le 29/04/2016 11:07, Olivier Macchioni a écrit :
Bonjour la liste,
Bonjour,
Pour ceux qui ne connaissent pas, le Blue-Green Deployment, c'est http://martinfowler.com/bliki/BlueGreenDeployment.html : deux stacks (par exemple LAMP) complètes, en version N et N+1, derrière un Load-Balancer.
[snip]
Je suppose que le problème a déjà été résolu par pas mal de monde... vous faites comment vous ? :)
Pas avec HAProxy :-) Pour le coup j'utilise plutôt varnish pour ça. Dans le cas présent, avec cookie et un header HTTP. (voir plus bas) Cependant, en jettant un œil à la doc, il me semble que l'on peut faire un peu la même chose avec HAProxy en utilisant comme balance rdp-cookie. Mais je connaissais pas cette balance et j'utilise HAProxy pour faire des choses beaucoup plus simples :-)
Pour la façon dont je solutionne ça...
J'ai cette sub que j'appelle ensuite dans le recv : sub blue_green { if (req.http.cookie ~ "m_test=c") { set req.http.X-migration = "c"; } else if (req.http.cookie ~ "m_test=n") { set req.http.X-migration = "n"; } else if (client.ip ~ mynetwork) { set req.http.X-migration = "n"; } else { C{ #include <netinet/in.h> #include <string.h> #include <unistd.h> #include <stdlib.h>
char nc[2]; char *user_agent; in_addr_t s_addr; struct sockaddr_storage client_ip = *(VRT_r_client_ip(sp)); struct sockaddr_in *client_ip_in = (struct sockaddr_in *) &client_ip;
nc[1] = '\0'; user_agent = VRT_GetHdr(sp, HDR_REQ, "\013user-agent:"); if (user_agent != (void*)0 && strstr(user_agent, "Googlebot") != (void*)0) { nc[0] = 'c'; } else { s_addr = ntohl(client_ip_in->sin_addr.s_addr); if (s_addr & 2) nc[0] = 'n'; else nc[0] = 'c'; } VRT_SetHdr(sp, HDR_REQ, "\012X-migration:", nc, vrt_magic_string_end); }C } }
Elle génère un header qui dit "c" (current) ou "n" (next). L'applicatif à la possibilité de générer un cookie m_test avec un petit bouton pour les utilisateurs qui veulent passer à l'une ou l'autre des versions.
Dans mon cas, c'est l'applicatif qui passe en version N ou N+1 en fonction de la requête (c'est varnish qui nous sert de load-balancer), mais je pourrais aussi très bien définir plusieurs director et faire de mon header un déterminant dans le choix d'icelui avec un recv de ce goût là :
sub vcl_recv { call blue_green
if ( req.http.X-migration == "n"; ) { set req.backend = frontal-next; } elif ( req.http.X-migration == "c"; ) { set req.backend = frontal; } }