DNS Google більше не підтримує Round Robin DNS


Раніше, коли треба було розподілити навантаження на кілька серверів, ми прописували кілька A-записів з одним ім'ям в DNS-зоні, і все працювало. Запити клієнтів розподілялися приблизно порівну. Особливо актуальний такий спосіб балансування був для роздачі статитического контенту.

Нещодавно наш клієнт звернувся до нас з проблемою:
У ЧНН починалися проблеми з завантаженням різних флешок — файли завантажувалися за кілька хвилин.

Розслідування виявило нерівномірне завантаження одного з серверів роздачі статики — він віддавав в рази більше трафіку в мережі, ніж всі інші. Причому періодично навантаження переходила від одного сервера до іншого.

В DNS зоні було прописано щось типу:

cdn.exampe.com IN A 192.168.10.1
cdn.exampe.com IN A 192.168.12.1
cdn.exampe.com IN A 192.168.15.1
cdn.exampe.com IN A 192.168.16.1
cdn.exampe.com IN A 192.168.11.1
cdn.exampe.com IN A 192.168.19.1

Раніше клієнти отримували відповіді від DNS-серверів за алгоритмом round-robin, але пошук проблеми привів до зовсім несподіваного результату!

Запити до DNS серверу за адресою 8.8.8.8 незмінно повертали один і той же адресу.
Ніякого round-robin. Зворотний адресу міг змінитися, якщо закінчувався TTL, а міг і не змінитися.

Техпідтримка корпорації добра відповіла в стилі «ми краще знаємо вас, що саме вам треба».

DNS Round Robin has never been an effective means of load-balancing, and is less so today, as applications switch from gethostbyname to getaddrinfo for IPv6 support:

homepage.ntlworld.com/jonathan.deboynepollard/FGA/dns-round-robin-is-useless.html

www.tenereillo.com/GSLBPageOfShame.htm

daniel.haxx.se/blog/2012/01/03/getaddrinfo-with-round-robin-dns-and-happy-eyeballs


RRDNS ніколи добре не працювало, а далі буде ще гірше. І коли настане IPv6, стане зовсім погано…
Ось таку думку у корпорації добра, і жодні графіки навантаження переконати її не змогли.

І так як більшість кінцевих користувачів стали використовувати DNS сервери гугла, то навіть використання спеціалізованих рішень, коли на кожен запит сервер, що обслуговує зону, видає тільки один адреса з пулу, також не вирішує проблему.
ГуглоДНС закеширует відповідь і буде віддавати його клієнтам, поки не скінчиться TTL.

Звичайно, можна звернутися до платних постачальникам послуг CDN або сказати програмістам, щоб вони генерували посилання на контент, які вказують на конкретні сервера (природно, для кожного запиту сервер в посиланні береться випадковим чином, щоб розподілити навантаження).
Але з адмінів зазвичай вимагають вирішити проблему швидко, і щоб працювало зараз.
А вже потім можна буде пошукати рішення краще.

Повертаємо редирект на конкретний сервер засобами nginx:
Скористаємося директивою split_clients, розподілимо відсотки згідно потужності наших серверів і пропишемо на кожному з них ось такий конфіг.
Природно, у рядку hostname cdn1.example.com; вказуємо своє унікальне ім'я для кожного з серверів.

http {
split_clients "${remote_addr}AAA" $variant {
15% 1;
15% 2;
15% 3;
15% 4;
15% 5;
15% 6;
* 7;
}

server {
listen 80;
server_name cdn.example.com;
return 302 http://cdn$variant.example.com/$request_uri;
}

server {
listen 80;
server_name cdn1.example.com;
location / {
root /srv/www/cdn.example.com/htdocs; 
} 
}


У підсумку nginx повертає користувачеві редиректи на сервер, який визначається на підставі хеш ip адреси клієнта.
Ось таке ось розподіл навантаження.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.