В этом докладе я планирую осветить следующие проблемы:
- Почему стандартных механизмов балансировки бывает недостаточно.
- Как выбирать фундамент для решения, и какие принципы проектирования использовались.
- Как формировались требования для решения, которое работает сейчас в продакшне и пропускает через себя ощутимое количество.
Расскажу, как без помощи сторонних сессионных хранилищ и довольно за дёшево организовать "sticky balancing", и как это работает с точки зрения науки. Покажу пример отказоустойчивой геораспределённой системы, расскажу, что мониторить и как правильно это делать при помощи специального расширения для nginx и не только. Расскажу о том, как было организовано нагрузочное и функциональное тестирование конечного продукта. Также расскажу про полный жизненный цикл этого весьма критичного для инфраструктуры приложения.
Поскольку мы живём в публичных облаках, я по ходу доклада расскажу, как мы тестировали и сравнивали AWS и GCP, а также про некоторые сугубо практические особенности организации in-house балансировки внутри публичного облака.
3. Disclaimer
Чем больше мы познаём неизменные законы природы,
тем всё более невероятными становятся для нас чудеса.
Чарльз Дарвин.
Все используемые технологии – опенсорс
Все совпадения с реальными компаниями и
брендами случайны.
18. Основные проблемы с DNS балансировкой
• Постоянные выигрыши в лотерею
• UDP не безграничен (512 bytes)
19. Основные проблемы с DNS балансировкой
• Постоянные выигрыши в лотерею
• UDP не безграничен (512 bytes)
• Само по себе распределение не ровное
20. Основные проблемы с DNS балансировкой
• Постоянные выигрыши в лотерею
• UDP не безграничен (512 bytes)
• Само по себе распределение не ровное
• Нужен другой балансировщик
24. НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
25. НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
• Нет поддержки SNI (один сертификат - один IP)
26. НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
• Нет поддержки SNI (один сертификат - один IP)
• На L7 нет возможности реализовать хотелки
27. НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
• Нет поддержки SNI (один сертификат - один IP)
• На L7 нет возможности реализовать хотелки
• Не нулевая вероятность получить на свои
сервера чужой трафик.
30. Подоспели новые требования.
• Новое требование от бизнеса –
всегда показывать пиксел
• Появился полноценный
балансировщик
31. Подоспели новые требования.
• Новое требование от бизнеса –
всегда показывать пиксел
• Появился полноценный
балансировщик
• Нужно быть ближе к пользователю
• КАК бы CDN
32. GDNSD
• DNS балансировщик
• 100% opensource
• Авторитативный днс сервер
• Геобазы нескольких провайдеров
• Встроенные проверки состояния приложения
40. Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий
• Ограничения – никакого сессионного хранилища
• Минимальное перераспределение пользователей
при добавление ноды.
41. Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий
• Ограничения – никакого сессионного хранилища
• Минимальное перераспределение пользователей
при добавление ноды.
Включаем Ip_hash method в nginx
42. Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий.
• Ограничения – никакого сессионного хранилища.
• Минимальное перераспределение пользователей
при добавление ноды.
Включаем Ip_hash method в nginx
0
1000
2000
3000
4000
5000
6000
7000
8000
app1 app2 app3 app4 app5
58. Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
59. Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
Решение – динамическая генерация количества точек
60. Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
Решение – динамическая генерация количества точек
• 1 worker отказ в обслуживании при добавлении
61. Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
Решение – динамическая генерация количества точек
• 1 worker отказ в обслуживании при добавлении
Решение “cpu_count-2” workers на балансировщик
64. Продолжаем бежать
• Внутренний хелфчек не способен
добавить много хостов (массовый
деплой например), полная
деградация целиком сервиса
запросы становятся в очередь, вот
это всё
65. Продолжаем бежать
• Внутренний хелфчек не способен
добавить много хостов (массовый
деплой например), полная
деградация целиком сервиса
запросы становятся в очередь, вот
это всё
Решение – инкрементальный
пересчёт consistent hash
66. Пример конфигурации nginx
location / {
...
proxy_pass http://$best_upstream;
...
}
upstream app1 {
…
server app1 max_fails=n fail_timeout=k;
server unix:/var/run/nginx_fallback.sock backup;
}
upstream app2 {
…
server app2 max_fails=n fail_timeout=k;
server unix:/var/run/nginx_fallback.sock backup;
}