登录后台

页面导航

本文编写于 808 天前,最后修改于 808 天前,其中某些信息可能已经过时。

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;  #代理参数参考上篇代理参数总结笔记
    }
}