架构图

总结
一般流量大的话/网站,会有好几层负载均衡器,而不是只有一层。这些层可以按不同的维度去分类,比如按四层或七层协议,按硬件还是软件。
按网络协议层划分 1.lvs-四层 //基于ip地址 2.nginx-七层 //基于http请求协议
3.DNS
一个域名可以配置多个ip,由网络运营商去做轮询,站主只需要配置多个ip绑定到同一个域名即可。
优点是简单 方便。
缺点是不能监控是否挂了/宕机,因为是由网络运营商轮询,网络运营商只负责轮询,不负责监控;也不能保存会话session,因为每次都是随机,所以对于有会话session需要的站点是不适合的,只有官网主页这种展示性的网页站点才适合这种方式。
按硬件和软件划分
比如说四层,
1.硬件
F5 //优点是功能全面/丰富 稳定;缺点是价格贵,几十上百万。
2.软件
lvs //优点是便宜 免费,比一般的四层-负载均衡器软件性能高很多,但是只有硬件的60%;缺点是没有硬件那么强。
总结
所以,一线互联网公司,一般都是综合同时使用以上三种负载均衡器。
负载均衡器-网络运营商DNS轮询
DNS轮询指的是服务提供者在运营商针对某一域名配置了多个提供服务的服务器IP,当用户请求改域名的接口时,运营商将随机挑选出一个服务器响应用户请求。下图的例子是:有3台联通服务器、3台电信服务器,要实现“联通用户流量分摊到3台联通服务器、其他用户流量分摊到电信服务器”这个效果的设置。

DNS由于成本较低,所以一般在小型的网站用的比较多。但是大型的网站一般也会将用它和其他负载均衡的方式结合起来一起使用,DNS轮询方式提供的IP地址,在大型网站中往往是一个集群的地址,可能是均衡交换机也可能是均衡服务器。我们可以通过nslookup命令来查询域名的DNS配置情况:
C:\Users\Administrator>nslookup www.baidu.com
服务器: UnKnown
Address: 10.10.121.11
非权威应答:
名称: www.a.shifen.com
Addresses: 58.217.200.113
58.217.200.112
Aliases: www.baidu.com
DNS轮询的优点是成本低、操作简单,但是其缺点也是明显的:
1.服务不稳定。如果某台服务器宕机,DNS服务器是无法知晓的,仍旧会将访问分配到此服务器。修改DNS记录全部生效一般要1-3小时,甚至更久。这就可能会导致某些用户在服务器发生故障的时候完全无法访问。
2.DNS负载均衡采用的是简单的轮询算法,不能区分服务器的差异,不能反映服务器的当前运行状态,不能做到为性能较好的服务器多分配请求,甚至会出现客户请求集中在某一台服务器上的情况。
3.登陆状态无法保存。如果是需要身份验证的网站,DNS解析无法将验证用户的访问持久分配到同一服务器。虽然有一定的本地DNS缓存,但是很难保证在用户访问期间,本地DNS不过期,而重新查询服务器并指向了新的服务器,那么原服务器保存的用户信息是无法被带到新服务器的,而且可能被要求重新认证身份,而且来回切换时间长了各台服务器都保存有用户不同的信息,对服务器资源也是一种浪费。 正是因为上述存在的缺点,所以DNS一般不会单独使用,而是配合其他负载均衡方式一起使用。
工作使用-支付系统
官网主页就是使用了DNS轮询,每个运营商都有一个ip地址,同时绑定到官网域名。
为何需要同时使用两种负载均衡器
第一篇文章
为何会有Lvs+Nginx架构?
Lvs 是四层负载均衡,Nginx是七层负载均衡。四层是网络数据转发,没有“请求”的概念。
为何两者会被同时使用?
Lvs采用同步请求转发:lvs收到请求后立即转发到后端服务器,由客户端和后端服务端建立连接。
Nginx采用异步请求转发:收到请求后,保持客户端连接的同时,发起一个相对内容的新请求到后端服务器,等后端响应后,由nginx返回给客户端。
使用lvs时:仅请求流量经过lvs的网络,响应流量由后端服务器的网络直接处理。 使用nginx时:所有的请求和响应流量都会经过nginx。
当后端的服务器高负载处理请求时,nginx的网络带宽就成了瓶颈。 如果只使用lvs做为负载均衡,一旦后端接受到请求的服务器出现问题,那么这次请求就会失败。 但是如果在lvs的后端在添加nginx集群,就可以结合两者的优势,互相弥补均衡上的不足。
总结-区别
1.从请求和响应的维度
lvs,只转发请求流量,不管响应,响应是由真实服务器直接返回数据到客户端。
nginx,请求和响应都要经过nginx代理。
2.从转发流量和转发请求的区别
lvs,只接收请求流量,然后修改流量里的数据(比如ip),最后再转发流量数据到真实服务器。
nginx,接收请求,建立连接,然后再转发请求连接(实际上是重新创建/发起新的请求连接)到真实服务器。
参考
www.safecdn.cn/linux/2018/…
第二篇文章
最初的理解 (也可以每个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): 在后续继续了解这部分内容时,发现了这两个帖子:
- 有了LVS,还要apache,nginx有什么用? 2.从一个开发的角度看负载均衡和LVS—–注意看最后一个lvs集群化的图,nginx和rs是一对一连接的。
从以上文章来看,lvs+nginx组合使用的原因主要是用lvs来做负载均衡(因为工作在4层,效率高),nginx来做静态文件的处理。
这里第二篇文章,和lvs的后续维护者之一的吴佳明_普空的ppt中比章博士的文章中多出了一种转发模式,也就是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的服务压力,以及做一些业务切换、分流、前置缓存的功能。
作者:不去天涯 来源:CSDN 原文:blog.csdn.net/BuquTianya/… 版权声明:本文为博主原创文章,转载请附上博文链接!
第三篇文章
PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下。
一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的Web应用,比如日PV小于1000万,用Nginx就完全可以了;如果机器不少,可以用DNS轮询,LVS所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用LVS。
一种是通过硬件来进行进行,常见的硬件有比较昂贵的F5和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;另外一种就是类似于Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件,这些都是通过软件级别来实现,所以费用非常低廉。
目前关于网站架构一般比较合理流行的架构方案:Web前端采用Nginx/HAProxy+Keepalived作负载均衡器;后端采用MySQL数据库一主多从和读写分离,采用LVS+Keepalived的架构。当然要根据项目具体需求制定方案。 下面说说各自的特点和适用场合。
总结
1.中小,流量PV小于1000万,只使用nginx就够了
2.再大,亿级别,就再加上lvs
常见的负载均衡器
1.根据工作在的协议层划分可划分为: 四层负载均衡:根据请求报文中的目标地址和端口进行调度 七层负载均衡:根据请求报文的内容进行调度,这种调度属于「代理」的方式
2.根据软硬件划分: 硬件负载均衡: F5 的 BIG-IP Citrix 的 NetScaler 这类硬件负载均衡器通常能同时提供四层和七层负载均衡,但同时也价格不菲 软件负载均衡: TCP 层:LVS,HaProxy,Nginx-socket协议 基于 HTTP 协议:Haproxy,Nginx-http协议,ATS(Apache Traffic Server),squid,varnish 基于 MySQL 协议:mysql-proxy
四层和七层的区别
1.层数的区别 一个是四层 一个七层 2.内核进程空间和用户进程空间 四层是内核 七层是用户 3.是否通用 应用层协议,不具备通用性,比如nginx支持http的tomcat,而不支持负载均衡到mysql(mysql有实现自己的通信协议)。
LVS是四层协议,局部通用性。
nginx
七层-应用层
参考
www.ideadata.com.cn/wisdomActio… //好文
LVS
作用 和nginx是一样的,就是用来负载均衡的。只不过所在的是第几层和实现技术有点不一样。

四层-传输层
内核层
和iptables防火墙实现原理类似
三种模式
1.修改ip地址
2.修改ip隧道
3.修改mac地址
一线互联网公司最常用的模式。
修改ip地址
修改ip隧道
修改mac地址
负载均衡算法
1.轮询 2.hashcode求余数 //维护session
硬件负载均衡器
是在哪一层(比如F5)?
也是4~7层-硬件,只不过是硬件,优点功能多好使用,缺点价格贵-10万~100万。
四层-LVS是软件。
七层-niginx是软件。

参考
yq.aliyun.com/articles/52…
zyan.cc/post/206/
blog.zyan.cc/post/346/
负载均衡器本身的集群
主备

keepalived
解决负载均衡本身的单点问题。比如: 1.nginx 2.LVS
1.nginx

seanlook.com/2015/05/18/…
2.LVS

segmentfault.com/a/119000001…
keepalive本身是四层
与注册中心/协调软件zookeeper的区别?
1.zookeeper
是注册中心、协调软件。
2.keepalived
是解决负载均衡器本身的单点问题。
最佳实践
www.fomore.net/os/?p=865 //小型站点、中、大的选型
参考
mp.weixin.qq.com/s?__biz=MzI… //这文章写的太强大了
www.linuxvirtualserver.org/zh/lvs1.htm… //官方文档,应该反复读