Actualmente uso DNS round robin para el equilibrio de carga, que funciona muy bien. Los registros se ven así (tengo un TTL de 120 segundos)
;; ANSWER SECTION:
orion.2x.to. 116 IN A 80.237.201.41
orion.2x.to. 116 IN A 87.230.54.12
orion.2x.to. 116 IN A 87.230.100.10
orion.2x.to. 116 IN A 87.230.51.65
Aprendí que no todos los ISP / dispositivos tratan esa respuesta de la misma manera. Por ejemplo, algunos servidores DNS rotan las direcciones al azar o siempre las cambian. Algunos simplemente propagan la primera entrada, otros intentan determinar cuál es el mejor (regionalmente cercano) mirando la dirección IP.
Sin embargo, si la base de usuarios es lo suficientemente grande (se extiende sobre múltiples ISP, etc.) se equilibra bastante bien. Las discrepancias entre el servidor cargado más alto y el más bajo casi no superan el 15%.
Sin embargo, ahora tengo el problema de que estoy introduciendo más servidores en los sistemas y que no todos tienen las mismas capacidades.
Actualmente solo tengo servidores de 1 Gbps, pero quiero trabajar con servidores de 100 Mbps y también de 10 Gbps.
Entonces, lo que quiero es presentar un servidor con 10 Gbps con un peso de 100, un servidor de 1 Gbps con un peso de 10 y un servidor de 100 Mbps con un peso de 1.
Anteriormente agregué servidores dos veces para atraerles más tráfico (lo que funcionó bien, el ancho de banda casi se duplicó). Pero agregar un servidor de 10 Gbps 100 veces a DNS es un poco ridículo.
Entonces pensé en usar el TTL.
Si le doy al servidor A 240 segundos TTL y el servidor B solo 120 segundos (que es aproximadamente el mínimo que se debe usar para round robin, ya que muchos servidores DNS se configuran en 120 si se especifica un TTL más bajo (así lo he oído)). Creo que algo así debería ocurrir en un escenario ideal:
First 120 seconds
50% of requests get server A -> keep it for 240 seconds.
50% of requests get server B -> keep it for 120 seconds
Second 120 seconds
50% of requests still have server A cached -> keep it for another 120 seconds.
25% of requests get server A -> keep it for 240 seconds
25% of requests get server B -> keep it for 120 seconds
Third 120 seconds
25% will get server A (from the 50% of Server A that now expired) -> cache 240 sec
25% will get server B (from the 50% of Server A that now expired) -> cache 120 sec
25% will have server A cached for another 120 seconds
12.5% will get server B (from the 25% of server B that now expired) -> cache 120sec
12.5% will get server A (from the 25% of server B that now expired) -> cache 240 sec
Fourth 120 seconds
25% will have server A cached -> cache for another 120 secs
12.5% will get server A (from the 25% of b that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of b that now expired) -> cache 120 secs
12.5% will get server A (from the 25% of a that now expired) -> cache 240 secs
12.5% will get server B (from the 25% of a that now expired) -> cache 120 secs
6.25% will get server A (from the 12.5% of b that now expired) -> cache 240 secs
6.25% will get server B (from the 12.5% of b that now expired) -> cache 120 secs
12.5% will have server A cached -> cache another 120 secs
... I think I lost something at this point, but I think you get the idea...
Como puede ver, esto se vuelve bastante complicado de predecir y seguramente no funcionará así en la práctica. ¡Pero definitivamente debería tener un efecto en la distribución!
Sé que existe un round robin ponderado y solo es controlado por el servidor raíz. Simplemente recorre los registros DNS al responder y devuelve registros DNS con una probabilidad establecida que corresponde a la ponderación. Mi servidor DNS no es compatible con esto, y mis requisitos no son tan precisos. Si no pesa perfectamente, está bien, pero debe ir en la dirección correcta.
Creo que usar el campo TTL podría ser una solución más elegante y fácil, y no requiere un servidor DNS que controle esto dinámicamente, lo que ahorra recursos, que en mi opinión es el punto central del equilibrio de carga de DNS frente a los equilibradores de carga de hardware.
Mi pregunta ahora es: ¿Existen mejores prácticas / métodos / reglas generales para ponderar la distribución por turnos utilizando el atributo TTL de los registros DNS?
Editar:
El sistema es un sistema de servidor proxy directo. La cantidad de ancho de banda (no solicitudes) excede lo que puede manejar un solo servidor con Ethernet. Por lo tanto, necesito una solución de equilibrio que distribuya el ancho de banda a varios servidores. ¿Hay algún método alternativo que no sea usar DNS? Por supuesto, puedo usar un equilibrador de carga con canal de fibra, etc., pero los costos son ridículos y también aumenta solo el ancho del cuello de botella y no lo elimina. Lo único que se me ocurre son las direcciones IP de difusión directa (¿es variable o multidifusión?), Pero no tengo los medios para configurar dicho sistema.