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

70
Умная балансировка нагрузки на базе Nginx и Lua Андрей Кононов, Solution architect at EPAM systems

Upload: ontico

Post on 16-Apr-2017

342 views

Category:

Engineering


0 download

TRANSCRIPT

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

Умная балансировка

нагрузки на базе Nginx и Lua

Андрей Кононов, Solution architect at EPAM systems

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

О себе

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

DisclaimerЧем больше мы познаём неизменные законы природы, тем всё более невероятными становятся для нас чудеса.

Чарльз Дарвин.

Все используемые технологии – опенсорсВсе совпадения с реальными компаниями и брендами случайны.

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

Какая балансировка бывает• L7 (DNS, http)• L4 (TCP)• L3 (BGP)

TCP/HTTP

VRRP

DNS

BGP

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

Стартовая позиция• Нет балансировки• Всё работает• Фичи пилятся

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

Надо быть защищёнными, но…

1. Поддержки SSl нет2. Надо разработать

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

Надо быть защищёнными, но…

1. Поддержки SSl нет2. Надо разработать

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

Надо что-то придуматьПоявился Nginx

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

Надо что-то придуматьПоявился Nginx

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

Ничто не предвещало…

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

НО пришла корпорация добра!response time, ms

TIME

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

Надо что-то придумать• DNS балансировка

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

Надо что-то придумать• DNS балансировка

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

Надо что-то придумать• DNS балансировка

0

500

1000

1500

2000

2500

3000

3500

requests/server

app1 app2

time

requ

ests

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

Жизнь продолжается • DNS балансировка

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

Балансировка курильщика • DNS балансировка

0

1000

2000

3000

4000

5000

6000

7000

8000

Requests /serverapp1 app2 app3 app4 app5

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

Основные проблемы с DNS балансировкой• Постоянные выигрыши в лотерею

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

Основные проблемы с DNS балансировкой• Постоянные выигрыши в лотерею• UDP не безграничен (512 bytes)

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

Основные проблемы с DNS балансировкой• Постоянные выигрыши в лотерею• UDP не безграничен (512 bytes)• Само по себе распределение не ровное

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

Основные проблемы с DNS балансировкой• Постоянные выигрыши в лотерею• UDP не безграничен (512 bytes)• Само по себе распределение не ровное• Нужен другой балансировщик

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

Вендорский Балансировщик!

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

Балансировка нормального человека

2200

2300

2400

2500

2600

2700

2800

2900

3000

3100

requests/server

app1 app2 app3 app4 app5

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

НО Вендоры не без греха!• Vendor lock

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

НО Вендоры не без греха!• Vendor lock• ELB на L4 не отправляет клиенту нотификации

о разрыве соединения

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

НО Вендоры не без греха!• Vendor lock• ELB на L4 не отправляет клиенту нотификации

о разрыве соединения• Нет поддержки SNI (один сертификат - один IP)

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

НО Вендоры не без греха!• Vendor lock• ELB на L4 не отправляет клиенту нотификации

о разрыве соединения• Нет поддержки SNI (один сертификат - один IP)• На L7 нет возможности реализовать хотелки

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

НО Вендоры не без греха!• Vendor lock• ELB на L4 не отправляет клиенту нотификации

о разрыве соединения• Нет поддержки SNI (один сертификат - один IP)• На L7 нет возможности реализовать хотелки• Не нулевая вероятность получить на свои

сервера чужой трафик.

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

Подоспели новые требования.• Новое требование от бизнеса –

всегда показывать пиксел

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

Подоспели новые требования.• Новое требование от бизнеса –

всегда показывать пиксел

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

Подоспели новые требования.• Новое требование от бизнеса –

всегда показывать пиксел• Появился полноценный

балансировщик

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

Подоспели новые требования.• Новое требование от бизнеса –

всегда показывать пиксел• Появился полноценный

балансировщик• Нужно быть ближе к пользователю• КАК бы CDN

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

GDNSD• DNS балансировщик• 100% opensource• Авторитативный днс сервер• Геобазы нескольких провайдеров• Встроенные проверки состояния приложения

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

Никто не ждал но…..• Взрыв мониторинга.

free space

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

Никто не ждал но…..• Взрыв мониторинга.• 100 gb за 2 часа error log• LA > 8 (8 cores instance)

used space

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

Никто не ждал но…..• Взрыв мониторинга. • 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

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

Продолжаем развиваться !• Бизнес хочет странного, а именно - что то типа сессий

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

Продолжаем развиваться !• Бизнес хочет странного, а именно - что то типа сессий

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

Продолжаем развиваться !• Бизнес хочет странного, а именно - что то типа сессий

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

Продолжаем развиваться !• Бизнес хочет странного, а именно - что то типа сессий• Ограничения – никакого сессионного хранилища• Минимальное перераспределение пользователей при

добавление ноды.

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

Продолжаем развиваться !• Бизнес хочет странного, а именно - что то типа сессий• Ограничения – никакого сессионного хранилища• Минимальное перераспределение пользователей

при добавление ноды.Включаем Ip_hash method в nginx

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

Продолжаем развиваться !• Бизнес хочет странного, а именно - что то типа сессий.• Ограничения – никакого сессионного хранилища.• Минимальное перераспределение пользователей

при добавление ноды.Включаем Ip_hash method в nginx

0

1000

2000

3000

4000

5000

6000

7000

8000

app1 app2 app3 app4 app5

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

Балансировка - не только балансировкаSSL offload

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

Балансировка - не только балансировкаSSL offloadPixel

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

Балансировка - не только балансировкаSSL offloadPixelRedundancy

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

Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distribution

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

Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distributionEasy configuration

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

Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distributionEasy configurationAutomatic add/remove nodes

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

Балансировка - не только балансировкаSSL offloadPixelRedundancyGeo distributionEasy configurationAutomatic add/remove nodesoStickiness

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

• Consistent Hash !

https://en.wikipedia.org/wiki/Consistent_hashing

David Karger

Page 51: smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Page 52: smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Page 53: smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Page 54: smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Page 55: smart balancing with nginx+lua / Андрей Кононов (IPONWEB)

Мозговой штурм, выбор не велик

• 1. Компилируемый модуль

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

Мозговой штурм, выбор не велик

• 1. Компилируемый модуль 2. Логика на LUA

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

Мозговой штурм, выбор не велик

• 1. Компилируемый модуль 2. Логика на LUA

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

Забег по граблям• Генерили много точек по умолчанию - начала кончаться память

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

Забег по граблям• Генерили много точек по умолчанию - начала кончаться памятьРешение – динамическая генерация количества точек

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

Забег по граблям• Генерили много точек по умолчанию - начала кончаться памятьРешение – динамическая генерация количества точек• 1 worker отказ в обслуживании при добавлении

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

Забег по граблям• Генерили много точек по умолчанию - начала кончаться памятьРешение – динамическая генерация количества точек• 1 worker отказ в обслуживании при добавленииРешение “cpu_count-2” workers на балансировщик

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

Продолжаем бежать• Fallback не фолбечит

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

Продолжаем бежать• Fallback не фолбечитРешение – перенос в отдельный процесс нджинкс

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

Продолжаем бежать• Внутренний хелфчек не способен

добавить много хостов (массовый деплой например), полная деградация целиком сервиса запросы становятся в очередь, вот это всё

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

Продолжаем бежать• Внутренний хелфчек не способен

добавить много хостов (массовый деплой например), полная деградация целиком сервиса запросы становятся в очередь, вот это всё

Решение – инкрементальный пересчёт consistent hash

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

Пример конфигурации 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;}

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

Итоговая архитектура.

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

Выводы• Хорошая балансировка всегда знает о приложении довольно

много• Нагрузочное тестирование• Ну и конечно здравый смысл

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

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

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

Всем Спасибо!

[email protected]

https://www.linkedin.com/in/andkononov