As reported by Damien Claisse and Cédric Paillet, the "random" LB algorithm can become particularly unfair with large numbers of servers having few connections. It's indeed fairly common to see many servers with zero connection in a thousand-server large farm, and in this case the P2C algo consisting in checking the servers' loads doesn't help at all and is basically similar to random(1). In this case, we only rely on the distribution of server IDs in the random space to pick the best server, but it's possible to observe huge discrepancies. An attempt to model the problem clearly shows that with 1600 servers with weight 10, for 1 million requests, the lowest loaded ones will take 300 req while the most loaded ones will get 780, with most of the values between 520 and 700. In addition, only the first 28 lower bits of server IDs are used for the key calculation, which means that node keys are more determinist. Setting random keys in the lowest 28 bits only better packs values with min around 530 and max around 710, with values mostly between 550 and 680. This can only be compensated by increasing weights and draws without being a perfect fix either. At 4 draws, the min is around 560 and the max around 670, with most values bteween 590 and 650. This patch takes another approach to this problem: when servers are on tie regarding their loads, instead of arbitrarily taking the second one, we now compare their current request rates, which is updated all the time and smoothed over one second, and we pick the server with the lowest request rate. Now with 2 draws, the curve is mostly flat, with the min at 580 and the max at 628, and almost all values between 611 and 625. And 4 draws exclusively gives values from 614 to 624. Other points will need to be addressed separately (bits of server ID, maybe refine the hash algorithm), but these ones would affect how caches are selected, and cannot be changed without an extra option. For random however we can perform a change without impacting anyone. This should be backported, probably only to 3.3 since it's where the "random" algo became the default. |
||
|---|---|---|
| .github | ||
| addons | ||
| admin | ||
| dev | ||
| doc | ||
| examples | ||
| include | ||
| reg-tests | ||
| scripts | ||
| src | ||
| tests | ||
| .cirrus.yml | ||
| .gitattributes | ||
| .gitignore | ||
| .mailmap | ||
| .travis.yml | ||
| BRANCHES | ||
| BSDmakefile | ||
| CHANGELOG | ||
| CONTRIBUTING | ||
| INSTALL | ||
| LICENSE | ||
| MAINTAINERS | ||
| Makefile | ||
| README.md | ||
| SUBVERS | ||
| VERDATE | ||
| VERSION | ||
HAProxy
HAProxy is a free, very fast and reliable reverse-proxy offering high availability, load balancing, and proxying for TCP and HTTP-based applications.
Installation
The INSTALL file describes how to build HAProxy. A list of packages is also available on the wiki.
Getting help
The discourse and the mailing-list are available for questions or configuration assistance. You can also use the slack or IRC channel. Please don't use the issue tracker for these.
The issue tracker is only for bug reports or feature requests.
Documentation
The HAProxy documentation has been split into a number of different files for ease of use. It is available in text format as well as HTML. The wiki is also meant to replace the old architecture guide.
Please refer to the following files depending on what you're looking for:
- INSTALL for instructions on how to build and install HAProxy
- BRANCHES to understand the project's life cycle and what version to use
- LICENSE for the project's license
- CONTRIBUTING for the process to follow to submit contributions
The more detailed documentation is located into the doc/ directory:
- doc/intro.txt for a quick introduction on HAProxy
- doc/configuration.txt for the configuration's reference manual
- doc/lua.txt for the Lua's reference manual
- doc/SPOE.txt for how to use the SPOE engine
- doc/network-namespaces.txt for how to use network namespaces under Linux
- doc/management.txt for the management guide
- doc/regression-testing.txt for how to use the regression testing suite
- doc/peers.txt for the peers protocol reference
- doc/coding-style.txt for how to adopt HAProxy's coding style
- doc/internals for developer-specific documentation (not all up to date)
License
HAProxy is licensed under GPL 2 or any later version, the headers under LGPL 2.1. See the LICENSE file for a more detailed explanation.
