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

резервное копирование / отказоустойчивость 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, но ничего не было связано с моим сценарием.

С уважением, kaniggl

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

Как это работает: когда количество активных серверов на 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