Умная балансировка
нагрузки на базе 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
Ничто не предвещало…
НО пришла корпорация добра!response time, ms
TIME
Надо что-то придумать• DNS балансировка
Надо что-то придумать• DNS балансировка
Надо что-то придумать• DNS балансировка
0
500
1000
1500
2000
2500
3000
3500
requests/server
app1 app2
time
requ
ests
Жизнь продолжается • DNS балансировка
Балансировка курильщика • DNS балансировка
0
1000
2000
3000
4000
5000
6000
7000
8000
Requests /serverapp1 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• Авторитативный днс сервер• Геобазы нескольких провайдеров• Встроенные проверки состояния приложения
Никто не ждал но…..• Взрыв мониторинга.
free space
Никто не ждал но…..• Взрыв мониторинга.• 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 = 0main.all.http_2xx = 480main.all.http_3xx = 11main.all.http_4xx = 3main.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 offloadPixel
Балансировка - не только балансировкаSSL offloadPixelRedundancy
Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distribution
Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distributionEasy configuration
Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distributionEasy configurationAutomatic add/remove nodes
Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distributionEasy configurationAutomatic add/remove nodesoStickiness
• 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.org2. http://nginx.org3. https://github.com/openresty/lua-nginx-module4. https://github.com/openresty/lua-upstream-nginx-module5. https://github.com/goldenclone/nginx-sla6. http://gdnsd.org
GDNSD