Ho sempre usato DNS Round-Robin, con un lungo TTL, come bilanciamento del carico. Funziona davvero bene per i servizi HTTP / HTTPS con i browser .
Mi stresso molto con i browser poiché la maggior parte dei browser implementa una sorta di "riprova su un altro IP", ma non so come altre biblioteche o software gestiranno la soluzione IP multipla.
Quando il browser non riceve una risposta da un server, chiamerà automaticamente il prossimo IP, quindi si attaccherà con esso (fino a quando non è inattivo ... e quindi prova un altro).
Nel 2007, ho fatto il seguente test:
- aggiungere un iframe sul mio sito Web, indicando una voce Round-Robin, come ad esempio
http://roundrobin.test:10080/ping.php
- la pagina era servita da 3 socket PHP, in ascolto su 3 IP diversi, tutti sulla porta 10080 (non potevo permettermi di testare sulla porta 80, poiché il mio sito Web era in esecuzione su di essa)
- un socket (diciamo A ) era lì per verificare che il browser potesse connettersi sulla porta 10080 (poiché molte aziende consentono solo porte standard)
- altri due socket (diciamo B e C ) potrebbero essere abilitati o disabilitati al volo.
L'ho lasciato funzionare un'ora, avevo molti dati. I risultati furono che per il 99,5% degli hit sul socket A , ho avuto un hit su entrambi i socket B o C (ovviamente non li ho disabilitati entrambi contemporaneamente). I browser erano: iPhone, Chrome, Opera, MSIE 6/7/8, BlackBerry, Firefox 3 / 3.5 ... Quindi anche i browser non conformi lo stavano gestendo correttamente!
Fino ad oggi, non l'ho mai più testato, ma forse un giorno configurerò un nuovo test o rilascerò il codice su github in modo che altri possano provarlo.
Nota importante: anche se è di lavoro la maggior parte del tempo, non rimuove il fatto che alcune richieste potranno fallire. Lo uso anche per richieste POST, poiché la mia applicazione restituirà un messaggio di errore nel caso in cui non funzioni, in modo che l'utente possa inviare nuovamente i dati e molto probabilmente il browser utilizzerà un altro IP in questo caso e il salvataggio funzionerà . E per i contenuti statici, funziona davvero alla grande.
Quindi, se lavori con i browser, usa Round-Robin DNS, sia per contenuti statici che dinamici, per lo più andrà bene. I server possono anche scendere nel mezzo di una transazione e anche con il miglior bilanciamento del carico non è possibile gestire un caso del genere. Per i contenuti dinamici, devi rendere le tue sessioni / database / file sincroni, altrimenti non sarai in grado di gestirlo (ma questo è vero anche con un vero bilanciamento del carico).
Nota aggiuntiva: è possibile testare il comportamento sul proprio IP utilizzando iptables
. Ad esempio, prima della regola del firewall per il traffico HTTP, aggiungi:
iptables -A INPUT -p tcp --dport 80 --source 12.34.56.78 -j REJECT
(dov'è 12.34.56.78
ovviamente il tuo IP)
Non utilizzare DROP
, in quanto lascia la porta filtrata e il browser attenderà fino al timeout. Quindi ora puoi abilitare o disabilitare un server o l'altro. Il test più ovvio è disabilitare il server A, caricare la pagina, quindi abilitare il server A e disabilitare il server B. Quando caricherai di nuovo la pagina, vedrai una piccola attesa dal browser, quindi verrà caricata dal server A ancora. In Chrome, puoi confermare l'IP del server osservando la richiesta nel pannello di rete. Nella General
scheda di Headers
, vedrai un'intestazione falsa denominata Remote Address:
. Questo è l'IP da cui hai ricevuto una risposta.
Quindi, se devi passare in modalità di manutenzione su un server, disabilita semplicemente il traffico HTTP / HTTPS con una iptables
REJECT
regola, tutte le richieste andranno ad altri server (con una piccola attesa, quasi impercettibile per gli utenti).