В настоящее время я использую циклический перебор 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 Гбит / с, но я хочу работать со 100 Мбит / с, а также с серверами 10 Гбит / с.
Итак, я хочу представить сервер со скоростью 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 по сравнению с аппаратными балансировщиками нагрузки.
Мой вопрос сейчас таков: существуют ли лучшие практики / методы / правила, чтобы приблизить распределение по кругу с использованием атрибута TTL записей DNS?
Редактировать:
Система является системой прямого прокси-сервера. Количество пропускной способности (не запросов) превышает то, что может обрабатывать один сервер с Ethernet. Поэтому мне нужно решение для балансировки, которое распределяет пропускную способность по нескольким серверам. Есть ли альтернативные методы, чем использование DNS? Конечно, я могу использовать балансировщик нагрузки с оптоволоконным каналом и т. Д., Но это смешные затраты, которые также увеличивают только ширину узкого места и не устраняют ее. Единственное, о чем я могу подумать, это IP-адреса anycast (это anycast или multicast?), Но у меня нет возможности настроить такую систему.