负载均衡是大型架构的必经之路,也是各分布式中间件的核心组件,下面我就全面来详解Nginx负载均衡原理@mikechen
Nginx负载均衡
负载均衡是一种在多个服务器、或资源之间,分配客户端请求的方法,以优化资源使用、以及提升系统性能。
负载均衡可以水平扩展,即通过增加更多的服务器,来处理更多的请求,如下图所示:
上面的负载均衡器,可以采用目前主流的:Nginx、LVS…等负载均衡器来实现。
当流量增加时,可以轻松添加新的服务器,到负载均衡中,以应对不断增长的需求。
并且,当某台服务器出现故障时,负载均衡器,会自动将流量重新分配到其他可用服务器上,从而避免系统停机、或服务中断。
所以,负载均衡不仅可以提升性能,还可以更好的解决系统可用性的问题。
Nginx负载均衡原理
负载均衡器(Load Balancer),一般位于客户端、和服务器之间。
如下图所示:
负载均衡器,作为中介接受客户端请求,然后,根据预定的“负载均衡策略”,将请求分发给后端服务器进行处理。
常见的策略,包含:轮询 (Round Robin)、最少连接 (Least Connections)、加权………等等。
1.轮询
轮询 (Round Robin):按顺序将请求,分配给每个后端服务器,循环往复。
如下图所示:
在 Nginx 的负载均衡配置中,轮询 (Round Robin) 是一种默认且常用的策略,即请求按顺序依次分配给每个后端服务器。
假设我们有四台后端服务器,命名为 backend1
、backend2
、backend3
和 backend4
,轮询策略,将依次将请求分配给这些服务器。
如下所示:
http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; } server { listen 80; location / { proxy_pass http://backend; } } }
在这个配置中,Nginx 将请求依次分配给 backend1
、backend2
、backend3
和 backend4
,然后再从 backend1
开始循环。
2、加权轮询 (Weighted Round Robin)
加权轮询:在轮询的基础上,多增加一个权重,比如:为每个服务器分配权重,权重越高的服务器接收到的请求越多。
如下图所示:
配置如下:
http { upstream backend { server backend1.example.com weight=3; server backend2.example.com weight=2; server backend3.example.com weight=1; server backend4.example.com weight=4; } server { listen 80; location / { proxy_pass http://backend; } } }
还是举一个例子,假如:我们有10个客户端,按照上面的3、2、1、4的权重。
在这个配置中,最终:backend1
将接收 3 份请求,backend2
接收 2 份,backend3
接收 1 份,backend4
接收 4 份请求。
所以,可以很直观的就可以看出:加权轮询,使得一些服务器在轮询过程中接收更多的请求,从而可以更好地利用资源。
如果你的服务器配置不一致,就可以采用加权轮询的策略。
3、最少连接 (Least Connections)
最少连接:就是将请求,分配给当前活动连接数最少的服务器。
如下图所示:
假设我们有四台后端服务器,命名为 backend1
、backend2
、backend3
、和 backend4
。
http { upstream backend { least_conn; server backend1.example.com; server backend2.example.com; server backend3.example.com; server backend4.example.com; } server { listen 80; location / { proxy_pass http://backend; } } }
在这个配置中,least_conn
指令指定了最少连接策略,Nginx 会将新请求分配给当前活动连接数最少的服务器。
还是举一个例子,比如:当前的状态连接是这样:
backend1 活动连接数:2 backend2 活动连接数:3 backend3 活动连接数:1 backend4 活动连接数:4
当有一个新请求到达时,Nginx 会选择 backend3
,因为它的活动连接数最少(1)。
后续,就依此类推,Nginx 会继续将新请求,分配给当前活动连接数最少的服务器。
4、IP 哈希 (IP Hash)
IP哈希:就是根据客户端 IP 地址的哈希值,将请求分配到固定的服务器,确保会话保持。
如下图所示:
配置如下:
upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; }
为了更好地理解 IP 哈希策略的工作过程,假设我们有以下四个客户端 IP 地址:
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
Nginx 将通过哈希函数,计算每个 IP 地址的哈希值,并将请求分配给相应的服务器。
比如:
客户端 192.168.1.1
发送请求:Nginx 计算哈希值并分配给 backend1;
客户端 192.168.1.2
发送请求:Nginx 计算哈希值并分配给 backend2;
这种方法,确保了来自同一 IP 地址的请求,总是被路由到同一台服务器。
非常适合需要会话保持的应用,比如:购物车、用户会话…….等场景。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》