Attualmente uso DNS round robin per il bilanciamento del carico, che funziona alla grande. I record sembrano così (ho un TTL di 120 secondi)
;; 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
Ho imparato che non tutti gli ISP / dispositivi trattano tale risposta allo stesso modo. Ad esempio, alcuni server DNS ruotano gli indirizzi in modo casuale o li scorrono sempre. Alcuni semplicemente propagano la prima voce, altri cercano di determinare quale sia il migliore (a livello regionale) guardando l'indirizzo IP.
Tuttavia, se la base di utenti è abbastanza grande (si estende su più ISP, ecc.) Si equilibra abbastanza bene. Le discrepanze dal server dal più alto al più basso non superano quasi mai il 15%.
Tuttavia ora ho il problema di introdurre più server nei sistemi e che non tutti hanno le stesse capacità.
Al momento ho solo server da 1 Gbps, ma voglio lavorare anche con server a 100 Mbps e anche a 10 Gbps.
Quindi quello che voglio è introdurre un server con 10 Gbps con un peso di 100, un server da 1 Gbps con un peso di 10 e un server da 100 Mbps con un peso di 1.
In precedenza avevo aggiunto due volte server per portare più traffico su di loro (il che funzionava bene - la larghezza di banda quasi raddoppiava). Ma aggiungere un server da 10 Gbps 100 volte al DNS è un po 'ridicolo.
Quindi ho pensato di usare il TTL.
Se do al server A 240 secondi TTL e al server B solo 120 secondi (che è circa il minimo da utilizzare per il round robin, poiché molti server DNS impostati su 120 se viene specificato un TTL inferiore (quindi ho sentito)). Penso che qualcosa del genere dovrebbe accadere in uno scenario ideale:
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...
Come puoi vedere, diventa piuttosto complicato da prevedere e di sicuro non funzionerà in questo modo nella pratica. Ma dovrebbe sicuramente avere un effetto sulla distribuzione!
So che esiste un round robin ponderato ed è controllato dal root server. Passa semplicemente attraverso i record DNS durante la risposta e restituisce i record DNS con una probabilità impostata che corrisponde alla ponderazione. Il mio server DNS non supporta questo e i miei requisiti non sono così precisi. Se non pesa perfettamente va bene, ma dovrebbe andare nella giusta direzione.
Penso che l'utilizzo del campo TTL possa essere una soluzione più elegante e più semplice, e non richiede un server DNS che lo controlla in modo dinamico, risparmiando risorse, che è a mio avviso il punto centrale del bilanciamento del carico DNS rispetto ai bilanciatori del carico hardware.
La mia domanda ora è: ci sono buone pratiche / metodi / regole empiriche per ponderare la distribuzione round robin usando l'attributo TTL dei record DNS?
Modificare:
Il sistema è un sistema proxy server forward. La quantità di larghezza di banda (non richieste) supera ciò che può gestire un singolo server con Ethernet. Quindi ho bisogno di una soluzione di bilanciamento che distribuisca la larghezza di banda su più server. Esistono metodi alternativi rispetto all'utilizzo del DNS? Ovviamente posso usare un bilanciamento del carico con Fibre Channel ecc., Ma i costi sono ridicoli e aumenta anche solo la larghezza del collo di bottiglia e non lo elimina. L'unica cosa a cui riesco a pensare sono gli indirizzi IP anycast (anycast o multicast?), Ma non ho i mezzi per configurare un tale sistema.