comparison src/http/ngx_http_upstream_round_robin.h @ 4621:c90801720a0c

Upstream: smooth weighted round-robin balancing. For edge case weights like { 5, 1, 1 } we now produce { a, a, b, a, c, a, a } sequence instead of { c, b, a, a, a, a, a } produced previously. Algorithm is as follows: on each peer selection we increase current_weight of each eligible peer by its weight, select peer with greatest current_weight and reduce its current_weight by total number of weight points distributed among peers. In case of { 5, 1, 1 } weights this gives the following sequence of current_weight's: a b c 0 0 0 (initial state) 5 1 1 (a selected) -2 1 1 3 2 2 (a selected) -4 2 2 1 3 3 (b selected) 1 -4 3 6 -3 4 (a selected) -1 -3 4 4 -2 5 (c selected) 4 -2 -2 9 -1 -1 (a selected) 2 -1 -1 7 0 0 (a selected) 0 0 0 To preserve weight reduction in case of failures the effective_weight variable was introduced, which usually matches peer's weight, but is reduced temporarily on peer failures. This change also fixes loop with backup servers and proxy_next_upstream http_404 (ticket #47), and skipping alive upstreams in some cases if there are multiple dead ones (ticket #64).
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 14 May 2012 09:57:20 +0000
parents d620f497c50f
children 382c523d253a
comparison
equal deleted inserted replaced
4620:204b780a89de 4621:c90801720a0c
18 struct sockaddr *sockaddr; 18 struct sockaddr *sockaddr;
19 socklen_t socklen; 19 socklen_t socklen;
20 ngx_str_t name; 20 ngx_str_t name;
21 21
22 ngx_int_t current_weight; 22 ngx_int_t current_weight;
23 ngx_int_t effective_weight;
23 ngx_int_t weight; 24 ngx_int_t weight;
24 25
25 ngx_uint_t fails; 26 ngx_uint_t fails;
26 time_t accessed; 27 time_t accessed;
27 time_t checked; 28 time_t checked;