负载均衡是大型架构的基石,下面我重点详解负载均衡算法@mikechen
1.轮循(默认)
这是Nginx默认的负载均衡算法。它将请求按顺序依次分发给后端服务器,就像一个循环队列。
http { upstream myapp { server 192.168.1.10:8080; server 192.168.1.11:8080; server 192.168.1.12:8080; } server { listen 80; location / { proxy_pass http://myapp; } } }
工作原理:按时间顺序,将客户端请求逐一分配到不同的后端服务器。
优点:简单、公平,能保证每台服务器都得到同等数量的请求。
缺点:无法感知后端服务器的实际处理能力,如果某台服务器性能较弱或正在处理耗时任务,可能会导致其过载。
适用场景:后端服务器性能均等、请求处理时间相近的场景。
加权模式
加权轮询是对传统轮询的优化,它允许为不同的后端服务器设置权重,以反映其处理能力。
upstream myapp { # 这台服务器性能最好,分发10个请求 server 192.168.1.10:8080 weight=10; # 这台服务器性能一般,分发5个请求 server 192.168.1.11:8080 weight=5; # 这台服务器是备用服务器,分发1个请求 server 192.168.1.12:8080 weight=1; }
工作原理:根据服务器的权重比例进行分发。权重值越大,服务器被分配到的请求越多。
优点:能够根据后端服务器的性能差异进行智能分发,有效利用硬件资源。
缺点:依然是按顺序分发,无法实时感知服务器的负载。
适用场景:后端服务器性能不一致,或者需要逐步增加新服务器流量的场景。
ip_hash模式
IP Hash算法通过对客户端的IP地址进行哈希计算,将请求固定分配到一台后端服务器上。
upstream myapp { ip_hash; server 192.168.1.10:8080; server 192.168.1.11:8080; server 192.168.1.12:8080; }
工作原理:使用ip_hash
指令,Nginx会根据客户端的IP地址哈希值,将同一IP的请求始终转发到同一台服务器。
优点:
会话持久化:能确保同一客户端的请求被发送到同一台服务器,非常适合需要维持会话状态(如购物车、用户登录信息)的应用。
解决了跨服务器共享Session的问题。
缺点:
服务器分配不均:如果某个IP地址的访问量特别大,或者客户端IP数量较少,可能会导致负载不均衡。
增加单点风险:如果一台服务器宕机,与该服务器绑定的所有用户的会话都会丢失,直到该服务器恢复。
适用场景:需要保持会话,但又不想使用Session共享机制的场景。
最少连接
最少连接算法是一种动态的负载均衡策略,它会实时地将请求分发给当前连接数最少的后端服务器。
upstream myapp { least_conn; server 192.168.1.10:8080; server 192.168.1.11:8080; server 192.168.1.12:8080; }
工作原理:Nginx会监控所有后端服务器的当前连接数,并选择连接数最少的那台服务器来处理新的请求。
优点:
动态感知负载:能更公平地分配请求,避免将新请求发送给正在处理大量任务的服务器。
优化了长连接场景:对于Websocket、长轮询等长连接应用,该算法能更好地平衡服务器负载。
缺点:需要实时维护连接状态,会稍微增加Nginx的开销,但通常可以忽略不计。
适用场景:请求处理时间差异大、存在大量长连接的场景。