haproxy: come preparare la manutenzione di un server senza avviare sessioni di app?


13

Il problema

Sto usando haproxy per caricare i server web di bilanciamento. Uso la persistenza della sessione con cookie aggiuntivi poiché alcune applicazioni utilizzano file di sessione e questi non sono sincronizzati tra i server.

Voglio disabilitare un server per la manutenzione, ma senza interrompere le sessioni. Quindi vorrei consentire ai client esistenti di continuare la loro sessione di applicazione, ma non accettare nuovi client.

comportamento haproxy

  • Ho impostato un server su "andare in manutenzione"
  • se un client ha il cookie impostato, utilizzare il server anche se contrassegnato come "in manutenzione"
  • se arriva un nuovo client (senza cookie), viene indirizzato a un altro server
  • dopo che tutti i client hanno terminato le loro sessioni applicative, nessun client avrebbe impostato il cookie su questo particolare server e sarei bravo a spegnerlo senza l'interruzione dell'utente.

Pensi che ciò sia realizzabile con una configurazione haproxy? O c'è un modo intelligente per farlo?

Altri modi

Elenco non esaustivo di altri modi per soddisfare questa esigenza:

  • sincronizzare i file di sessione tra server (è necessario un modo per sincronizzare i file tra più server o un singolo mountpoint comune)
  • utilizzare il database per memorizzare le informazioni sulla sessione (è necessario modificare il comportamento dell'applicazione)

Più dettagli

Uso questo tipo di configurazione:

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check

Se disabilito solo SRV1 (con il comando haproxy cli), penso che tutte le sessioni dell'applicazione aperte su SRV1 si interrompano dopo la fine dell'attuale "sessione" HTTP. È giusto?


Il tuo server è in esecuzione in modalità HTTP o TCP?
austinian,

1
@austinian; Probabile modalità http visto come parla di bilanciamento e persistenza basata sui cookie (la modalità TCP non offre tali funzionalità).
GregL

@Christophe, hai effettivamente provato la configurazione descritta nella sezione "comportamento haproxy", perché dovrebbe funzionare.
GregL

@GregL, giusto, è quello che sto pensando anch'io. Se sta usando la modalità HTTP e imposta semplicemente il server sulla modalità di manutenzione, smetterà di accettare nuove sessioni ma manterrà attive le sessioni valide fino alla loro scadenza. Puoi ancora avere i cookie, ecc. In modalità TCP, ma non significa nulla per HAProxy.
austinian,

@Christophe, stai cercando di usare "un modo più intelligente" per ridurre i tempi di manutenzione o stai solo cercando un modo per far terminare le sessioni con grazia mentre aspetti di fare la manutenzione?
austinian,

Risposte:


6

Metti il ​​server in modalità drain usando l'interfaccia di gestione web. Ciò fornisce la funzionalità esatta che stai cercando.


3
Se si imposta su Maint, sta andando a interrompere l'invio di qualsiasi traffico ad esso, come descritto qui . Piuttosto, vorrebbe metterlo in modalità Drain e usare a stick-tablecon scadenza per fornire persistenza.
GregL,

@GregL, oops, aggiustamento ora
austinian

Grazie per la tua risposta, austinian e @GredL. Ci proverò. La parte difficile sarà con il tavolo da biliardo, credo. Dovrò trovare un modo per archiviare ogni client con il cookie impostato sul server in modalità drain in questa tabella stick.
Christophe Drevet-Droguet,

Bene, sembra che nel mio caso la modalità di svuotamento sia sufficiente, le sessioni che hanno già impostato il cookie utilizzano ancora il server svuotato e le nuove sessioni vengono indirizzate ad altri server.
Christophe Drevet-Droguet,

1
Come si cambiano le modalità nell'interfaccia Web? Sembra essere solo informativo.
Kagronick,

9

Se usi socat per comunicare con le tue configurazioni haproxy, puoi mettere un server nello stato di drain nel modo seguente:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

Più comandi qui ! Per installare socat in Ubuntu vai a questa risposta

Lo provo con la versione 1.6.3 di haproxy :)


1

Altri modi

sincronizzare i file di sessione tra server (è necessario un modo per sincronizzare i file tra più server o un singolo mountpoint comune)

Se i tuoi server back-end utilizzano PHP per le applicazioni, puoi utilizzare Memcache per sincronizzare le sessioni tra di loro.

Inoltre Couchbase-Server può eseguire immediatamente la replica di memcache.
Ovviamente è un po 'eccessivo usare couchbase-server solo per la replica delle sessioni :)


Anche se sarebbe un modo migliore, ha bisogno di modifiche al codice, penso. Quindi userò austinian e GregL, la risposta per le nostre attuali applicazioni che non sincronizzano le sessioni.
Christophe Drevet-Droguet,

Se il tuo codice non imposta un gestore di sessioni personalizzato, non è necessario modificare alcun codice affinché PHP utilizzi memcache per le sessioni. È tutto configurato in php.ini, non nel codice.
Cha0s

OK, Cha0s, lo guarderò.
Christophe Drevet-Droguet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.