2008-10-18 13 views
7

¿Cómo los grandes sitios web que no pueden ser completamente apátridas logran una escalabilidad extrema en el nivel web?Sharding (sic!) El nivel web para evitar un cuello de botella de equilibrio de carga?

Hay sitios como eBay y Amazon, que no pueden ser completamente apátridas, ya que tienen un carrito de compras o algo así. No es factible codificar cada elemento en el carrito de compras en la URL, ni es factible codificar cada elemento en una cookie y enviarlo en cada conexión. Entonces Amazon simplemente almacena el ID de sesión en la cookie que se envía. Así que entiendo que la escalabilidad del nivel web de eBay y Amazon debería ser mucho más difícil que la escalabilidad del motor de búsqueda de Google, donde todo puede codificarse en la URL.

Por otro lado, tanto eBay como Amazon escalaron de forma absolutamente masiva. Se rumorea que hay unos 15000 servidores de aplicaciones J2EE en eBay.

¿Cómo manejan estos sitios ambos: escalabilidad y estado extremos? Como el sitio es estable, no es factible hacer un simple DNS-Balancing. Entonces uno podría suponer que estas compañías tienen un equilibrador de carga basado en hardware como BigIP, Netscaler o algo así, que es el único dispositivo detrás de la única dirección IP de ese sitio. Este equilibrador de carga descifraría el SSL (si está codificado), inspeccionaría la cookie y decidiría según el id. De sesión de esa cookie cuyo servidor de aplicaciones tenga la sesión de ese cliente.

¿Pero esto simplemente no puede funcionar ya que ningún equilibrador de carga podría manejar la carga de miles de servidores de aplicaciones? Me imagino que incluso estos equilibradores de carga de hardware no se escalan a tal nivel.

Además, el balanceo de carga se realiza de forma transparente para el usuario, es decir, los usuarios no se reenvían a direcciones diferentes, pero todos permanecen colectivamente en www.amazon.com todo el tiempo.

Así que mi pregunta es: ¿hay algún truco especial con el que se pueda lograr algo así como una fusión transparente del nivel web (no el nivel de la base de datos como se hace comúnmente)? Siempre que la cookie no se inspeccione, no hay manera de saber qué servidor de aplicaciones está llevando a cabo esta sesión.

Edit: Me di cuenta de que solo hay necesidad de transparencia, si es necesario que el sitio se filtre y se marque como favorito. P.ej. si el sitio es una mera aplicación web, algo así como un avión o un sistema de reserva de boletos de tren, no debería haber ningún problema con solo redirigir a los usuarios a grupos específicos de servidores web detrás de diferentes URL, p. a17.ticketreservation.com. En este caso específico, sería posible usar múltiples clústeres de servidores de aplicaciones, cada uno detrás de su propio equilibrador de carga. Curiosamente, no encontré un sitio que utiliza este tipo de concepto. Edit: Encontré este concepto discussed en highscalability.com, donde la discusión se refiere a un artículo de Lei Zhu llamado "Client Side Load Balancing for Web 2.0 Applications". Lei Zhu usa scripts cruzados para hacer este balance de carga del lado del cliente de forma transparente.

Incluso si hay inconvenientes, como marcadores, xss, etc., creo que esto suena como una muy buena idea para ciertas situaciones especiales, es decir, aplicaciones web casi sin contenido, que no son necesarias para ser spidered o marcadas (por ejemplo, sistemas de reserva de boletos o algo así). Entonces no hay necesidad de hacer el balanceo de carga de forma transparente.

Podría haber un simple redireccionamiento del sitio principal al servidor, p. una redirección de www.ticketreservation.com a a17.ticketreservation.com. A partir de ahí, el usuario permanece en el servidor a17. a17 no es un servidor, sino un clúster en sí mismo, por el cual se puede lograr la redundancia.

El servidor de redirección inicial podría ser un clúster detrás de un equilibrador de carga. De esta forma, se podría lograr una escalabilidad realmente alta, ya que el equilibrador de carga primario detrás de www solo se golpea una vez al comienzo de cada sesión.

Por supuesto, la redirección a diferentes URL parece extremadamente desagradable, pero con simples aplicaciones web (que no necesitan ser spidered, deep-linked o deep-bookmarked de todos modos), esto debería ser solo un problema óptico para el usuario ?

El redirect-cluster podría sondear la carga de los clústeres de aplicaciones y adaptar los redireccionamientos en consecuencia, logrando así el equilibrio y no la distribución de la mera carga.

Respuesta

1

Ea sy. Los servidores web, que son apátridas, tienen equilibrio de carga. Los servidores de aplicaciones (nivel medio), que contienen los datos de la sesión, no lo son. Los servidores web pueden usar su cookie de identificación de sesión para determinar a qué servidor de aplicaciones contactar.

Memcached y Microsoft's Velocity son productos que resuelven esta necesidad exacta.

Editar: ¿Cómo sabe un servidor web a qué servidor de aplicaciones contactar? Esto está incrustado en el hash de identificación de sesión, y se puede hacer de manera genérica como quieras. Podría ser tan simple como que tu id de sesión sea server: guid. Memcached lo basa en el hash, sin embargo.

Lo importante es que el cliente tiene que ser capaz de averiguar a qué servidor de aplicaciones contactar de forma apátrida. La forma más fácil de hacerlo es insertarlo en la clave, aunque un registro (tal vez en su propio nivel) funcionaría también y podría proporcionar cierta tolerancia a las fallas.

Edit2: Volviendo sobre some Ebay interviews, puedo haber obtenido los detalles de su implementación un poco mal. No hacen el almacenamiento en caché, y no hacen estado en el nivel medio. Lo que hacen es tener un nivel intermedio de carga equilibrada (servidores de aplicaciones) dividido por funciones. Por lo tanto, tendrían un grupo de servidores para, por ejemplo, ver elementos. Y luego otro grupo para vender artículos. Esos servidores de aplicaciones tienen un DAL "inteligente" que se dirige a bases de datos fragmentadas (particionadas tanto por función como por datos; usuarios A-L en Base de datos1, Usuarios M-Z en Base de datos2, Elementos 1-10000 en Items1, etc.).

No tienen estado en el nivel medio porque están particionados por función. Por lo tanto, una experiencia de usuario normal implicaría más de 1 grupo de servidores de aplicaciones. Supongamos que ve un elemento (ViewAppServerPool) y luego va a pujar por un artículo (BidAppServerPool). Todos esos servidores de aplicaciones tendrían que estar sincronizados, lo que requiere una memoria caché distribuida para administrar todo. Sin embargo, su escala es tan grande que ninguna memoria caché distribuida podría administrarla de manera efectiva, ni tampoco un solo servidor de base de datos. Esto significa que tienen que fragmentar el nivel de datos, y cualquier implementación de caché debería dividirse en los mismos límites.

Ésta es similares a lo que he publicado anteriormente, justo movido por una capa. En lugar de que el servidor web determine a qué servidor de aplicaciones contactar, el servidor de la aplicación determina qué base de datos contactar. Solo que, en el caso de Ebay, podría llegar a más de 20 servidores de bases de datos debido a su estrategia de partición. Pero, de nuevo, el nivel sin estado tiene algún tipo de regla (s) que usa para contactar al nivel de estado. Las reglas de Ebay, sin embargo, son un poco más complicadas que la regla simplista de "Usuario1 está en el Servidor10" que estaba explicando más arriba.

+0

¿Cómo encuentran los servidores web sin estado el servidor de aplicaciones correcto? ¿Cada servidor web tiene que saber sobre cada sesión que tiene cualquier servidor de aplicaciones? ¿No sería esta horrible comunicación por encima? – SAL9000

+0

Los balanceadores de carga usan su identificación de sesión o posible su dirección IP como entrada para elegir el servidor de la aplicación. Si cada equilibrador de carga tiene el mismo algoritmo para elegir el servidor de la aplicación, no debería importar a qué equilibrador de carga que vaya, siempre se lo enviará al mismo servidor de aplicaciones. No hay comunicación entre el servidor de aplicaciones y el equilibrador de carga involucrado. –

2

probablemente tendría que estar en el equipo de ingeniería en uno de estos lugares para saber a ciencia cierta, pero hay personas que han hecho conjeturas de las conversaciones y demás información que ha salido de los dos lugares:

Ebay Architecture y Amazon Architecture

Un solo equilibrador de carga en sí mismo en el mundo de hoy es una especie de equivalente de DNS round robin de años pasados. Hoy tienes cosas como anycast que te permiten jugar todo tipo de trucos. Puede estar bastante seguro de que los gustos de eBay y Amazon usan equilibradores de carga y usan muchos de ellos.

Es posible que desee reducirlo un poco más cuando se piensa en cómo podría funcionar, ya que gran parte del tráfico es apátrida. En una sola solicitud de una página, hay potencialmente muchos objetos que no necesitan saber sobre el estado. Elimine esos objetos de la imagen y preséntelos desde un sistema sin estado (aquí es donde entra la difusión ilimitada) y el número de solicitudes disminuye drásticamente.

Si eso no lo lleva al punto en que un solo equilibrador de carga puede manejar la carga, entonces el siguiente paso es romper las transacciones utilizando enrutamiento IP y/o geo-DNS. Sitios tan grandes como eBay y Amazon estarán en varios centros de datos diferentes con una gran cantidad de conexiones a Internet en cada uno. Tomas todo lo que viene de internet pop quest-west y lo envías a los servidores de búsqueda del centro de datos de la costa oeste, cualquier cosa de att-west se envía a los servidores "att" del centro de datos de la costa oeste, cualquier cosa desde misiones hacia el este y luego hacia los servidores de "misiones" del centro de datos de la costa este, etc. Cada uno de esos sistemas podría ser una isla, un solo equilibrador de carga que podría manejar la carga, algunos equilibradores de carga pueden manejar cientos de miles de transacciones por segundo, incluso cifrado SSL. En la parte posterior se replica constantemente en cada centro de datos, pero puede estar fuera de sincronización.

+0

Sí, leí ambos artículos en highscalability.com. Publiqué esta pregunta ya que no pude encontrar nada sobre el equilibrio de carga allí. Anycast es seguramente mucho más avanzado que round robin, pero tampoco proporciona equilibrio de carga con estado, según tengo entendido. – SAL9000

2

Usted puede encontrar útil el siguiente documento, que se presenta el diseño e implementación de un sistema de almacenamiento de valor clave de alta disponibilidad que algunas de utilización de servicios básicos de Amazon para proporcionar una “always-on” la experiencia:

Giuseppe Decandia, Deniz Hastorun, Madan Jampani, Gunavardhan Kakulapati, Avinash Lakshman, Alex Pilchin, Swami Sivasubramanian, Peter Vosshall y Werner Vogels, “Dynamo: Amazon's Highly Available Key-Value Store”, en las Actas de la 21ª Simposio ACM sobre Principios de Sistemas operativos, Stevenson, WA, Octubre de 2007.

2

No sé cómo lo hacen, pero aquí hay algunas sugerencias:

  • Para evitar la sobrecarga de un mismo anfitrión equilibrador de carga, utilizan la rotación en DNS O
  • Redirigir a los diferentes clientes en diferentes direcciones de clúster en base a la carga, configuración, geolocalización, etc.

Para distribuir la carga de etapa intermedia,

  • Incruste la ID del servidor de sesión de nivel medio dentro de la cookie de ID de sesión, como otros han sugerido. De esta forma, la caja frontal que aciertes es irrelevante, pueden agregarse/eliminarse sin ningún impacto.
  • Si es lo suficientemente importante, tenga un mecanismo de redirigir a los clientes a un servidor alternativo de nivel medio durante una sesión para que se pueda quitar para mantenimiento, etc.
  • clientes empiezan a utilizar un servidor de etapa intermedia de reciente puesta a medida que empiezan una nueva sesión

Para distribuir la espalda de carga base de datos de extremo

  • sharding "convencional" de "tiempo real" para cada cuenta o por -user data
  • Repite de forma asincrónica datos que cambian lentamente o son relativamente estáticos; los usuarios pueden verlo desactualizado (pero no mucho la mayor parte del tiempo). Los servidores web y de nivel medio se conectan a una base de datos local en su propia ubicación
Cuestiones relacionadas