Obecnie używam okrągłego robota DNS do równoważenia obciążenia, co działa świetnie. Rekordy wyglądają tak (mam TTL 120 sekund)
;; 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
Dowiedziałem się, że nie każdy dostawca usług internetowych / urządzenie traktuje taką odpowiedź w ten sam sposób. Na przykład niektóre serwery DNS losowo zmieniają adresy lub zawsze je zmieniają. Niektóre tylko propagują pierwszy wpis, inne próbują ustalić, który z nich jest najlepszy (regionalnie blisko), patrząc na adres IP.
Jednak jeśli baza użytkowników jest wystarczająco duża (rozłożona na wielu dostawców usług internetowych itp.), Całkiem dobrze się równoważy. Rozbieżności między najwyższym a najniższym obciążeniem serwera prawie nie przekraczają 15%.
Jednak teraz mam problem z tym, że wprowadzam do systemów więcej serwerów i że nie wszystkie mają takie same możliwości.
Obecnie mam tylko serwery 1 Gb / s, ale chcę pracować również z serwerami 100 Mb / s, a także 10 Gb / s.
Chcę więc przedstawić serwer o przepustowości 10 Gb / s i wadze 100, serwer 1 Gb / s o wadze 10 i serwer o przepustowości 100 Mb / s o wadze 1.
Wcześniej dwukrotnie dodawałem serwery, aby zwiększyć do nich ruch (co działało dobrze - przepustowość prawie się podwoiła). Ale dodanie serwera DNS 10 Gb / s 100 razy jest trochę śmieszne.
Pomyślałem więc o użyciu TTL.
Jeśli podam serwerowi A 240 sekund TTL, a serwerowi B tylko 120 sekund (co jest w przybliżeniu minimum do użycia w przypadku rundy okrągłej, ponieważ wiele serwerów DNS ustawionych na 120, jeśli określono niższy TTL (tak słyszałem)). Myślę, że coś takiego powinno wystąpić w idealnym scenariuszu:
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...
Jak widać, to dość skomplikowane do przewidzenia i na pewno nie zadziała tak w praktyce. Ale to zdecydowanie powinno mieć wpływ na dystrybucję!
Wiem, że ważony okrągły robin istnieje i jest po prostu kontrolowany przez serwer root. Po prostu przełącza rekordy DNS podczas odpowiedzi i zwraca rekordy DNS z ustawionym prawdopodobieństwem, które odpowiada ważeniu. Mój serwer DNS nie obsługuje tego, a moje wymagania nie są tak precyzyjne. Jeśli nie waży idealnie, to jest w porządku, ale powinien iść we właściwym kierunku.
Myślę, że użycie pola TTL może być bardziej eleganckim i łatwiejszym rozwiązaniem - i nie wymaga serwera DNS, który kontroluje to dynamicznie, co oszczędza zasoby - co moim zdaniem jest sednem równoważenia obciążenia DNS w porównaniu do równoważenia obciążenia sprzętowego.
Moje pytanie brzmi teraz: czy są jakieś najlepsze praktyki / metody / reguły kciuka do ważenia dystrybucji robin okrągłych przy użyciu atrybutu TTL rekordów DNS?
Edytować:
System jest systemem serwera proxy do przodu. Ilość przepustowości (nie żądań) przekracza to, co może obsłużyć pojedynczy serwer z Ethernetem. Potrzebuję rozwiązania równoważącego, które rozdziela przepustowość na kilka serwerów. Czy są jakieś alternatywne metody niż używanie DNS? Oczywiście mogę użyć modułu równoważenia obciążenia z kanałem światłowodowym itp., Ale koszty są absurdalne, a także zwiększa tylko szerokość wąskiego gardła i go nie eliminuje. Jedyne, co mogę wymyślić, to adresy IP anycast (czy to anycast czy multicast?), Ale nie mam środków, aby skonfigurować taki system.