Come viene raggiunta la viscosità della sessione su più server Web?


23

Quanti server Web ha StackOverflow / ServerFault?

Se la risposta è "più di una", ottiene la viscosità della sessione durante il polling DNS?


Non proprio, ma se fosse formulato diversamente, potrebbe fare una domanda interessante.

Dovresti riformulare la domanda. Modificare il titolo in "Come si ottiene la viscosità della sessione su più server Web?" o qualcosa del genere ...
William Brendel, il

potresti farmi un favore per mostrarmi la frase giusta?

1
Il presupposto che avere più server implichi sessioni appiccicose - che sono un abominio - mi fa male.
Womble

Risposte:


42

I siti Web di grandi dimensioni possono essere "bilanciati in base al carico" su più macchine. In molte configurazioni con bilanciamento del carico, un utente può colpire qualsiasi macchina back-end durante una sessione. Per questo motivo, esistono numerosi metodi per consentire a molte macchine di condividere sessioni utente.

Il metodo scelto dipenderà dallo stile di bilanciamento del carico impiegato, nonché dalla disponibilità / capacità dello storage back-end:

Informazioni sulla sessione memorizzate solo nei cookie : le informazioni sulla sessione (non solo un identificatore di sessione) sono memorizzate nel cookie di un utente. Ad esempio, il cookie dell'utente potrebbe contenere il contenuto del proprio carrello. Per impedire agli utenti di manomettere i dati della sessione, è possibile che venga fornito un HMAC insieme al cookie. Questo metodo è probabilmente il meno adatto per la maggior parte delle applicazioni:

  • Non è necessario alcun archivio back-end
  • L'utente non deve colpire la stessa macchina ogni volta, quindi è possibile utilizzare il bilanciamento del carico DNS
  • Non esiste alcuna latenza associata al recupero delle informazioni sulla sessione da un computer di database (poiché viene fornito con la richiesta HTTP). Utile se il tuo sito è bilanciato dal carico di macchine in diversi continenti.
  • La quantità di dati che è possibile archiviare nella sessione è limitata (dal limite della dimensione dei cookie 4K)
  • La crittografia deve essere utilizzata se un utente non dovrebbe essere in grado di vedere i contenuti della propria sessione
  • HMAC (o simile) deve essere impiegato per prevenire la manomissione dei dati della sessione da parte dell'utente
  • Poiché i dati della sessione non sono memorizzati sul lato server, è più difficile per gli sviluppatori eseguire il debug

Il servizio di bilanciamento del carico indirizza sempre l'utente sullo stesso computer : molti servizi di bilanciamento del carico possono impostare il proprio cookie di sessione, indicando da quale computer back-end un utente sta facendo richieste e indirizzandolo a quel computer in futuro. Poiché l'utente è sempre indirizzato alla stessa macchina, non è richiesta la condivisione della sessione tra più macchine. Questo può essere buono in alcune situazioni:

  • Potrebbe non essere necessario modificare la gestione della sessione di un'applicazione esistente per diventare a conoscenza di più macchine
  • Non è richiesto alcun sistema di database condiviso (o simile) per l'archiviazione delle sessioni, aumentando probabilmente l'affidabilità, ma a costo della complessità
  • Una macchina back-end in discesa eliminerà tutte le sessioni utente avviate su di essa, con essa.
  • Mettere fuori servizio le macchine è più difficile. Gli utenti con sessioni su una macchina da smontare per manutenzione dovrebbero essere autorizzati a completare le loro attività, prima che la macchina venga spenta. A supporto di ciò, i bilanciatori del carico Web possono avere una funzione per "svuotare" le richieste a un determinato computer back-end.

Database back-end condiviso o archivio chiave / valore : le informazioni sulla sessione sono archiviate in un database back-end, a cui tutti i server Web hanno accesso a query e aggiornamenti. Il browser dell'utente memorizza un cookie contenente un identificatore (come l'ID sessione), che punta alle informazioni sulla sessione. Questo è probabilmente il metodo più pulito dei tre:

  • L'utente non deve mai essere esposto alle informazioni sulla sessione memorizzata.
  • L'utente non deve colpire la stessa macchina ogni volta, quindi è possibile utilizzare il bilanciamento del carico DNS
  • Uno svantaggio è il collo di bottiglia che può essere collocato su qualsiasi sistema di archiviazione back-end.
  • Le informazioni sulla sessione potrebbero essere scadute e il backup sarà coerente.

Nel complesso, la maggior parte delle applicazioni Web dinamiche esegue una serie di query del database o richieste di archivio chiave / valore, quindi il database o l'archivio chiave / valore è la posizione di archiviazione logica dei dati della sessione.


2
+1 Risposta abbastanza completa e mi fa risparmiare scrivendola. :) Per quanto riguarda lo storage db, un database relazionale è probabilmente la cosa sbagliata. Qualcosa come una delle forcelle memcached persistenti è meglio. memcachedb potrebbe essere adatto. Hai anche perso la replica delle informazioni sulla sessione tra i server. Non è il metodo migliore, ma cose come Tomcat lo fanno, quindi vale la pena documentarlo.
David Pashley,

Quale approccio viene utilizzato da Google, Twitter o Facebook?
Dannyboy,

1
Non sono sicuro di Google, Twitter o Facebook, ma Redis è perfetto per un negozio di sessioni. Fondamentalmente è il "persistente memcached" che David Pashley stava raccomandando nel 2009, quando Redis era embrionale.
Ben R,

4

Se la domanda è come mantenere le sessioni su più server Web front-end, la risposta è in genere utilizzare un database centralizzato. Invece di fare affidamento sulle istanze del server Web per tenere traccia dei file di sessione sui file system locali, scrivere gli ID di sessione e i dati in un DB centrale e tutti i server Web recupererebbero invece i dati da lì.


+1 per menzionare il database centralizzato. Solo per espandere / semplificare un po 'quell'idea. Se si imposta un cookie sul PC di un utente con qualcosa di unico come un ID utente globale, è possibile archiviare tale GUID in un database. Non importa a quale server si connette un client, purché dispongano del GUID / cookie, sarà possibile cercarli nel database e tracciare la sessione di conseguenza.
KPWINC,

2
La memorizzazione di sessioni in un database relazionale è sempre una cattiva idea. Non utilizzare database per l'archiviazione di dati temporanei.
David Pashley,



0

Puoi impostare un cookie.

È possibile calcolare un hash dell'IP remoto (nei suoi host remoti con numero dispari più semplice passare al server A, host con numero pari andare al server B).

Sembra che tu possa farlo anche tramite alcuni valori che rimangono con il sistema sorgente se stai usando un tunnel SSL.

In genere, ciascuno dei meccanismi sopra descritti richiede un server "proxy inverso" o un bilanciamento del carico di qualche tipo. Il servizio di bilanciamento del carico accetta il traffico e lo indirizza a qualsiasi server inizialmente aveva la sessione, in base a uno dei criteri sopra indicati.

Non sono sicuro, tuttavia, che cosa intendi per "polling DNS"


0

a) È possibile memorizzare le informazioni sulla sessione nel cookie dell'utente. Vedi i cookie induriti senza stato, che non memorizzano dati sul lato server, ma conservano lo stato della sessione http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . b) È possibile modificare l'archivio back-end della sessione in database o memcached. Per eliminare il singolo punto di errore, è possibile impostare la replica del database o più nodi memcached. Si noti che memcached è raccomandato in tali configurazioni in cui perdere lo stato dell'utente in sessione non è un grosso errore e non lo rende molto infelice. Per i casi in cui preservare lo stato è vitale, utilizzare i database. Sia PHP, Django che Rails consentono agli sviluppatori di scrivere backend di sessione personalizzati.

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.