最初的理解

(也可以每个 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 时一锤子买卖的问题