Atualmente, uso round robin de DNS para balanceamento de carga, o que funciona muito bem.
Os registros se parecem com isso (eu tenho um 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
Aprendi que nem todo ISP / dispositivo trata essa resposta da mesma maneira.
Por exemplo, alguns servidores DNS giram os endereços aleatoriamente ou sempre os percorrem. Alguns apenas propagam a primeira entrada, outros tentam determinar qual é a melhor (regionalmente próxima) olhando o endereço IP.
No entanto, se a base de usuários for grande o suficiente (distribuída por vários ISPs, etc.), ela será bem equilibrada.
As discrepâncias do maior para o menor servidor carregado dificilmente excedem 15%.
No entanto, agora tenho o problema de introduzir mais servidores nos sistemas e nem todos têm as mesmas capacidades.
Atualmente, tenho apenas servidores de 1 Gbps, mas também quero trabalhar com servidores de 100 Mbps e também de 10 Gbps.
Então, o que eu quero é apresentar um servidor com 10 Gbps com peso de 100, um servidor de 1 Gbps com peso de 10 e um servidor de 100 Mbps com peso de 1.
Eu adicionei servidores anteriormente duas vezes para trazer mais tráfego para eles (o que funcionou bem - a largura de banda quase dobrou).
Mas adicionar um servidor de 10 Gbps 100 vezes ao DNS é um pouco ridículo.
Então, pensei em usar o TTL.
Se eu der ao servidor A 240 segundos TTL e servidor B apenas 120 segundos (que é aproximadamente o mínimo para usar round robin, como muitos servidores DNS configurados para 120 se um TTL menor for especificado (então eu ouvi )). Acho que algo assim deveria ocorrer em um cenário 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 você pode ver, isso é bastante complicado de prever e, com certeza, não funcionará assim na prática. Mas definitivamente deve ter um efeito sobre a distribuição!
Eu sei que o round robin ponderado existe e é apenas controlado pelo servidor raiz. Ele apenas percorre os registros DNS ao responder e retorna registros DNS com uma probabilidade definida que corresponde à ponderação. Meu servidor DNS não suporta isso e meus requisitos não são tão precisos. Se não pesa perfeitamente, tudo bem, mas deve ir na direção certa.
Acho que usar o campo TTL poderia ser uma solução mais elegante e fácil - e não exige um servidor DNS que controle isso dinamicamente, o que economiza recursos - que, na minha opinião, é o ponto inteiro do balanceamento de carga DNS versus hardware balanceadores de carga.
A minha pergunta agora é: Existe alguma melhor prática / método / regra para ponderar a distribuição round-robin usando o atributo TTL dos registros DNS?
Editar:
O sistema é um sistema de servidor proxy de encaminhamento.
A quantidade de largura de banda (não solicitações) excede o que um único servidor com Ethernet pode manipular.
Então eu preciso de uma solução de balanceamento que distribua a largura de banda para vários servidores. Existem métodos alternativos do que usar o DNS?
Claro que eu posso usar um balanceador de carga com canal de fibra etc, mas os custos são ridículos e também aumenta apenas a largura do gargalo e não o elimina.
A única coisa em que consigo pensar são os endereços IP anycast (é anycast ou multicast?), Mas não tenho meios para configurar tal sistema.