Atualmente, uso o round robin do DNS para balanceamento de carga, o que funciona muito bem. Os registros ficam assim (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 alternam os endereços aleatoriamente ou sempre os alternam. Alguns apenas propagam a primeira entrada, outros tentam determinar qual é o melhor (regionalmente próximo) observando o endereço IP.
No entanto, se a base de usuários for grande o suficiente (se espalha por vários ISPs etc.), ela se equilibra muito bem. As discrepâncias do servidor carregado do mais alto para o mais baixo quase nunca ultrapassam 15%.
No entanto, agora eu tenho o problema de introduzir mais servidores nos sistemas e que 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 10 Gbps.
Então, o que eu quero é introduzir um servidor com 10 Gbps com um peso de 100, um servidor de 1 Gbps com um peso de 10 e um servidor de 100 Mbps com um peso de 1.
Eu adicionei servidores duas vezes anteriormente 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 o servidor A 240 segundos TTL e o servidor B apenas 120 segundos (o que é quase o mínimo para usar o round robin, como muitos servidores DNS configurados para 120 se um TTL inferior for especificado (pelo que ouvi dizer)). Eu acho que algo assim deve 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 fica bastante complicado de prever e com certeza não funcionará dessa maneira na prática. Mas definitivamente deve ter um efeito na 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 pesar perfeitamente, tudo bem, mas deve seguir na direção certa.
Eu 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, economizando recursos - o que, na minha opinião, é o ponto principal do balanceamento de carga DNS versus balanceadores de carga de hardware.
Minha pergunta agora é: Existem práticas recomendadas / métodos / regras práticas para ponderar a distribuição de rodízios 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 suportar. Então, preciso de uma solução de balanceamento que distribua a largura de banda para vários servidores. Existem métodos alternativos para usar o DNS? É claro que posso usar um balanceador de carga com canal de fibra etc., mas os custos são ridículos e também aumentam apenas a largura do gargalo e não o eliminam. A única coisa em que consigo pensar são nos endereços IP anycast (é anycast ou multicast?), Mas não tenho os meios para configurar esse sistema.