Назад | Перейти на главную страницу

Идея снятия половины серверов против скользящего перезапуска?

Мы настраиваем HAProxy для балансировки нашего приложения (ASP.NET MVC 3, работающего на IIS). Мы хотим, чтобы в нашем процессе не было планового обслуживания для развертывания. Я пытаюсь найти правильный способ использования "качелей", чтобы обслуживать только одну версию приложения для новые запросы за один раз. Вот что я до сих пор придумал:

  1. Удалить первая половина серверов из HAProxy, перезагрузив конфиг:

    $ sed -i 's/web01.*/& disabled/' /etc/haproxy/haproxy.cfg
    $ sed -i 's/web02.*/& disabled/' /etc/haproxy/haproxy.cfg
    $ /etc/init.d/haproxy reload
    
  2. Обновите приложение на каждом даун инстансе и ткните им curl чтобы согреть их.

  3. Вернуть первая половина и удалите Вторая половина:

    $ 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
    
  4. Повторите шаг 2 для второй половины.

  5. Вернуть Вторая половина:

    $ 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 заменить конфиг кажется как хак. Вот мои другие альтернативы, которые я думал использовать:

  1. Используйте сокет UNIX, чтобы сделать тот же подход «качелей». Однако, поскольку сокет UNIX может работать только с одним сервером одновременно, а развертывание может занять несколько секунд для каждого сервера, это может привести к HTML в версии 2 и JavaScript для версии 1. Во всяком случае, гораздо проще написать код с обратной совместимостью, чем с прямой. Таким образом, использование этого подхода может не сработать.

  2. Используйте последовательное развертывание на серверах либо с сокетами UNIX, либо с проверкой работоспособности. Во время своего исследования я обнаружил, что этот подход является наиболее популярным. Однако это приводит к тем же проблемам, что и сокеты UNIX - необходимости писать прямая совместимость код.

Может быть, я полностью усложняю это или упускаю что-то очевидное ...

Итак, вы беспокоитесь о том, что некоторые активы не совпадают по версиям друг с другом. На самом деле это не проблема с балансировщиком нагрузки, а проблема с кодом. Распространенной практикой является «версирование» ресурсов с помощью параметра. Например, my.html может содержать:

<link rel="stylesheet" href="http://foo.com/css/blah.css?v123">

У вас должен быть глобальный параметр где-то в вашем коде, который вы увеличиваете при выпуске. В любом случае вам нужно принудительно перезагрузить ресурсы на стороне клиента, поскольку они будут там кэшироваться.