本文编写于 1175 天前,最后修改于 1175 天前,其中某些信息可能已经过时。
Nginx负载均衡调度算法
调度算法 | 概述 |
---|---|
轮询 | 按时间逐一分配到后端服务器 |
weight | 加权轮询,weight越大,分配到的几率越大 |
ip_hash | 每个请求按访问ip的hash分配,这样来自同一个ip访问固定的后端服务器 |
url_hash | 根据请求url进行调度到指定节点 |
least_conn | 将请求传递到链接数量最少的后端服务器 |
轮询调度算法
轮询调度算法是将每一次用户的请求,轮流分配给后端服务器。
优点是简洁性,无需记录当前所有连接的状态,所以他是一种无状态调度。
upstream load_pass {
server 172.16.16.2;
server 172.16.16.3;
}
server {
listen 80;
server_name web.jsocn.com;
location / {
proxy_pass http://load_pass;
include proxy_params; #代理参数参考上篇代理参数总结笔记
}
}
加权轮询调度算法
轮询调度没有考虑到每台服务器的处理能力,实际生产环境中,我们根据每台服务器不同的处理能力,给每台服务器分配不同的权值,使其能够接受相应权值的请求。
upstream load_pass {
server 172.16.16.2 weight=5;
server 172.16.16.3 weight=1;
}
server {
listen 80;
server_name web.jsocn.com;
location / {
proxy_pass http://load_pass;
include proxy_params; #代理参数参考上篇代理参数总结笔记
}
}
ip_hash调度算法
根据用户请求ip进行hash运算,根据运算结果,将请求分配到特定的后端节点。
优点:不用重复下发cookie
缺点:1、当特定节点宕机时,会重新计算hash,然后重新匹配到新的节点
2、流量倾斜,造成后端某个节点流量过大,其他服务器空闲
upstream load_pass {
ip_hash;
server 172.16.16.2;
server 172.16.16.3;
}
server {
listen 80;
server_name web.jsocn.com;
location / {
proxy_pass http://load_pass;
include proxy_params; #代理参数参考上篇代理参数总结笔记
}
}
一致性ip_hash调度算法
解决ip_hash缺点,使用ip_hash的调度算法的一致性ip_hash
upstream load_pass {
hash $remote_ipaddr consistent;#采用一致性ip算法,但仍然采用ip进行hash
server 172.16.16.2;
server 172.16.16.3;
}
server {
listen 80;
server_name web.jsocn.com;
location / {
proxy_pass http://load_pass;
include proxy_params; #代理参数参考上篇代理参数总结笔记
}
}
FAQ:为什么我用内网的客户端去访问一致性ip_hash时,一直调度到同一台节点?
因为ip_hash算法取的ip前三位,内网往往前三位是一样的,所以会调度到同一台上。
url_hash调度算法
根据用户请求的url进行hash取模,根据hash运算的值,将请求分配到后端特定的节点进行处理,需要有cache缓存服务器,一般小规模公司用不到。
- 用户请求nginx负载均衡器,通过url算法,将调度请求至cache1
- 由于cache1节点没有相应的缓存数据,则会请求后端服务器,将数据缓存起来
- 当其他用户去请求相同的url时,此时调度器依旧调度至cache1
- 此时cache1有缓存数据,可以直接返回数据,大幅提高性能
upstream load_pass {
hash $request_uri consistent;
server 172.16.16.2;
server 172.16.16.3;
}
server {
listen 80;
server_name web.jsocn.com;
location / {
proxy_pass http://load_pass;
include proxy_params; #代理参数参考上篇代理参数总结笔记
}
}
least_conn调度算法
哪台连接数少,将请求调度到哪台
upstream load_pass {
least_conn;
server 172.16.16.2;
server 172.16.16.3;
}
server {
listen 80;
server_name web.jsocn.com;
location / {
proxy_pass http://load_pass;
include proxy_params; #代理参数参考上篇代理参数总结笔记
}
}