Используя 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 берет верх.