у меня есть экземпляры под балансировщиком нагрузки haproxy. Я использую файлы cookie haproxy, чтобы каждый клиент мог подключаться к одному и тому же серверу на протяжении всего сеанса.
Теперь дело в том, что я хотел бы установить переменную maxconn в haproxy до предела, который могут обрабатывать мои серверы, а это, скажем, 1000.
Однако я хотел бы убедиться, что в случае достижения этого лимита он применяется только к новым соединениям, а не к людям, которые уже вошли в систему. Это так работает? Если нет, как я могу этого добиться?
Сервер maxconn применяется к параллельным TCP-соединениям с сервером, чтобы не перегружать сервер. Однако лишние соединения не отклоняются, они ставятся в очередь и перенаправляются на сервер, как только он освобождает другое соединение. Есть две очереди: одна в бэкэнде для любого входящего соединения, а другая на сервере, предназначенная для соединений, явно направленных на этот сервер (запросы с файлами cookie). Таким образом, происходит то, что соединения от новых посетителей ставятся в очередь на бэкэнде и выбираются любым сервером, в то время как соединения от уже увиденных посетителей ставятся в очередь на сервере и выбираются только этим.
Вы, кажется, полагаете, что maxconn считает одновременных посетителей, хотя на самом деле это одновременные соединения. Вы можете легко иметь 10000 одновременных посетителей с помощью всего 100 одновременных TCP-соединений. Параметр maxconn аналогичен параметру MaxClients в Apache и должен быть установлен немного ниже, чем предел сервера.
Вы также заметите, что многие серверы работают лучше с более низкими значениями maxconn, и у вас может возникнуть соблазн понизить значение для повышения производительности. Не снижайте его слишком сильно, так как вы хотите иметь возможность покрыть ситуации, когда ваш сервер обслуживает медленные ответы (например, ждет сервер базы данных).