diff --git a/doc/configuration.txt b/doc/configuration.txt index d0475244b..a93c10380 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -2205,6 +2205,32 @@ balance url_param [check_post] See also : "dispatch", "cookie", "transparent", "hash-type" and "http_proxy". +balance-factor + Specify the balancing factor for bounded-load consistent hashing + May be used in sections : defaults | frontend | listen | backend + yes | no | no | yes + Arguments : + is the control for the maximum number of concurrent requests to + send to a server, expressed as a percentage of the average number + of concurrent requests across all of the active servers. + + Specifying a "balance-factor" for a server with "hash-type consistent" + enables an algorithm that prevents any one server from getting too many + requests at once, even if some hash buckets receive many more requests than + others. Setting to 0 (the default) disables the feature. Otherwise, + is a percentage greater than 100. For example, if is 150, + then no server will be allowed to have a load more than 1.5 times the average. + If server weights are used, they will be respected. + + If the first-choice server is disqualified, the algorithm will choose another + server based on the request hash, until a server with additional capacity is + found. A higher allows more imbalance between the servers, while a + lower means that more servers will be checked on average, affecting + performance. Reasonable values are from 125 to 200. + + See also : "balance" and "hash-type". + + bind [
]: [, ...] [param*] bind / [, ...] [param*] Define one or several listening addresses and/or ports in a frontend. @@ -3358,7 +3384,7 @@ hash-type default function is "sdbm", the selection of a function should be based on the range of the values being hashed. - See also : "balance", "server" + See also : "balance", "balance-factor", "server" http-check disable-on-404 diff --git a/include/types/lb_chash.h b/include/types/lb_chash.h index 5991ce961..b711636e2 100644 --- a/include/types/lb_chash.h +++ b/include/types/lb_chash.h @@ -30,6 +30,7 @@ struct lb_chash { struct eb_root act; /* weighted chash entries of active servers */ struct eb_root bck; /* weighted chash entries of backup servers */ struct eb32_node *last; /* last node found in case of round robin (or NULL) */ + int balance_factor; /* load balancing factor * 100, 0 if disabled */ }; #endif /* _TYPES_LB_CHASH_H */ diff --git a/src/cfgparse.c b/src/cfgparse.c index cc2f507e7..229b3ceb8 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -1983,6 +1983,7 @@ void init_default_instance() defproxy.maxconn = cfg_maxpconn; defproxy.conn_retries = CONN_RETRIES; defproxy.redispatch_after = 0; + defproxy.lbprm.chash.balance_factor = 0; defproxy.defsrv.check.inter = DEF_CHKINTR; defproxy.defsrv.check.fastinter = 0; @@ -2825,6 +2826,7 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) if (curproxy->cap & PR_CAP_BE) { curproxy->lbprm.algo = defproxy.lbprm.algo; + curproxy->lbprm.chash.balance_factor = defproxy.lbprm.chash.balance_factor; curproxy->fullconn = defproxy.fullconn; curproxy->conn_retries = defproxy.conn_retries; curproxy->redispatch_after = defproxy.redispatch_after; @@ -5958,6 +5960,19 @@ stats_error_parsing: } } } + else if (strcmp(args[0], "hash-balance-factor") == 0) { + if (*(args[1]) == 0) { + Alert("parsing [%s:%d] : '%s' expects an integer argument.\n", file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + curproxy->lbprm.chash.balance_factor = atol(args[1]); + if (curproxy->lbprm.chash.balance_factor != 0 && curproxy->lbprm.chash.balance_factor <= 100) { + Alert("parsing [%s:%d] : '%s' must be 0 or greater than 100.\n", file, linenum, args[0]); + err_code |= ERR_ALERT | ERR_FATAL; + goto out; + } + } else if (strcmp(args[0], "unique-id-format") == 0) { if (!*(args[1])) { Alert("parsing [%s:%d] : %s expects an argument.\n", file, linenum, args[0]);