Comment l'adhérence de session est-elle atteinte sur plusieurs serveurs Web?

23

Combien de serveurs Web possède StackOverflow / ServerFault?

Si la réponse est `` plus d'un '', est-ce que cela permet d'obtenir l' adhérence de session lors de l'interrogation DNS?

p.campbell
la source
Pas vraiment, mais s'il était formulé différemment, cela pourrait poser une question intéressante.
Vous devriez reformuler la question. Remplacez le titre par "Comment l'adhérence de session est-elle atteinte sur plusieurs serveurs Web?" ou quelque chose comme ça ...
William Brendel
pourriez-vous me faire une faveur pour me montrer la bonne phrase?
1
L'hypothèse selon laquelle avoir plusieurs serveurs implique des sessions persistantes - qui sont une abomination - me fait mal.
womble

Réponses:

42

Les grands sites Web peuvent être «à charge équilibrée» sur plusieurs machines. Dans de nombreuses configurations à charge équilibrée, un utilisateur peut toucher n'importe quelle machine principale pendant une session. Pour cette raison, un certain nombre de méthodes existent pour permettre à de nombreuses machines de partager des sessions utilisateur.

La méthode choisie dépendra du style d'équilibrage de charge utilisé, ainsi que de la disponibilité / capacité du stockage backend:

Informations de session stockées dans les cookies uniquement : les informations de session (pas seulement un identifiant de session) sont stockées dans le cookie d'un utilisateur. Par exemple, le cookie de l'utilisateur peut contenir le contenu de son panier. Pour empêcher les utilisateurs de falsifier les données de session, un HMAC peut être fourni avec le cookie. Cette méthode est probablement la moins adaptée à la plupart des applications:

  • Aucun stockage backend n'est requis
  • L'utilisateur n'a pas besoin de frapper la même machine à chaque fois, donc l'équilibrage de charge DNS peut être utilisé
  • Il n'y a aucune latence associée à la récupération des informations de session à partir d'une machine de base de données (car elle est fournie avec la requête HTTP). Utile si votre site est équilibré en charge par des machines sur différents continents.
  • La quantité de données pouvant être stockées dans la session est limitée (par la limite de taille des cookies 4K)
  • Le cryptage doit être utilisé si un utilisateur ne peut pas voir le contenu de sa session
  • HMAC (ou similaire) doit être utilisé pour empêcher la falsification par l'utilisateur des données de session
  • Étant donné que les données de session ne sont pas stockées côté serveur, il est plus difficile pour les développeurs de déboguer

L'équilibreur de charge dirige toujours l'utilisateur vers la même machine : de nombreux équilibreurs de charge peuvent définir leur propre cookie de session, indiquant de quelle machine d'arrière-plan un utilisateur fait la demande et les diriger vers cette machine à l'avenir. Étant donné que l'utilisateur est toujours dirigé vers la même machine, le partage de session entre plusieurs machines n'est pas requis. Cela peut être bon dans certaines situations:

  • Il n'est peut-être pas nécessaire de modifier la gestion de session d'une application existante pour prendre en compte plusieurs machines
  • Aucun système de base de données partagé (ou similaire) n'est requis pour le stockage des sessions, augmentant éventuellement la fiabilité, mais au prix de la complexité
  • Une machine principale en panne supprimera toutes les sessions utilisateur démarrées avec elle.
  • La mise hors service des machines est plus difficile. Les utilisateurs dont les sessions sur une machine doivent être retirées pour maintenance doivent être autorisés à terminer leurs tâches avant que la machine ne soit éteinte. Pour prendre en charge cela, les équilibreurs de charge Web peuvent avoir une fonctionnalité pour "drainer" les demandes vers une certaine machine backend.

Base de données principale partagée ou magasin de clés / valeurs : les informations de session sont stockées dans une base de données principale, à laquelle tous les serveurs Web ont accès pour interroger et mettre à jour. Le navigateur de l'utilisateur stocke un cookie contenant un identifiant (tel que l'ID de session), pointant vers les informations de session. C'est probablement la méthode la plus propre des trois:

  • L'utilisateur n'a jamais besoin d'être exposé aux informations de session stockées.
  • L'utilisateur n'a pas besoin de frapper la même machine à chaque fois, donc l'équilibrage de charge DNS peut être utilisé
  • Un inconvénient est le goulot d'étranglement qui peut être placé sur le système de stockage dorsal utilisé.
  • Les informations de session peuvent expirer et être sauvegardées de manière cohérente.

Dans l'ensemble, la plupart des applications Web dynamiques exécutent un certain nombre de requêtes de base de données ou de demandes de magasin de clés / valeurs, de sorte que la base de données ou le magasin de clés / valeurs est l'emplacement de stockage logique des données de session.

Tommeh
la source
2
+1 Réponse assez complète et m'évite de l'écrire. :) En ce qui concerne le stockage db, une base de données relationnelle est probablement la mauvaise chose. Quelque chose comme l'une des fourches memcached persistantes est meilleure. memcachedb pourrait convenir. Vous avez également manqué la réplication des informations de session entre les serveurs. Ce n'est pas la meilleure méthode, mais des choses comme tomcat le font, donc vaut la peine d'être documentée.
David Pashley
Quelle approche est utilisée par Google, Twitter ou Facebook?
Dannyboy
1
Je ne suis pas sûr de Google, Twitter ou Facebook, mais Redis convient parfaitement à un magasin de sessions. C'est fondamentalement le "memcached persistant" que David Pashley recommandait en 2009, lorsque Redis était embryonnaire.
Ben R du
4

Si votre question est de savoir comment gérer les sessions sur plusieurs serveurs Web frontaux, la réponse est généralement d'utiliser une base de données centralisée. Au lieu de compter sur les instances du serveur Web pour suivre les fichiers de session sur les systèmes de fichiers locaux, vous écririez les identifiants de session et les données dans une base de données centrale, et tous les serveurs Web récupéreraient les données à partir de là.

zombat
la source
+1 pour avoir mentionné la base de données centralisée. Juste pour développer / simplifier un peu cette idée. Si vous définissez un cookie sur le PC d'un utilisateur avec quelque chose d'unique tel qu'un ID utilisateur global, vous pouvez ensuite stocker ce GUID dans une base de données. Peu importe le serveur auquel un client se connecte, tant qu'ils ont le GUID / cookie, vous pourrez les rechercher dans la base de données et suivre la session en conséquence.
KPWINC le
2
Stocker des sessions dans une base de données relationnelle est toujours une mauvaise idée. Vous ne devez pas utiliser de bases de données pour stocker des données transitoires.
David Pashley
2

L'utilisation de nemcached semble être une bonne solution pas comme mentionné par @David Pashley

Cela signifie avoir une instance memcached distante partagée par tous les serveurs et utiliser l'extension memcache PECL qui fournit son propre gestionnaire de session.

Il suffit de changer deux paramètres dans la configuration php!

Voici un bon tutoriel http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/

Tristan
la source
Mais qu'est-ce qu'il y a plusieurs centres de données?
Dannyboy
0

IIRC, dans DotNetRocks # 440, ils ont dit une période de serveur. Je ne sais pas si c'est toujours le cas.

Edit: En fait, c'était Hanselminutes # 134 . Désolé.

ongle
la source
0

Vous pouvez définir un cookie.

Vous pouvez calculer un hachage de l'adresse IP distante (au plus simple, les hôtes distants impairs vont au serveur A, les hôtes pairs vont au serveur B).

Il semble que vous pouvez également le faire via certaines valeurs qui restent avec le système source si vous utilisez un tunnel SSL.

En règle générale, chacun des mécanismes ci-dessus nécessite un serveur "proxy inverse" ou un équilibreur de charge quelconque. Cet équilibreur de charge accepte le trafic, puis le dirige vers le serveur qui avait initialement la session, en fonction de l'un des critères ci-dessus.

Je ne sais pas, cependant, ce que vous entendez par "interrogation DNS"

chris
la source
0

a) Vous pouvez stocker les informations de session dans le cookie utilisateur. Voir les cookies durcis sans état, qui ne stockent aucune donnée côté serveur, mais préservent l'état de la session http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . b) Vous pouvez changer le stockage de backend de session en base de données ou memcached. Pour éliminer un point de défaillance unique, vous pouvez définir la réplication de la base de données ou plusieurs nœuds memcached. Notez que memcached est recommandé dans de telles configurations où perdre l'état de l'utilisateur en session n'est pas une grosse erreur et ne le rend pas très mécontent. Pour les cas où la préservation de l'état est vitale, utilisez des bases de données. PHP, Django et Rails permettent au développeur d'écrire un backend de session personnalisé.

Kristaps
la source