Мы настраиваем HAProxy для балансировки нашего приложения (ASP.NET MVC 3, работающего на IIS). Мы хотим, чтобы в нашем процессе не было планового обслуживания для развертывания. Я пытаюсь найти правильный способ использования "качелей", чтобы обслуживать только одну версию приложения для новые запросы за один раз. Вот что я до сих пор придумал:
Удалить первая половина серверов из HAProxy, перезагрузив конфиг:
$ sed -i 's/web01.*/& disabled/' /etc/haproxy/haproxy.cfg
$ sed -i 's/web02.*/& disabled/' /etc/haproxy/haproxy.cfg
$ /etc/init.d/haproxy reload
Обновите приложение на каждом даун инстансе и ткните им curl
чтобы согреть их.
Вернуть первая половина и удалите Вторая половина:
$ sed -i 's/\(web01.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg
$ sed -i 's/\(web02.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg
$ sed -i 's/web03.*/& disabled/' /etc/haproxy/haproxy.cfg
$ sed -i 's/web04.*/& disabled/' /etc/haproxy/haproxy.cfg
$ /etc/init.d/haproxy reload
Повторите шаг 2 для второй половины.
Вернуть Вторая половина:
$ sed -i 's/\(web03.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg
$ sed -i 's/\(web04.*\) disabled$/\1/' /etc/haproxy/haproxy.cfg
$ /etc/init.d/haproxy reload
С подходом, описанным выше, существующие запросы будут плавно продолжать использовать V1 приложения, а затем V2 для любых последующих запросов. Я согласен с этим, потому что это значительно снизит вероятность обслуживания двух разных версий.
Однако, используя sed
заменить конфиг кажется как хак. Вот мои другие альтернативы, которые я думал использовать:
Используйте сокет UNIX, чтобы сделать тот же подход «качелей». Однако, поскольку сокет UNIX может работать только с одним сервером одновременно, а развертывание может занять несколько секунд для каждого сервера, это может привести к HTML в версии 2 и JavaScript для версии 1. Во всяком случае, гораздо проще написать код с обратной совместимостью, чем с прямой. Таким образом, использование этого подхода может не сработать.
Используйте последовательное развертывание на серверах либо с сокетами UNIX, либо с проверкой работоспособности. Во время своего исследования я обнаружил, что этот подход является наиболее популярным. Однако это приводит к тем же проблемам, что и сокеты UNIX - необходимости писать прямая совместимость код.
Может быть, я полностью усложняю это или упускаю что-то очевидное ...
Итак, вы беспокоитесь о том, что некоторые активы не совпадают по версиям друг с другом. На самом деле это не проблема с балансировщиком нагрузки, а проблема с кодом. Распространенной практикой является «версирование» ресурсов с помощью параметра. Например, my.html может содержать:
<link rel="stylesheet" href="http://foo.com/css/blah.css?v123">
У вас должен быть глобальный параметр где-то в вашем коде, который вы увеличиваете при выпуске. В любом случае вам нужно принудительно перезагрузить ресурсы на стороне клиента, поскольку они будут там кэшироваться.