2008-10-18 7 views
7

Comment les grands sites Web qui ne peuvent pas être complètement apatrides atteignent-ils une évolutivité extrême au niveau du Web?Sharding (sic!) Le niveau Web afin d'éviter un goulot d'étranglement de l'équilibreur de charge?

Il existe des sites comme eBay et Amazon, qui ne peuvent pas être complètement apatrides, car ils ont un panier ou quelque chose comme ça. Il n'est pas possible d'encoder chaque article du panier dans l'URL, et il n'est pas non plus possible d'encoder chaque article dans un cookie et de l'envoyer à chaque connexion. Amazon stocke donc simplement l'identifiant de session dans le cookie envoyé. Donc, je comprends que l'évolutivité du niveau Web d'eBay et Amazon devrait être beaucoup plus difficile que l'évolutivité du moteur de recherche google, où tout peut être codé reposant dans l'URL. D'autre part, tant eBay que Amazon ont évolué de manière absolument massive. La rumeur veut qu'il y ait environ 15 000 serveurs d'application J2EE sur eBay.

Comment ces sites traitent-ils les deux: évolutivité extrême et état? Comme le site est dynamique, il n'est pas possible de faire un simple équilibrage DNS. Donc, on pourrait supposer que ces entreprises ont un équilibreur de charge basé sur le matériel comme BigIP, Netscaler ou quelque chose comme ça, qui est le seul appareil derrière l'adresse IP unique de ce site. Cet équilibreur de charge déchiffrerait le SSL (s'il est codé), inspecterait le cookie et déciderait, en fonction de l'identifiant de session de ce cookie, quel serveur d'applications détient la session de ce client.

Mais cela ne peut tout simplement pas fonctionner car aucun load-balancer ne peut supporter la charge de milliers de serveurs d'applications? J'imagine que même ces équilibreurs de charge matérielle n'atteignent pas un tel niveau.

En outre, l'équilibrage de charge est effectué de façon transparente pour l'utilisateur, c'est-à-dire que les utilisateurs ne sont pas transférés à des adresses différentes, mais restent tout le temps collectivement sur www.amazon.com. Donc ma question est: Y a-t-il un truc spécial avec lequel on peut réaliser quelque chose comme un sharding transparent du niveau web (pas le niveau de la base de données comme cela est fait habituellement)? Tant que le cookie n'est pas inspecté, il est impossible de savoir quel serveur d'applications héberge cette session.

Editer: Je me suis rendu compte qu'il n'y a qu'un besoin de transparence, s'il y a un besoin pour que le site soit spidered et bookmarké. Par exemple. Si le site est une simple application Web, quelque chose comme un système de réservation de billets d'avion ou de train, il ne devrait pas y avoir de problème à simplement rediriger les utilisateurs vers des groupes de serveurs Web spécifiques derrière des URL différentes, par exemple. a17.ticketreservation.com. Dans ce cas précis, il serait possible de simplement utiliser plusieurs clusters de serveurs d'applications, chacun derrière son propre équilibreur de charge. Fait intéressant, je n'ai pas trouvé de site qui utilise ce genre de concept. Modifier: J'ai trouvé ce concept discussed à highscalability.com, où la discussion se réfère à un article de Lei Zhu nommé "Client Side Load Balancing for Web 2.0 Applications". Lei Zhu utilise le script croisé pour équilibrer la charge côté client de manière transparente.

Même s'il y a des inconvénients, comme bookmarking, xss, etc, je pense que cela semble être une très bonne idée pour certaines situations spéciales, à savoir des applications web presque sans contenu, qui ne doivent pas être spidered ou bookmarked (par exemple, systèmes de réservation de billets ou quelque chose comme ça). Ensuite, il n'est pas nécessaire de faire l'équilibrage de charge de manière transparente.

Il pourrait y avoir une simple redirection du site principal vers le serveur, par ex. une redirection de www.ticketreservation.com vers a17.ticketreservation.com. De là, l'utilisateur reste sur le serveur a17. a17 n'est pas un serveur, mais un cluster lui-même, par lequel la redondance pourrait être atteinte.

Le serveur de redirection initial peut lui-même être un cluster derrière un équilibreur de charge. De cette façon, une très grande évolutivité pourrait être atteinte, car l'équilibreur de charge primaire derrière www n'est touché qu'une fois au début de chaque session. Bien sûr, la redirection vers des URLs différentes est extrêmement désagréable, mais avec de simples applications web (qui n'ont pas besoin d'être spidered, deep-bookmark ou deep-bookmarked), cela ne devrait être qu'un problème optique pour l'utilisateur ? Le cluster de redirection a pu interroger la charge des clusters d'applications et adapter les redirections en conséquence, réalisant ainsi l'équilibrage et non la simple répartition de la charge.

Répondre

1

Ea sy. Les serveurs Web, qui sont sans état, sont équilibrés en charge. Les serveurs d'application (niveau intermédiaire), qui contiennent les données de session, ne le sont pas. Les serveurs Web peuvent utiliser votre cookie d'identifiant de session pour déterminer le serveur d'application à contacter. Memcached et Microsoft Velocity sont des produits qui répondent précisément à ce besoin.

Éditer: Comment un serveur Web sait-il quel serveur d'applications contacter? Ceci est intégré dans le hash d'ID de session, et peut être génériquement fait comme vous le souhaitez. Cela pourrait être aussi simple que l'identifiant de votre session étant server: guid. Memcached base le hachage, cependant. Le bit important est que le client doit être capable de comprendre quel serveur d'application à contacter sans état. Le moyen le plus simple de le faire est de l'incorporer dans la clé, même si un registre (peut-être sur son propre niveau) fonctionnerait aussi bien et pourrait fournir une certaine tolérance aux pannes.

Édition2: En remontant sur some Ebay interviews, j'ai peut-être mal compris les détails de leur implémentation. Ils ne font pas de mise en cache, et ils ne font pas d'état au niveau intermédiaire. Ce qu'ils font, c'est d'avoir un niveau intermédiaire de charge équilibrée (serveurs d'applications) partitionné par fonction. Ainsi, ils auraient un pool de serveurs pour, par exemple, l'affichage des éléments. Et puis une autre piscine pour vendre des articles. Ces serveurs d'application ont une liste d'accès direct "intelligente" qui achemine vers des bases de données partagées (partitionnées par fonction et par données, donc Utilisateurs A-L sur Base de données1, Utilisateurs M-Z sur Base de données2, Articles 1-10000 sur Articles1, etc.).

Ils n'ont pas d'état dans le niveau intermédiaire car ils sont partitionnés par fonction. Ainsi, une expérience utilisateur normale impliquerait plus d'un pool de serveurs d'applications. Supposons que vous visualisiez un élément (ViewAppServerPool), puis que vous souhaitiez enchérir sur un élément (BidAppServerPool). Tous ces serveurs d'applications doivent rester synchronisés, ce qui nécessite un cache distribué pour tout gérer. Mais, leur taille est si grande qu'aucun cache distribué ne peut la gérer efficacement, pas plus qu'un seul serveur de base de données. Cela signifie qu'ils doivent partitionner le niveau de données et que toute implémentation de cache doit être répartie sur les mêmes limites.

Ceci est similaire à ce que j'ai posté ci-dessus, juste déplacé vers le bas d'une couche. Au lieu de demander au serveur Web de déterminer le serveur d'applications à contacter, le serveur d'applications détermine la base de données à contacter. Seulement, dans le cas d'Ebay, il pourrait en réalité toucher plus de 20 serveurs de bases de données en raison de leur stratégie de partition. Mais, encore une fois, le niveau des apatrides a une sorte de règle (s) qu'il utilise pour contacter le niveau stateful. Les règles d'Ebay, cependant, sont un peu plus compliquées que la règle simpliste "User1 is on Server10" que j'expliquais ci-dessus.

+0

Comment les serveurs Web sans état trouvent-ils le bon serveur d'applications? Chaque serveur Web doit-il connaître chaque session hébergée par un serveur d'applications? Ce ne serait pas cette communication terrifiante? – SAL9000

+0

Les équilibreurs de charge utilisent votre ID de session ou votre adresse IP comme entrée pour choisir le serveur d'applications. Si chaque programme d'équilibrage de charge a le même algorithme pour choisir le serveur d'application, peu importe sur quelle loadbalancer vous allez, vous serez toujours envoyé au même serveur d'applications. Aucune communication entre le serveur d'applications et l'équilibreur de charge impliqués. –

2

Vous auriez sans doute d'être sur l'équipe d'ingénierie à l'un de ces endroits pour en être sûr, mais il y a des gens qui ont fait des suppositions éclairées de discussions et d'autres informations qui est sortie des deux lieux:

Ebay Architecture Un simple équilibreur de charge par lui-même dans le monde d'aujourd'hui est un peu l'équivalent du DNS round robin des années passées. Aujourd'hui, vous avez des choses comme anycast qui vous permettent de jouer toutes sortes de trucs. Vous pouvez être sûr que les ebay et amazon utilisent des load balancers et qu'ils en utilisent beaucoup.

Vous voudrez peut-être le réduire un peu plus lorsque vous pensez à comment cela pourrait fonctionner parce qu'une grande partie du trafic est sans état. Dans une seule requête pour une page, il y a potentiellement beaucoup d'objets qui n'ont pas besoin de connaître l'état. Enlevez ces objets de l'image en les servant à partir d'un système sans état (c'est là qu'intervient l'anycast) et le nombre de demandes diminue considérablement.

Si cela ne vous permet pas de savoir qu'un seul équilibreur de charge peut gérer la charge, alors l'étape suivante consiste à interrompre les transactions en utilisant le routage IP et/ou le géo-DNS. Des sites aussi importants que eBay et Amazon seront dans un certain nombre de centres de données différents avec un grand nombre de connexions Internet à chacun. Vous prenez tout ce qui vient d'internet pop quest-west et l'envoyez aux serveurs de quêtes de la datacenter de la côte ouest, tout ce qui est att-west est envoyé aux serveurs "att" du centre de données de la côte ouest. Chacun de ces systèmes pourrait être un îlot d'équilibrage de charge capable de gérer la charge, certains des équilibreurs de charge peuvent gérer des centaines de milliers de transactions par seconde, même cryptées par SSL. Au verso, vous répliquez en masse sur chaque centre de données, mais cela peut être désynchronisé.

+0

Oui, j'ai lu les deux articles sur highscalability.com. J'ai posté cette question car je n'étais pas en mesure de trouver quelque chose sur l'équilibrage de la charge là-bas. Anycast est certainement beaucoup plus avancé que round-robin, mais aussi ne fournit pas l'équilibrage de charge avec état, si je comprends bien. – SAL9000

2

Vous trouverez peut-être utile le document suivant, qui présente la conception et la mise en œuvre d'un système de stockage clé-valeur hautement disponible que certains services de base d'Amazon utiliser pour fournir un « toujours sur » l'expérience:

Giuseppe DeCandia, Deniz Hastorun, Madan Jampani, Gunavardhan Kakulapati, Avinash Lakshman, Alex Pilchin, Swami Sivasubramanian, Peter Vosshall et Werner Vogels, « Dynamo: Amazon's Highly Available Key-Value Store », dans les Actes du 21e Symposium ACM sur les systèmes d'exploitation Principes, Stevenson, WA, Octobre 2007.

2

Je ne sais pas comment ils le font, mais voici quelques suggestions:

  • Pour éviter de surcharger un hôte d'équilibrage de charge lui-même, utilisez DNS round-robin OU
  • Rediriger différents clients à différents adresses de cluster en fonction de la charge, les paramètres, la géolocalisation, etc

Pour répartir la charge de niveau intermédiaire,

  • Intégrez l'ID du serveur de session de niveau intermédiaire dans le cookie de session ID - comme d'autres l'ont suggéré. De cette façon, la boîte frontale que vous touchez n'est pas pertinente, elle peut être ajoutée/supprimée sans aucun impact.
  • Si cela est suffisamment important, ayez un mécanisme de redirection des clients vers un autre serveur de niveau intermédiaire au cours d'une session, de sorte que l'un d'entre eux puisse être supprimé pour maintenance, etc.
  • Les clients commencent à utiliser un serveur de niveau intermédiaire nouvellement mis en service comme ils commencent une nouvelle session

Pour distribuer arrière base de données fin charge

  • sharding « classique » de « temps réel » par compte ou par -données utilisateur
  • Réplication asynchrone de données à évolution lente ou relativement statiques; les utilisateurs pourraient le voir démodé (mais pas beaucoup la plupart du temps). Les serveurs de niveau intermédiaire et Web se connectent à une base de données locale à leur propre emplacement
Questions connexes