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

Используйте резервные копии, если они недоступны (а не только недоступны)

Используя haproxy, я хочу:

Прямо сейчас у меня есть один бэкэнд, «основные» серверы имеют абсурдно высокий вес, и он «работает».

acl use_backend + connslots идет по правильному пути, но без патч в моем собственном ответе это не идеально.

Бонусные баллы за то, что не требуется модифицированный двоичный файл haproxy.

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

Приведенная ниже конфигурация проверяет интерфейс "monitor_conns", и если имеется 500 или более соединений, они будут отправлены в бэкэнд "резервных копий", в противном случае они перейдут в "обычный" бэкэнд.

Вот непроверенный пример:

frontend monitor_conns
  bind *:80
  acl too_many_conns fe_conn 500
  use_backend backups if too_many_conns
  default_backend regular

backend backups
  ... your config
  server backupsrv 192.168.0.101:80 check port 80 maxconn 1000 inter 1s rise 1 fall 1

backend regular
  ... your config
  server regularsrv 192.168.0.100:80 check port 80 maxconn 500 inter 1s rise 1 fall 1

Это всего лишь пример, но он должен дать вам представление о том, как действовать дальше.

Старый вопрос, но я сталкиваюсь с той же проблемой, и вот мое решение:

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

Итак, конфиг будет выглядеть так

frontend frontend1 127.0.0.1:9200
    mode tcp
    acl max_conn_reached fe_conn gt 15
    acl production_almost_dead nbsrv(prod1) lt 2

    default_backend prod1
    use_backend prod1_and_prod2 if max_conn_reached OR production_almost_dead

backend prod1
    mode tcp
    balance leastconn
    server se_prod1 127.0.0.1:8001 check maxconn 10
    server se_prod2 127.0.0.1:8002 check maxconn 10

backend prod1_and_prod2
    mode tcp
    balance leastconn

    server se_prod1 127.0.0.1:8001 check maxconn 10
    server se_prod2 127.0.0.1:8002 check maxconn 10

    server se_backup1 127.0.0.1:8003 check maxconn 10
    server se_backup2 127.0.0.1:8004 check maxconn 10

Внешний интерфейс будет использовать резервный сервер (вместе с производственным сервером), если соединение на интерфейсе больше 15 или одна служба на backend1 не работает

Мне кажется, что следующее работает, но требует исправления haproxy-1.4.15 / src / backend.c:

# diff haproxy-1.4.15/src/backend.c backend.c
1298a1299,1333
> /* set test->i to the number of enabled servers on the proxy */
> static int
> acl_fetch_connfree(struct proxy *px, struct session *l4, void *l7, int dir,
>                     struct acl_expr *expr, struct acl_test *test)
> {
>         struct server *iterator;
>         test->flags = ACL_TEST_F_VOL_TEST;
>         if (expr->arg_len) {
>                 /* another proxy was designated, we must look for it */
>                 for (px = proxy; px; px = px->next)
>                         if ((px->cap & PR_CAP_BE) && !strcmp(px->id, expr->arg.str))
>                                 break;
>         }
>         if (!px)
>                 return 0;
>
>         test->i = 0;
>         iterator = px->srv;
>         while (iterator) {
>                 if ((iterator->state & SRV_RUNNING) == 0) {
>                         iterator = iterator->next;
>                         continue;
>                 }
>                 if (iterator->maxconn == 0) {
>                         test->i = -1;
>                         return 1;
>                 }
>
>                 test->i += (iterator->maxconn - (iterator->cur_sess + iterator->nbpend));
>                 iterator = iterator->next;
>         }
>
>         return 1;
> }
>
1461a1497
>       { "connfree", acl_parse_int,   acl_fetch_connfree, acl_match_int, ACL_USE_NOTHING },

Тогда я могу использовать connfree в моем acl:

frontend frontend1
    bind *:12345
    acl main_full connfree(main) eq 0
    use_backend backup if main_full
    default_backend     main

backend main
    balance leastconn
    default-server maxconn 1 maxqueue 1
    server main2 10.0.0.1:12345 check
    server main1 10.0.0.2:12345 check

backend backup
    balance leastconn
    default-server maxconn 1 maxqueue 1
    server backup1 10.0.1.1:12345 check
    server backup2 10.0.1.2:12345 check

Надеюсь, сравнивая acl_fetch_connfree() к acl_fetch_connslots() сделает изменение очевидным:

old = (maxconn - текущие соединения) + (maxqueue - ожидающие соединения)

new = maxconn - (текущие соединения + ожидающие соединения)

используйте параметр "резервное копирование" в разделе backend

frontend my-frontend *:9091 #arbitrary name for the frontend
         maxconn 500
         default_backend my-backend

backend my-backend
        mode http
        option httpchk
        server solr-1 10.30.3.100:9091 weight 1 maxconn 500 check
        server solr-2 10.30.3.101:9091 weight 1 maxconn 500 check backup

если solr-1 не дает httpchk, то solr-2 берет верх.