项目是部署在tomcat中,前端使用Nginx来进行请求转发,讨论问题时提到Nginx的负载均衡策略时一脸懵逼,因为之前使用的都是别人配置好的现成的Nginx+Keepalived,没有关注过细节,所以本博文打算初步了解下Nginx,后续有必要再做深入的研究。
Nginx = 反向代理 + 负载均衡
反向代理 vs 正向代理:
反向代理是在服务端发生的。服务端隐藏了真实的IP,客户端通过请求反向代理服务器,让反向代理服务器访问后端的服务器。
正向代理是在客户端发生的。比如VPN,VPN实在客户端的浏览器中设置的,浏览器先访问VPN地址,然后VPN将请求转发至对应的服务器。
Nginx的几种负载均衡策略:
Nginx提供了多种负载均衡策略用于分发用户请求,它们分别是:
1.轮询(默认)
按顺序逐一将请求分配到后端服务器,如果服务器down掉,可以自动剔除。
upstream backend {
server 192.168.1.16;
server 192.168.1.17;
}
2.指定权重
主要用于后端服务器性能不一致的情况,给性能好的服务器配置高一点的权重,处理更多的请求
upstream backend {
server 192.168.1.16 weight=3;
server 192.168.1.17 weight=6;
}
3.ip_hash
请求按照访问ip的hash结果分配,这样每个客户端ip会访问后端固定的一台服务器,可以解决session共享问题。
upstream backend {
server 192.168.1.16:80;
server 192.168.1.17:81;
}
Session共享问题指的是,例如再进行用户验证的时候,验证码生产使用session1,验证码验证的时候是session2,他们是分布在两台不同的服务器,可能就会出现永远无法验证的问题。
4.fair(第三方提供)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5.url_hash(第三方提供)
每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
Keepalived的作用:
Keepalived最初是为LVS集群设计的,监控LVS集群中各个节点的状态,如果发现有节点发生故障,可以将故障节点剔除。后来又加入了VRRP协议,解决路由单点故障问题,保证网络的不间断稳定运行。
所以Keepalived有两大用途:healthcheck(管理LVS,对LVS下面的节点进行检查) & failover(主备自动切换 -- VRRP协议实现)
Keepalived工作时只有主节点在工作,备节点是不工作的。故障时会切换到备节点工作;主节点修复之后,备节点会切回到主节点。
Nginx与LVS的区别:
两者的区别在于Nginx是基于第七层协议开发的,采用异步转发的原则,即在保持客户端链接的同时新起一个链接到负载均衡的服务端,等待服务端返回数据再返回给客户端。这么的好处是Nginx可以进行失败转移(failover),如果Nginix和后端某台服务器的链接不通畅,可以换一个链接,保证用户请求的稳定性。
LVS是基于第四层协议开发的,采用同步转发的原则,即LVS监听到端口有链接时,会直接redirect到后端的服务器,让服务端直接与客户端直接进行链接。这样做避免了Nginx单点大流量的带宽瓶颈问题,但是有一个弊端是如果请求失败了,LVS不会像Nginx一样做失败转移,请求直接就失败了
网络上看到现在都是Lvs+Nginx结合在一起使用的,前面使用LVS连接到后面的Nginx,这种混合使用的方式可以建立更好的链接。
参考:
https://www.jianshu.com/p/ae76c223c6ef(正向代理vs反向代理图解)
https://www.cnblogs.com/kakatadage/p/9995578.html(Nginx分布式集群)
https://www.cnblogs.com/1214804270hacker/p/9325150.html(6中Nginx负载均衡策略)
https://www.cnblogs.com/lbwniubi/articles/7978096.html(LVS+Nginx混合使用)