Существует ли «правильная» реализация persistent/stick соединений для балансировки RDP?
Задача на первый взгляд довольно простая: требуется в отсутствии connection broker'а организовать балансировку RDP соединений на несколько терминальных серверов.
Казалось бы, ipvs, haproxy и другие предоставляют готовое решение, но проблема в том, что реализация persistent/stick соединений в этих инструментах такова, что запись из таблицы persistent/stick удаляется по истечению заданного тайм-аута независимо от того активно ли сейчас соединение, соответствующее этой записи. После удаления записи из таблицы обрыв соединения и повторное подключение приведет клиента на произвольный бекэнд, а не на тот, где осталась его сессия. Хочется максимально снизить вероятность такого исхода. Можно увеличить тайм-аут до нескольких суток, но этот вариант, по-сути, убивает балансировку, поэтому он пока не рассматривается.
Проблему можно решить если изменить алгоритм управления записями в таблице: удалять запись по истечению тайм-аута, но отсчёт начинать не от начала соединения, а от его завершения. Значение этого тайм-аута можно согласовать со временем жизни неактивной сессии на терминальных серверах, и получить тем самым решение, гарантирующее консистентное состояния системы.
Собственно, в этом и заключается вопрос: существуют ли средства балансировки с описанной реализацией persistent/stick соединений, когда отсчёт времени до удаления записи из таблицы persistent/stick активируется не по началу соединения, а по его завершению?
Современный nginx умеет проксировать TCP и умеет LUA. Быть может, попробовать выразить логику этой балансировки на LUA, вместо поисков готовых решений? Впрочем, в haproxy тоже есть LUA, но я не знаю что можно с его помощью там сделать.