Mercurial > hg > nginx-quic
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; |