Мы используем Nginx в качестве балансировки нагрузки для нашего приложения websocket. Каждый сервер backend хранит информацию о сеансе, поэтому каждый запрос от клиента должен быть перенаправлен на тот же сервер. Поэтому для достижения этой цели мы используем директиву ip_hash
:
upstream app {
ip_hash;
server 1;
}
Проблема возникает, когда мы хотим добавить еще один сервер:
upstream app {
ip_hash;
server 1;
server 2;
}
Новые подключения идут на сервер 1 и сервер 2 - но это не то, что нам нужно в этой ситуации, так как загрузка на сервере 1 продолжает увеличиваться - нам все еще нужны липкие сеансы, но алгоритм least_conn
тоже включен, поэтому наши два сервера получают примерно равная нагрузка.
Мы также рассмотрели использование Nginx-sticky-module
, но в документе говорится, что если липкий файл cookie не будет доступен, он вернется к циклическому алгоритму Nginx по умолчанию, поэтому он также не решает проблему.
Итак, вопрос в том, можем ли мы объединить логику логики липких и наименьших соединений с помощью Nginx? Вы знаете, какие другие балансировки нагрузки решают эту проблему?