У меня haproxy прослушивает несколько портов и указывает на несколько бэкэнд-серверов.
В идеале я бы хотел, чтобы повторяющиеся соединения с одним и тем же портом указывались на один и тот же бэкэнд.
"источник баланса" не работает, потому что часто запросы приходят из одного и того же источника.
Это выполнимо?
Я также открыт для решений, не связанных с haproxy. Используемый протокол не важен, но определенно не http. Просто предположите, что это ssh, и вы не ошибетесь.
РЕДАКТИРОВАТЬ: Чтобы уточнить, представьте, что у меня есть 10 «бэкэнд-серверов» и 5 «клиентов». Каждый внутренний сервер может справиться только с одним подключением за раз. У меня больше серверов, чем требуется, на случай, если некоторые из них станут недоступны. Я буду вручную указывать каждому клиенту порт (а) haproxy. Я хочу, чтобы каждый клиент всегда попадал на внутренний сервер (что просто), но предпочтительно на один и тот же каждый раз, пока он доступен.
Вот как я решил свою проблему.
frontend name_of_frontend
bind *:20000-20010
default_backend servers
backend servers
balance roundrobin
stick-table type integer size 1k expire 3h
stick on dst_port
server name ip-address check maxconn 1
...
server name ip-address check maxconn 1
В комментарии к предыдущему ответу Вилли предупредил, что это «не гарантирует, что каждый клиент перейдет на другой порт».
В моем конкретном случае я полностью контролирую своих «клиентов». Единственная причина, по которой я указываю им разные порты на прокси-сервере, - это то, что я могу идентифицировать их как разных клиентов. Это определенно не «публичная» система.
Haproxy не реализует постоянство ip: port, потому что в прокси это не имеет никакого смысла. Это имеет смысл в пакетном балансировщике нагрузки (например, LVS), поскольку он позволяет балансировать нагрузку без сохранения состояния с циклическим распределением и постоянством. Но в прокси-сервере соединения обязательно поддерживаются на обоих концах от начала до конца. Так что я действительно не знаю, чего именно вы пытаетесь достичь.
Если вам нужно просто отношение порт назначения -> сервер, это выглядит довольно странно, потому что вам нужно прослушивать гораздо больше портов, чем у вас есть серверов, чтобы получить плавную балансировку. Я действительно не уверен, что вы захотите это сделать.
Я не специалист по хапрокси, но знаю это делает есть другие варианты балансировки нагрузки помимо source
(как минимум, есть циклический перебор). Я бы посоветовал проверить документацию HAProxy, чтобы узнать, каковы возможности и ограничения каждого режима балансировки нагрузки.
Вы также можете добиться желаемого, используя pf
брандмауэр (в одном из его многочисленных воплощений - pfSense хорошо, если вам нужен графический интерфейс). Настройте балансировку нагрузки на брандмауэре (циклический или аналогичный) с помощью sticky-address
набор опций, и у вас должна быть работоспособная настройка.