Резервное копирование haproxy / отработка отказа для серверов один за другим

Я запускаю haproxy 1.6 в нашей среде для различных приложений. Раньше мы использовали продукт Cisco. У Haproxy есть много преимуществ, но есть одна вещь, которую я не могу настроить с помощью haproxy, или я не знаю, как это сделать.

Предположим, у меня есть бэкэнд, настроенный так:

backend test_farm
    mode http
    option httplog
    balance leastconn
    cookie test_farm insert nocache
    option httpchk /test
    option allbackups
    timeout check 10s
    default-server inter 4s fall 15 rise 6
    server host1_server1 host1:24320 check cookie PZ22
    server host1_server2 host1:24350 check cookie PZ23
    server host1_server3 host1:22250 check cookie PZ24
    server host1_server4 host1:22280 check cookie PZ25
    server host1_server5 host1:22310 check cookie PZ26
    server host1_server6 host1:22340 check cookie PZ27

    server host2_server1 host2:24320 check cookie BZ22 backup
    server host2_server2 host2:24350 check cookie BZ23 backup
    server host2_server3 host2:22250 check cookie BZ24 backup
    server host2_server4 host2:22280 check cookie BZ25 backup
    server host2_server5 host2:22310 check cookie BZ26 backup
    server host2_server6 host2:22340 check cookie BZ27 backup

На всех серверах установлено одинаковое приложение. У меня есть несколько бэкэндов с другими приложениями. Но каждый бэкэнд обслуживает только одно конкретное приложение, и количество серверов варьируется. Пользователь должен оставаться на одном сервере настолько долго, насколько это возможно, чтобы избежать повторного входа в систему. Как видите, я использую вставку cookie, чтобы привязать пользователя к его первому подключенному серверу. Приложение не может использовать сохранение сеанса на всех серверах.

Haproxy использует только резервные серверы, когда все нормальные серверы не работают, но я не могу ждать, пока все серверы не работают. В этом случае, возможно, 4 сервера могут справиться с нагрузкой, но потеря еще одного будет бороться с оставшимися 3 серверами. По нескольким причинам я не могу просто сбалансировать нагрузку на все серверы на host1 и host2. Резервные серверы должны быть без нагрузки в нормальных условиях. Я прочитал документацию версии 1.8, но эта не изменилась, и я не нашел никаких новых функций в этом направлении. В продукте cisco вы можете настроить, чтобы при сбое server1 на host1 немедленно использовался server1 на host2 в алгоритме roundrobin или lessconn.

И это мой вопрос, как настроить это поведение.

Я думал / пробовал на некоторых подходах:

  1. Используйте nbsrv в acl и определите два или более разделов бэкэнда на одних и тех же серверах и добавьте резервные: это сработало, но я потерял привязку к сеансу, и поэтому пользователи будут исключены из приложения и им потребуется повторная регистрация. И также я предполагаю, что чем больше бэкэндов существует на тех же серверах, тем больше проверок выполняет процесс, который имеет влияние на нагрузку, которого я хочу избежать.

  2. Определите ту же конфигурацию, что и выше, но не используйте ключевое слово для резервного копирования. Вместо этого я определяю вес 0 для серверов резервного копирования. Затем используйте сценарий, запускаемый cron, и определите через adminsocket, сколько серверов работает, и увеличьте вес серверов резервного копирования (также через adminsocket), если два или более обычных сервера не работают. Я еще не проверял это. Но вы можете себе представить, что это тоже не предпочтительный способ.

  3. Получите мои самые старые знания C на современном уровне и попытайтесь написать код такого поведения, но вы знаете, я бы предпочел придерживаться версий, предоставленных разработчиками, которые обладают гораздо лучшими знаниями в области кодирования.

Я надеюсь, что у некоторых, возможно, тот же сценарий, и он может дать мне подсказку, как это сделать с бордовыми средами. Конечно, я прочитал все, что нашел в Google, но ничего не было связано с моим сценарием.

С наилучшими пожеланиями, Канигл

1 ответ

Будет ли это работать больше, чем вы ожидаете / хотите?

Как это работает: когда число активных серверов на test_farm становится меньше 4, оно полностью переключается на test_farm_backup.

В любом случае, помните, что как только вы включите 4 сервера в test_farm, трафик переключится.

frontend ft_test_farm
    bind 10.10.10.10:80
    # detect if we go under 4 active servers
    acl test_farm_overflow nbsrv(test_farm) le 4
    use_backend test_farm_backup if test_farm_overflow
    default_backend test_farm

backend test_farm
    mode http
    balance leastconn
    cookie test_farm insert nocache
    option httpchk /test
    timeout check 10s
    default-server inter 4s fall 15 rise 6
    server host1_server1 host1:24320 check cookie PZ22
    server host1_server2 host1:24350 check cookie PZ23
    server host1_server3 host1:22250 check cookie PZ24
    server host1_server4 host1:22280 check cookie PZ25
    server host1_server5 host1:22310 check cookie PZ26
    server host1_server6 host1:22340 check cookie PZ27

backend test_farm_backup
    mode http
    balance leastconn
    cookie test_farm insert nocache
    option httpchk /test
    timeout check 10s
    default-server inter 4s fall 15 rise 6
    server host2_server1 host2:24320 check cookie BZ22
    server host2_server2 host2:24350 check cookie BZ23
    server host2_server3 host2:22250 check cookie BZ24
    server host2_server4 host2:22280 check cookie BZ25
    server host2_server5 host2:22310 check cookie BZ26
    server host2_server6 host2:22340 check cookie BZ27
Другие вопросы по тегам