задача тривиальна на самом деле. carp/vrrp на внешний адрес виртуалки, дальше на виртуалках nginx, распределяющий запросы. Если в nginx, в настройках апстрима указано 2 сервера и опция ip_hash, то один и тот же пользователь всегда будет попадать на один и тот же бекенд.
При падении виртуалки внешний адрес уйдёт на вторую, и всё продолжит работать штатно. при падении физического сервера с приложением nginx переправляет запросы на оставшийся в живых и всё опять же продолжает работать