一、负载均衡
负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性。
首先,用户是通过网络直接和web服务器相连,想象一下,如果这个服务器挂了(这种情况随时都可能发生的),那么用户的请求就会得不到响应,将无法访问该网站,这就是著名的单点故障问题,这肯定是不行的,一般而言,商业上的网站其可靠性需要达到至少4个9,也就是99.99&以上。
其次,即使服务器是正常工作的情况,但是如果很多用户在同一时间内访问服务器,超过了服务器的处理能力,那么会出现响应速度慢甚至无法连接的情况,这也是用户无法接受的。
负载均衡的出现可以很好的解决上面两个问题,通过引入一个负载均衡器和至少两个web 服务器,可以有效的解决上面两个问题。注:通常情况下,所有的后端服务器会保证提供相同的内容,以便用户无论哪个服务器响应,都能收到一致的内容。
按照网络模型OSI
四层(传输层)负载均衡:对客户端TCP/IP协议的包转发
七层(应用层)负载均衡:Http的应用层负载均衡,Nginx
就是一个典型的7层负载均衡SLB。
负载均衡常用算法:
- 轮询:为第一个请求选择健康池中的第一个后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。
- 最小连接:优先选择连接数最少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。
- 散列:根据请求源的 IP 的散列(hash)来选择要转发的服务器。这种方式可以一定程度上保证特定用户能连接到相同的服务器。如果你的应用需要处理状态而要求用户能连接到和之前相同的服务器,可以考虑采取这种方式。
二、负载均衡
- 配置
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#代理地址 及映射的服务端的地址
# 最重要的配置
location /api {
proxy_pass http://mysvr; #服务器名称
}
}
- 后端代码
9999服务器:
@RestController
@RequestMapping("/api/user")
@Slf4j
public class UserController {
@GetMapping
public String getServer(){
return "9999服务器";
}
}
8888服务器:
@RestController
@RequestMapping("/api/user")
@Slf4j
public class UserController {
@GetMapping
public String getServer(){
return "8888服务器";
}
}
- 访问测试
重启Nginx:
[root@localhost nginx]# ./sbin/nginx -s reload
刷新:
三、配置详解
- upstream配置
这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法。这里的被代理服务器地址有2种写法。
第一种:
upstream mysvr {
server 192.168.1.9:8888
server 192.168.1.9:9999;
}
server {
....
location ~*^.+$ {
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
}
第二种:
upstream mysvr {
server http://192.168.1.9:8888;
server http://192.168.1.9:9999;
}
server {
....
location ~*^.+$ {
proxy_pass mysvr; #请求转向mysvr 定义的服务器列表
}
- 热备
如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB.....
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999 backup; #热备
}
- 轮询
nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB....
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999;
}
- 加权轮询
跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB....
upstream mysvr {
server 192.168.1.9:8888 weight=1;
server 192.168.1.9:9999 weight=2;
}
- ip_hash
nginx会让相同的客户端ip请求相同的服务器。
upstream mysvr {
server 192.168.1.9:8888;
server 192.168.1.9:9999;
ip_hash;
}
- nginx负载均衡配置状态参数
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
upstream mysvr {
server 192.168.1.9:8888 weight=2 max_fails=2 fail_timeout=2;
server 192.168.1.9:9999 weight=1 max_fails=2 fail_timeout=1;
}