Equilibrio de carga de un servidor UDP

10

Tengo un servidor udp, es una parte central de mi proceso comercial. Para manejar las cargas que espero en el entorno de producción, probablemente necesitaré 2 o 3 instancias del servidor. El servidor está casi completamente sin estado, principalmente recopila datos y la capa superior sabe cómo manejar la cantidad mínima de datos obsoletos que pueden surgir de las instancias de múltiples servidores.

Mi pregunta es, ¿cómo puedo implementar el equilibrio de carga entre los servidores? Preferiría distribuir las solicitudes de la manera más uniforme posible entre los servidores. También me gustaría tener algo de fidelidad, es decir, si el cliente X fue enrutado al servidor y, entonces quiero que todas las solicitudes posteriores de X vayan al servidor Y, siempre que sea razonable y no sobrecargue Y.

Por cierto, es un sistema .NET ... ¿qué recomendarías?


el estado es interno dentro de los servidores, no una transacción de algún tipo. el estado son algunos datos que los servidores agregan a partir de los datos que reciben, y se puede extraer con un simple servicio web WCF. La aplicación se basa en UDP, y aunque no estoy de acuerdo con la decisión, es "Por encima de mi nivel de pago"

Actualmente estoy probando NLB de MS, funciona bien, hace la fidelidad fuera de la caja, pero genera ruido en toda la red ...

Tampoco hay DNS ... Ah, y es un protocolo completamente disfrazado.

Escarcha infernal
fuente
Solo una nota para referencia futura: los moderadores y los usuarios de alta reputación pueden mover las preguntas entre los sitios de stackexchange en muchos casos. Esto ayuda a preservar las respuestas que ya se colocaron, por lo que generalmente es mejor que volver a publicar por su cuenta (a menos que no haya respuestas, en cuyo caso elimine la pregunta anterior para que nadie la responda accidentalmente). Si está de acuerdo con una sugerencia para moverse, simplemente agregue un comentario a ese efecto y (si es posible) marque su publicación para atención del moderador, y la publicación debería terminar movida por usted.
bdonlan

Respuestas:

4

Tengo un servidor udp, el servidor [...] está casi completamente sin estado [...] tiene cierta fidelidad, es decir, si el cliente X fue enrutado al servidor y, entonces quiero que todas las solicitudes posteriores de X vayan al servidor Y, como siempre que sea sensato y no sobrecargue Y.

Entonces, ¿está utilizando un protocolo de aplicación no revelado que mantiene cierto estado de la aplicación y se ejecuta sobre UDP? Estás yendo en una dirección difícil. UDP no es un transporte de datos confiable, de eso se trata: para un transporte de datos confiable, consulte a su popular amigo TCP. La única forma en que puede obtener su 'fidelidad' es tener un proxy de equilibrio de carga que comprenda el protocolo de la capa de aplicación y que sepa cuál es el estado actual de su aplicación y pueda actuar en consecuencia.

Veo 3 enfoques que se acercan a proporcionar lo que busca:

  • Distribuya estáticamente las conexiones entrantes en 3 direcciones IP, según la dirección IP de origen (usuario final). De esta manera, un usuario determinado siempre será dirigido al mismo servidor. La mayoría de los firewalls profesionales pueden hacer esto por usted. Es posible que tenga que hacer que los 3 servidores estén altamente disponibles usted mismo, ya que la mayoría de los cortafuegos no harán las comprobaciones de estado del back-end por usted.

  • Use DNS, y use DNS Round Robin, como ya lo sugirió Matt Simmons.

  • Utilice el equilibrio de carga de red (NLB) integrado de Windows . Honestamente, no sé cómo se desarrollaría el escenario de conmutación por error con NLB y su servicio basado en UDP semiestado: tendría que investigarlo usted mismo, en función de cómo su aplicación maneja el estado. En el lado positivo, NLB es muy fácil de configurar, sin cargo con la licencia de Windows, maduro y con buen rendimiento.

Jesper M
fuente
edité mi pregunta
Hellfrost el
6

Linux Virtual Server es un servidor altamente escalable y altamente disponible construido en un clúster de servidores reales. LVS admite el protocolo UDP y el algoritmo hash de origen (esto se usa cuando desea que un cliente aparezca siempre en el mismo servidor real).

Yo uso LVM para equilibrar DNS (rr), SIP (sh).

alvosu
fuente
4

Interesante. La mayoría del software proxy que he visto está basado en TCP.

La mayor parte del equilibrio de carga específico de UDP que he visto en mi escasa experiencia se ha basado en DNS (es decir, servidores de tiempo, servidores DNS, etc.). ¿Hay alguna forma de proporcionar múltiples registros A? Si eso funcionara, el DNS Round Robin normal garantizaría una distribución justa de las solicitudes (probablemente lo suficientemente justo, de todos modos) y el almacenamiento en caché del cliente garantizaría que se mantuviera la fidelidad (suponiendo que esté utilizando una plataforma basada en caché en el extremo del cliente).

Matt Simmons
fuente
no hay DNS en absoluto.
Hellfrost
2

Puede utilizar cualquier tipo de equilibrador de carga para realizar esto, ya sea hardware o software, puede elegir entre diferentes equilibradores de carga según lo que necesite.

Equilibrador de carga de nivel 3: equilibrará la carga solo mirando la IP entrante y las IP de back-end disponibles, este tipo de equilibrador de carga garantizará la adherencia al enviar siempre la misma dirección IP entrante al mismo back-end, aunque este tipo de estrategia puede sobrecargar una de los backends si muchos clientes se comunican desde la misma IP (ya sea un proxy o una puerta de enlace corporativa)

Equilibrador de carga de nivel 7 : un equilibrador de carga de nivel 7 no solo se equilibrará como un equilibrador de nivel 3, sino que también analizará el contenido del paquete, lo que le dará mucha más flexibilidad para sus políticas de equilibrio.

Teniendo en cuenta que está utilizando UDP, ambos equilibradores deberían dar un buen rendimiento, también la inspección profunda de paquetes en UDP es un poco más limitada que en TCP (solo por razones de protocolo).

Dependiendo de su presupuesto, puede comenzar utilizando un equilibrador de carga de software (Linux + IPVS, por ejemplo) y luego comenzar a utilizar equilibradores de carga de hardware como los ofrecidos por Cisco o Netapp

Lynxman
fuente
-1 para la parte L7. Un equilibrador de carga de capa / nivel 7 funciona en la capa de aplicación, pero dado que OP está usando UDP, no está usando HTTP antiguo y no ha revelado qué aplicación está usando. No podemos saber que existe un equilibrador de carga L7 para el protocolo que OP está utilizando.
Jesper M
1
Solo estaba comentando sus opciones en equilibradores de carga, y no sabemos qué está usando sobre UDP, creo que estás reduciendo esta demasiado;)
lynxman
Hay algo entre NLB / linux y Cisco / netapp: equilibradores de carga KEMP. Puede obtener una edición virtual que no cuesta toneladas de dinero, la estamos usando y estamos muy contentos.
pauska
2

El NGINX de código abierto y la plataforma de entrega de aplicaciones, NGINX Plus ahora admiten el equilibrio de carga UDP. La nueva capacidad se basa en nuestras capacidades TCP y HTTP existentes, lo que convierte a NGINX en un frontend potente, fácil de usar y consistente para una gama aún más amplia de aplicaciones y dispositivos de Internet.

Disponible en la versión nginx-1.9.13

anish
fuente