Балансировка нагрузки (HAProxy или другое) - липкие сессии
Я работаю над масштабированием своего приложения на несколько серверов, и одно из требований заключается в том, чтобы клиент всегда общался с одним и тем же сервером (слишком много оперативных данных используется для эффективного отскока между серверами).
Моя текущая настройка - небольшой кластер серверов (использующий Linode). У меня есть интерфейсный узел, на котором выполняется HAProxy с использованием "источника баланса", так что IP-адрес всегда направлен на один и тот же узел.
Я заметил, что "источник баланса" не очень равномерное распределение. С моей текущей тестовой настройкой (2 бэкэнд-сервера) один сервер часто имеет в 3-4 раза больше подключений при использовании выборки размером 80-100 исходных IP-адресов.
Есть ли способ добиться более сбалансированного распределения? Очевидно, что липкие сессии запрещают "идеальный" баланс, но разделение 40/60 предпочтительнее, чем разделение 25/75.
2 ответа
HAProxy поддерживает изменение или вставку файла cookie, чтобы обеспечить постоянство сеанса с cookie
параметр.
В разделах backend или listen добавьте следующее:
cookie COOKIENAME prefix
Этот пример изменит существующий файл cookie, добавив имя сервера в файл cookie с именем COOKIENAME
, Ваш клиент увидит что-то вроде server1~someotherdata
но ваше приложение увидит только someotherdata
часть. Таким образом, вы можете использовать это на существующих куки. Кроме того, этот метод позволяет принудительно устанавливать постоянство сеанса только в том случае, если существует этот файл cookie. Это означает, что вы все равно можете равномерно распределять людей вокруг статических частей вашего сайта и применять липкость только при необходимости, но добавляя это имя файла cookie в сеанс.
Также назовите ваши серверы, чтобы ваши строки выглядели так:
server server1 1.2.3.4 cookie server1
Более подробную информацию можно найти в руководстве по настройке HAProxy, также вы можете использовать appsession
параметр config также.
Как только вы это сделаете, вы можете выбрать свой собственный метод баланса из списка, я склонен использовать roundrobin
но leastconn
может дать вам лучший баланс, когда липкие сессии будут приняты во внимание.
Больше из документации, чтобы облегчить поиск справочного раздела:
cookie <name> [ rewrite | insert | prefix ] [ indirect ] [ nocache ]
[ postonly ] [ preserve ] [ domain <domain> ]*
[ maxidle <idle> ] [ maxlife <life> ]
Enable cookie-based persistence in a backend.
May be used in sections : defaults | frontend | listen | backend
yes | no | yes | yes
Вы можете настроить алгоритм балансировки в HA-Proxy, хотя некоторые из них доступны. Как, например, Roundrobin или Loneconn.
Но вам нужно в целом настроить балансировку в соответствии с доменом пользователей, которым предоставляется контент. В большинстве случаев вам нужно проводить эмпирические тесты и повторять свое решение в соответствии с вашими выводами.