关于LVS+Nginx为什么会被同时使用的思考

最初的理解

(也可以每个nginx都挂在上所有的应用服务器)
nginx大家都在用,估计也很熟悉了,在做负载均衡时很好用,安装简单、配置简单、相关材料也特别多。

lvs是国内的章文嵩博士的大作,比nginx被广泛接受还要早7年,并且已经被红帽作为了系统内置软件,可谓很牛了。lvs相对于nginx来说配置上就要相对复杂一些。

但是,有时候我们会看到大牛们分享的经验里面是lvs+nginx作为负载均衡了,一直想不明白这是个什么道理。

为什么会出现两者被同时使用呢?其实,这要从两者的各自优势来说了。

nginx用来做http的反向代理,能够upsteam实现http请求的多种方式的均衡转发。由于采用的是异步转发可以做到如果一个服务器请求失败,立即切换到其他服务器,直到请求成功或者最后一台服务器失败为止。这可以最大程度的提高系统的请求成功率。

lvs采用的是同步请求转发的策略。这里说一下同步转发和异步转发的区别。同步转发是在lvs服务器接收到请求之后,立即redirect到一个后端服务器,由客户端直接和后端服务器建立连接。异步转发是nginx在保持客户端连接的同时,发起一个相同内容的新请求到后端,等后端返回结果后,由nginx返回给客户端。

进一步来说:当做为负载均衡服务器的nginx和lvs处理相同的请求时,所有的请求和响应流量都会经过nginx;但是使用lvs时,仅请求流量经过lvs的网络,响应流量由后端服务器的网络返回。

也就是,当作为后端的服务器规模庞大时,nginx的网络带宽就成了一个巨大的瓶颈。

但是仅仅使用lvs作为负载均衡的话,一旦后端接受到请求的服务器出了问题,那么这次请求就失败了。但是如果在lvs的后端在添加一层nginx(多个),每个nginx后端再有几台应用服务器,那么结合两者的优势,既能避免单nginx的流量集中瓶颈,又能避免单lvs时一锤子买卖的问题。

参考文章:
章文嵩:LVS项目介绍
moon:强大的nginx反向代理异步传输模式(原理)

yaoweibin:nginx健康检查
追马博客:LVS+keepalived+nginx+tomcat部署实现

补充(20160731 下午2:07):

在后续继续了解这部分内容时,发现了这两个帖子:
1. 有了LVS,还要apache,nginx有什么用?
2.从一个开发的角度看负载均衡和LVS—–注意看最后一个lvs集群化的图,nginx和rs是一对一连接的。

从以上文章来看,lvs+nginx组合使用的原因主要是用lvs来做负载均衡(因为工作在4层,效率高),nginx来做静态文件的处理。

这里第二篇文章,和lvs的后续维护者之一的[吴佳明_普空的ppt](http://velocity.oreilly.com.cn/2012/ppts/pukong.pdf
)中比章博士的文章中多出了一种转发模式,也就是full_nat模式,这种模式下,所有的响应也要经过lvs服务器作为出口返回给客户端。

lvs在full_nat的模式下,是否还是同步的模式呢?我猜想应该是的,因为lvs工作在4层,所以可能当前出错的响应要映射到之前的那一次请求(因为没有解析http包),所以也就做不到把错误转发到其他的应用服务器上重新处理。

另外,这个补充是不是就完全的否定了昨天(也就是补充之前的那一大段)的内容呢?我觉得并没有。昨天的理解可能不是正规大型互联网在使用的模式(当然,这里我不能确定,因为我没有大型互联网的经验),但是理论应该是对的。

具体一点,lvs+nginx的组合nginx用来做静态文件的处理的场景下,如果一次请求失败了,那么久不能被重新处理了,当然你的nginx也可以后挂1个以上的应用服务器(这样的话nginx实质上也是起到了lvs均衡补充的效果)。另外就是,nginx不是单单的作为静态文件的处理,而是作为lvs的一个补充,互相弥补均衡上的不足。

那么你可能会说lvs在4层上处理的高效就不复存在了,确实是的,这点要承认,但是,我们提高了系统请求的成功率,两者需要各自去选择和权衡。

另外,需要说的一点是,静态内容其实我们还可以借助cdn去处理,而不是单单的依靠nginx或者apache去处理。

补充(2016年12月17日 上午11:24)

现在到了比较大一些的互联网公司,也看了京东的用法(可以看开涛的nginx+lua系列http://www.iteye.com/blogs/subjects/nginx-lua)。

lvs+nginx的使用中,nginx还可以作为一个中间环节来减小后端tomcat的服务压力,以及做一些业务切换、分流、前置缓存的功能。

已标记关键词 清除标记
MASTER级配置: ! Configuration File for keepalived global_defs { router_id LVS_DEVEL } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 100 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 10.23.52.200 } } virtual_server 10.23.52.200 80{ delay_loop 6 lb_algo wrr lb_kind DR persistence_timeout 1 protocol TCP real_server 10.23.52.113 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_:retry 3 } } real_server 10.23.52.114 80{ weight 1 TCP_CHECK { connect_port 80 connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } 查看监听情况: [root@localhost keepalived]# ipvsadm -ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 10.23.52.200:80 wrr persistent 1 -> 10.23.52.113:80 Route 1 0 0 -> 10.23.52.114:80 Route 1 0 0 [root@localhost keepalived]# 查看日志: [root@localhost keepalived]# tail -f /var/log/messages Mar 6 10:31:25 localhost kernel: IPVS: [wrr] scheduler registered. Mar 6 10:31:26 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Transition to MASTER STATE Mar 6 10:31:27 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Entering MASTER STATE Mar 6 10:31:27 localhost Keepalived_vrrp: VRRP_Instance(VI_1) setting protocol VIPs. Mar 6 10:31:27 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.23.52.200 Mar 6 10:31:32 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.23.52.200 Mar 6 10:32:08 localhost Keepalived_healthcheckers: TCP connection to [10.23.52.113]:80 failed !!! Mar 6 10:32:08 localhost Keepalived_healthcheckers: Removing service [10.23.52.113]:80 from VS [10.23.52.200]:80 Mar 6 10:32:20 localhost Keepalived_healthcheckers: TCP connection to [10.23.52.113]:80 success. Mar 6 10:32:20 localhost Keepalived_healthcheckers: Adding service [10.23.52.113]:80 to VS [10.23.52.200]:80 访问真是IP: [root@localhost keepalived]# curl 10.23.52.113 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.我是113号机器 </em></p> </body> </html> [root@localhost keepalived]# 访问VIP一直没有反应: [root@localhost keepalived]# curl 10.23.52.200 curl: (7) couldn't connect to host [root@localhost keepalived]#
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页