Разработчики http-сервера nginx объявили (https://www.nginx.com/blog/announcing-udp-load-balancing/) о реализации поддержки балансировки UDP-соединений, которая дополнила собой ранее добавленный (https://www.opennet.me/opennews/art.shtml?num=42076) балансировщик произвольных TCP-соединений, реализованный в виде модуля stream. Проброс UDP может быть полезен для распределения нагрузки между несколькими DNS-, syslog- или radius-серверами. UDP-балансировщик уже интегрирован в репозиторий (http://hg.nginx.org/nginx/?_ga=1.64647661.335129412.1443032231) с исходными текстами nginx и войдёт в состав намеченного на 23 марта выпуска 1.9.13.
Среди поддерживаемых (https://www.nginx.com/products/application-load-balancing/#l...) методов балансировки: round-robin (круговой перебор, при котором соединения равномерно распределяются среди обработчиков), least-connections (запрос перенаправляется к менее нагруженному серверу), least_time (перенаправление на сервер, демонстрирующий наиболее высокую отзывчивость) и hash (перенаправление на основе хэша от определённого пользователем параметра, например, IP). После перенаправления запроса серверу, nginx дожидается ответа и переотправляет его клиенту. Если сервер не ответил в течение таймаута, nginx помечает сервер как проблемный и прекращает отправлять на него запросы, но раз в несколько секунд проверяет не восстановился ли он, отправляя пробный клиентский запрос.URL: https://www.nginx.com/blog/announcing-udp-load-balancing/
Новость: http://www.opennet.me/opennews/art.shtml?num=44049
nginx радует. Может кто посоветовать хорошую литературу по настройки для highload?
Highload не настраивают, их пишут. При отсутствии архитектурных решений, предусматривающих масштабирование проекта на множество серверов, всякие настройки бесполезны, потому что не позволят выжать из железа больше, чем то, на что оно способно.Если вы считаете, что Highload - это баззворды вроде Mongo, Django, Memcache и Redis, то мне кажется, что вы ошибаетесь. Всё это - костыли, которые максимально удаляют вас от наиболее эффективного решения. Нормальный проект - это многопроцессный или многопоточный демон с общей памятью, который всё своё носит с собой (не использует сторонних фреймворков или демонов, разработчики которых внезапно могут объявить нужные вам фичи устаревшими и неподдерживаемыми) и всё нужное держит при себе (сессии пользователей вместе со всеми нужными для сеанса объектами хранит в общей для всех воркеров оперативной памяти, а не грузит их при каждом чихе из базы данных, сохраняя в Memcache, "для кэширования").
И конечно, Highload - это не только веб. Чтобы написать производительное веб-приложение, нужно отбросить общепринятую в вебе шелуху и использовать подходы, которые используются вне веба. Там точно есть чему поучиться, потому там хорошо понимают, что одними баззвордами реальность не обманешь.
А как же микросервисная архитектура, позволяющая легче масштабировать горизонтально?
Микросервисы к х-йлоаду относятся только как один из путей потребления вычислительных ресурсов. А так, у тебя голова прожужжаная торгашнёй со всего интернете.
Микросервисы это скорее о подходе к разработке и релизу приложений (CI). И в отличии от монолитных монстров, масштабировать их гораздо проще и приятней, потому и ассоциируются как правильный паттерн для highload-сред.
> Микросервисы это скорее о подходе к разработке и релизу приложений (CI). И
> в отличии от монолитных монстров, масштабировать их гораздо проще и приятней,
> потому и ассоциируются как правильный паттерн для highload-сред.Отличный паттерн, в котором 90% работы заключается в том, чтобы раскодировать запрос и закодировать ответ. Накладные расходы очень большие. Почему вы думаете что есть только микросервисы и монолитные сервисы? Почему монолитный с виду сервис не может оказаться модульным внутри и с разными типами воркеров? Каждый воркер может потреблять столько памяти, сколько ему нужно. Каждого типа воркеров может быть запущено столько, сколько нужно.
Для обслуживания одного клиента совсем не обязательно все его запросы размазывать тонким слоем по всем серверам. Одним клиентом может заниматься один сервер. При этом данные клиента не обязательно сохранять после каждого запроса в постоянное хранилище и снова загружать всё из этого хранилища, чтобы вспомнить, чем он занимался в прошлом запросе, который был меньше секунды назад. Достаточно иметь арбитра, который будет отслеживать, на каком сервере сейчас обслуживается клиент. Достаточно чтобы серверы, обслуживающие клиентов, обменивались между собой сообщениями.
Короче - как работает настоящий Highload в его веб-ипостаси, можно увидеть массовых в онлайн-играх. Например вот:
https://habrahabr.ru/company/mailru/blog/182088/
https://habrahabr.ru/company/mailru/blog/220359/Заметьте - нет ни слова про микросервисы, Django, Mongo, Redis, Memcache и Highload. Упоминается No-SQL в контексте "нам нужна консистентность, а No-SQL её как правило не обеспечивают". Люди думают головой и проектируют архитектуру, а не бросаются на модные слова.
Эти "баззворды" как раз и дают "общую для всех воркеров оперативную память", независимо от того, где данный воркер запущен. Ну да, кастомный демон, держащий всё в себе - гораздо эффективнее, пока помещается на один сервер. И даже тогда надо как-то обеспечивать горячую замену - но это решаемо. Но как только инстансов становится много - про общую оперативную память можно и нужно забывать, и стандартные решения с известными граблями и путями их обхода рулят.
Товарищи теоретики, курите Теорию автоматов, Робачевского, IPC, модели параллелизации.
В двух словах: Задача диктует модель реализации! Остальное - школьный срач.
> Товарищи теоретики, курите Теорию автоматов, Робачевского, IPC, модели параллелизации.
> В двух словах: Задача диктует модель реализации! Остальное - школьный срач.Дело в том, что задача со временем меняется. Сначала это HTML-страничка со списком учеников школы, а потом оно дорастает до соцсети с миллионами активных пользователей. Почему-то есть общепринятые или хорошо раскрученные методы решения этой задачи. Элементы этого решения - микросервисная архитектура, Memcache, Redis, Mongo. Но использование этих баззвордов совсем не означает автоматически, что приложение готово к высоким нагрузкам и хорошо масштабируется.
На мой взгляд, слово Highload себя дискредитировало. Оно раскручено и активно впихнуто в мозги молодых программеров, желающих стать крутыми. Где звучит слово Highload, там сразу собираются сотни пионеров с горящими глазами, а производители железа довольно потирают ручки.
>> Товарищи теоретики, курите Теорию автоматов, Робачевского, IPC, модели параллелизации.
>> В двух словах: Задача диктует модель реализации! Остальное - школьный срач.
> Дело в том, что задача со временем меняется. Сначала это HTML-страничка со
> списком учеников школы, а потом оно дорастает до соцсети с миллионами
> активных пользователей.Вы предлагаете масштабировать echo Hello World на 6 лямов юзеров? :)
Не, это очень даже рационально, с точки зрения зарплаты IT-отдела.
>Эти "баззворды" как раз и дают "общую для всех воркеров оперативную память", независимо от того, где данный воркер запущен.Ну да. Это же так удобно. Первую страницу клиент запросил у одного сервера, а следующую - у другого.
>Ну да, кастомный демон, держащий всё в себе - гораздо эффективнее, пока помещается на один сервер.
Если есть умный прокси, который каждого клиента будет постоянно отправлять на тот сервер, где этот клиент в последний раз обслуживался, то будет эффективнее.
>Но как только инстансов становится много - про общую оперативную память можно и нужно забывать, и стандартные решения с известными граблями и путями их обхода рулят.
Эти ваши Memcache с Redis никогда не заменят мозга. Клиента нужно стараться всегда обслуживать в одном и том же месте и хранить в этом месте все его данные в оперативке. Общее хранилище - оно для хранения данных между сеансами.
Стандартные решения - это метод грубой силы. Для тех, у кого нет мозгов, но много денег на железо.
Хернёй страдают - тоже самое можно делать в том же PF вообще на уровне ядра, если руки прямые и хватит ума написать пару строчек правил для NAT, rdr и pass.Пора уже разрезать nginx на куски: хттп, мыло, и вот эти всякие балансировщики.
Те проект мало того что оброс модулями по теме, так ещё там теперь всякое не относящиеся к хттп пристраивается тоннами.
Вот да, что-то он совсем в комбайн превратился
> Вот да, что-то он совсем в комбайн превратилсяЭто было очевидно уже давно.
Например, там внутри есть собственный аналог systemd, обеспечивающий постепенный перезапуск воркеров без остановки обслуживания, посредством сокет-активации.
>> Вот да, что-то он совсем в комбайн превратился
>
> Это было очевидно уже давно.
> Например, там внутри есть собственный аналог systemd, обеспечивающий постепенный перезапуск воркеров без остановки обслуживания, посредством сокет-активации.А ты предлагаешь через kill -9 перезапускать?
> Например, там внутри есть собственный аналог systemd,Так бзды только собираются еще launchd начать использовать, вот и пришлось рьяным бсдшникам кодить свой вариант.
это не аналог systemd. systemd может послать мастер-процессу HUP, а с воркерами пусть уже сам мастер-процесс разбирается. нормальая архитектура, в общем.
Энтерпрайзники требуют. Попробуй логи с 500 нагруженных серверов получать. То еще приключение.
О, йопт, админы локалхостов подтянулись... "- Логи, 500 серверов,...".
Если у тя болит живот, анализ кала и мочи будешь каждую минуту делать?
Дурак ты Паша!(С)
У ынтерпрайза живот всегда болит!
6 лет назад в одной 3-х буквенной лавке объём ежедневных гзипованных логов составлял 6ТБ.
И они щедро платили чтоб это всё долетело, застроилось и распарсилось.
Не думаю что с тех пор стало меньше :-))))
Это же не логи :)
> Если у тя болит живот, анализ кала и мочи будешь каждую минуту делать?Есть разница - сделать анализ 1 человеку в год или 500 человек ежедневно. Во втором случае придется придумывать автоматизацию процессов и распределение нагрузки на группу воркеров-лаборантов.
Сходи в большую серьезную лабораторию и посмотри что из себя представляет анализатор. Это почти автоматические машины с кучей датчиков и бортовым компьютером. Лаборанты меняют пробирки, льют реактивы и иногда проверяют/калибруют датчики.
Т.е., позорище.
> Хернёй страдают - тоже самое можно делать в том же PF вообще на уровне ядра, если руки прямые и хватит ума написать пару строчек правил для NAT, rdr и pass.Если не секрет - как при помощи PF можно обеспечить балансировку least-connections например?
Или least-time?
>Если не секрет - как при помощи PF можно обеспечить балансировку least-connections например? Или least-time?Конечно, это секрет. Пишешь демон, который чекает бэкенды, далее заполняешь таблицы в pf. Смысл, ну вот один в один как в nginx. Ну, е*та, это ж не хайлоад, да.
> тоже самое можно делать в том же PF вообще на уровне ядра, если руки прямые и хватит умаАга, а ещё можно на ассемблере написать модуль ядра и тоже самое сделать вообще в командах микропроцессора, если руки прямые и хватит ума.
> Ага, а ещё можно на ассемблере написать модуль ядраЛучше на баше, там более прозрачно® и юниксвейно™. Главное, не забыть включить в ядро интерпретатор баша...
Да все правильно он делает. Хорошее решение для реальных задач. Все остальное теория.
от баша у него фрибсд осквернится, тычо
> от баша у него фрибсд осквернится, тычоТам в портах (по умолчанию) баш свежее твоего в линуксе :)
Можно написать демон (хоть на шеле), который будет измерять счетчики pf по sport и dport и добавлять/удалять правила в rdr.
Я anti-ddos такой видел :)Не знаю, есть ли в линуксовом iptables/netfilter что-то вроде round-robin.
> Не знаю, есть ли в линуксовом iptables/netfilter что-то вроде round-robin.Там много чего есть, один только список модулей на два экрана.
Классно было бы, если б сайт мог работать через UDP, а не через TCP.
> Классно было бы, если б сайт мог работать через UDP, а не через TCP.Не отвлекаться, http/2 вам в дышло!
>> Классно было бы, если б сайт мог работать через UDP, а не через TCP.
> Не отвлекаться, http/2 вам в дышло!Он не поддерживает UDP =/
Был неплохой вебсервер, теперь убогий комбайн.
> Был неплохой вебсервер, теперь убогий комбайн.Никто не заставляет нацеплять все цацки сразу.
Был неплохой веб-сервер который решал одну очень узкоспецифическую задачу, а для остального приходилось городить зоопарк. Теперь есть неплохой веб-сервер, который решает все задачи - красота.