В даний час я використовую круглу машину DNS для балансування навантаження, яка чудово працює. Записи виглядають приблизно так (у мене TTL 120 секунд)
;; 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
Я дізнався, що не кожен провайдер / пристрій трактує таку відповідь однаково. Наприклад, деякі DNS-сервери обертають адреси випадковим чином або завжди перебирають їх. Деякі просто розповсюджують перший запис, інші намагаються визначити, що найкраще (регіонально поблизу), переглянувши IP-адресу.
Однак якщо база користувачів досить велика (поширюється на кілька провайдерів тощо), вона врівноважує досить добре. Розбіжності від найвищого до найнижчого завантаженого сервера майже не перевищують 15%.
Однак зараз у мене є проблема, що я впроваджую в сервери більше серверів, і що не всі мають однакові потужності.
Наразі у мене є лише 1 Gbps-сервери, але я хочу працювати зі 100 Mbps, а також 10 Gbps-серверами.
Тому я хочу представити сервер з 10 Гбіт / с масою 100, сервер 1 Гбіт / с вагою 10 і сервер 100 Мбіт / с вагою 1.
Раніше я двічі додавав сервери, щоб приносити їм більше трафіку (що працювало непогано - пропускна здатність майже в два рази). Але додавання 10-Гбіт-сервера 100 разів до DNS трохи смішно.
Тому я подумав про використання TTL.
Якщо я даю серверу A 240 секунд TTL, а серверу B лише 120 секунд (це приблизно мінімум, який потрібно використовувати для круглої роботи, оскільки багато DNS-серверів встановлено на 120, якщо вказано нижчий TTL (так я чув). Я думаю, що щось подібне має відбуватися в ідеальному сценарії:
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...
Як ви бачите, це стає досить складно передбачити, і це точно не вийде, як це на практиці. Але це безумовно повинно впливати на розподіл!
Я знаю, що зважений круглої робін існує і просто контролюється кореневим сервером. Він просто циркулює записи DNS під час відповіді та повертає записи DNS із заданою ймовірністю, що відповідає зважуванню. Мій сервер DNS не підтримує це, і мої вимоги не такі точні. Якщо вона не важить ідеально, це добре, але вона повинна йти в правильному напрямку.
Я думаю, що використання поля TTL може бути більш елегантним та простішим рішенням, і для цього не потрібен DNS-сервер, який динамічно керує цим, що дозволяє економити ресурси, - на мою думку, вся суть балансування навантаження DNS проти балансирів навантаження обладнання.
Зараз у мене запитання: чи є найкращі практики / методи / правила розповсюдження великого кругообігу за допомогою вагомого атрибута записів DNS?
Редагувати:
Система - система прямого проксі-сервера. Обсяг пропускної здатності (не запитів) перевищує обробку одного сервера з Ethernet. Тому мені потрібне рішення для балансування, яке розподіляє пропускну здатність на декілька серверів. Чи є альтернативні методи, ніж використання DNS? Звичайно, я можу використовувати балансир навантаження з волоконним каналом тощо, але витрати смішні, і це також збільшує лише ширину вузького місця і не усуває його. Єдине, про що я можу придумати, це IP-адреси anycast (це anycast або багатоадресна передача?) IP-адреси, але у мене немає засобів для створення такої системи.