Умная балансировка
нагрузки на базе Nginx и
Lua
Андрей Кононов, Solution architect at EPAM systems
О себе
Disclaimer
Чем больше мы познаём неизменные законы природы,
тем всё более невероятными становятся для нас чудеса.
Чарльз Дарвин.
Все используемые технологии – опенсорс
Все совпадения с реальными компаниями и
брендами случайны.
Какая балансировка бывает
• L7 (DNS, http)
• L4 (TCP)
• L3 (BGP)
TCP/HTTP
VRRP
DNS
BGP
Стартовая позиция
• Нет балансировки
• Всё работает
• Фичи пилятся
Надо быть защищёнными, но…
1. Поддержки SSl нет
2. Надо разработать
Надо быть защищёнными, но…
1. Поддержки SSl нет
2. Надо разработать
Надо что-то придумать
Появился Nginx
Надо что-то придумать
Появился Nginx
Ничто не предвещало…
НО пришла корпорация добра!
TIME
RESPONSE TIME, MS
Надо что-то придумать
• DNS балансировка
Надо что-то придумать
• DNS балансировка
Надо что-то придумать
• DNS балансировка
0
500
1000
1500
2000
2500
3000
3500
requests
time
requests/server
app1 app2
Жизнь продолжается
• DNS балансировка
Балансировка курильщика
• DNS балансировка
0
1000
2000
3000
4000
5000
6000
7000
8000
Requests /server
app1 app2 app3 app4 app5
Основные проблемы с DNS балансировкой
• Постоянные выигрыши в лотерею
Основные проблемы с DNS балансировкой
• Постоянные выигрыши в лотерею
• UDP не безграничен (512 bytes)
Основные проблемы с DNS балансировкой
• Постоянные выигрыши в лотерею
• UDP не безграничен (512 bytes)
• Само по себе распределение не ровное
Основные проблемы с DNS балансировкой
• Постоянные выигрыши в лотерею
• UDP не безграничен (512 bytes)
• Само по себе распределение не ровное
• Нужен другой балансировщик
Вендорский Балансировщик!
Балансировка нормального человека
2200
2300
2400
2500
2600
2700
2800
2900
3000
3100
requests/server
app1 app2 app3 app4 app5
НО Вендоры не без греха!
• Vendor lock
НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
• Нет поддержки SNI (один сертификат - один IP)
НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
• Нет поддержки SNI (один сертификат - один IP)
• На L7 нет возможности реализовать хотелки
НО Вендоры не без греха!
• Vendor lock
• ELB на L4 не отправляет клиенту нотификации
о разрыве соединения
• Нет поддержки SNI (один сертификат - один IP)
• На L7 нет возможности реализовать хотелки
• Не нулевая вероятность получить на свои
сервера чужой трафик.
Подоспели новые требования.
• Новое требование от бизнеса –
всегда показывать пиксел
Подоспели новые требования.
• Новое требование от бизнеса –
всегда показывать пиксел
Подоспели новые требования.
• Новое требование от бизнеса –
всегда показывать пиксел
• Появился полноценный
балансировщик
Подоспели новые требования.
• Новое требование от бизнеса –
всегда показывать пиксел
• Появился полноценный
балансировщик
• Нужно быть ближе к пользователю
• КАК бы CDN
GDNSD
• DNS балансировщик
• 100% opensource
• Авторитативный днс сервер
• Геобазы нескольких провайдеров
• Встроенные проверки состояния приложения
Никто не ждал но…..
• Взрыв мониторинга.
Никто не ждал но…..
• Взрыв мониторинга.
• 100 gb за 2 часа error log
• LA > 8 (8 cores instance)
used space
Никто не ждал но…..
• Взрыв мониторинга.
• 100 gb за 2 часа error log
• LA > 8 (8 cores instance)
main.all.http_1xx = 0
main.all.http_2xx = 480
main.all.http_3xx = 11
main.all.http_4xx = 3
main.all.http_5xx = 0
Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий
Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий
Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий
Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий
• Ограничения – никакого сессионного хранилища
• Минимальное перераспределение пользователей
при добавление ноды.
Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий
• Ограничения – никакого сессионного хранилища
• Минимальное перераспределение пользователей
при добавление ноды.
Включаем Ip_hash method в nginx
Продолжаем развиваться !
• Бизнес хочет странного, а именно - что то типа сессий.
• Ограничения – никакого сессионного хранилища.
• Минимальное перераспределение пользователей
при добавление ноды.
Включаем Ip_hash method в nginx
0
1000
2000
3000
4000
5000
6000
7000
8000
app1 app2 app3 app4 app5
Балансировка - не только балансировка
SSL offload
Балансировка - не только балансировка
SSL offload
Pixel
Балансировка - не только балансировка
SSL offload
Pixel
Redundancy
Балансировка - не только балансировка
SSL offload
Pixel
Redundancy
Geo distribution
Балансировка - не только балансировка
SSL offload
Pixel
Redundancy
Geo distribution
Easy configuration
Балансировка - не только балансировка
SSL offload
Pixel
Redundancy
Geo distribution
Easy configuration
Automatic add/remove nodes
Балансировка - не только балансировка
SSL offload
Pixel
Redundancy
Geo distribution
Easy configuration
Automatic add/remove nodes
oStickiness
• Consistent Hash !
https://en.wikipedia.org/wiki/Consistent_hashing
David Karger
Мозговой штурм, выбор не велик
• 1. Компилируемый модуль
Мозговой штурм, выбор не велик
• 1. Компилируемый модуль
2. Логика на LUA
Мозговой штурм, выбор не велик
• 1. Компилируемый модуль
2. Логика на LUA
Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
Решение – динамическая генерация количества точек
Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
Решение – динамическая генерация количества точек
• 1 worker отказ в обслуживании при добавлении
Забег по граблям
• Генерили много точек по умолчанию - начала кончаться память
Решение – динамическая генерация количества точек
• 1 worker отказ в обслуживании при добавлении
Решение “cpu_count-2” workers на балансировщик
Продолжаем бежать
• Fallback не фолбечит
Продолжаем бежать
• Fallback не фолбечит
Решение – перенос в отдельный процесс нджинкс
Продолжаем бежать
• Внутренний хелфчек не способен
добавить много хостов (массовый
деплой например), полная
деградация целиком сервиса
запросы становятся в очередь, вот
это всё
Продолжаем бежать
• Внутренний хелфчек не способен
добавить много хостов (массовый
деплой например), полная
деградация целиком сервиса
запросы становятся в очередь, вот
это всё
Решение – инкрементальный
пересчёт consistent hash
Пример конфигурации 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;
}
Итоговая архитектура.
Выводы
• Хорошая балансировка всегда знает о приложении довольно
много
• Нагрузочное тестирование
• Ну и конечно здравый смысл
Links
1. http://luajit.org
2. http://nginx.org
3. https://github.com/openresty/lua-nginx-module
4. https://github.com/openresty/lua-upstream-nginx-module
5. https://github.com/goldenclone/nginx-sla
6. http://gdnsd.org
GDNSD
Всем Спасибо!
akononov.job@gmail.com
https://www.linkedin.com/in/andkononov

smart balancing with nginx+lua / Андрей Кононов (IPONWEB)