http://www.javashuo.com/article/p-qcyqjwoe-dz.htmlhtml
互联网早期,业务流量比较小而且业务逻辑比较简单,单台服务器即可以知足基本的需求;但随着互联网的发展,业务流量愈来愈大而且业务逻辑也愈来愈复杂,单台机器的性能问题以及单点问题凸显了出来,所以须要多台机器来进行性能的水平扩展以及避免单点故障。可是要如何将不一样的用户的流量分发到不一样的服务器上面呢?前端
早期的方法是使用DNS作负载,经过给客户端解析不一样的IP地址,让客户端的流量直接到达各个服务器。可是这种方法有一个很大的缺点就是延时性问题,在作出调度策略改变之后,因为DNS各级节点的缓存并不会及时的在客户端生效,并且DNS负载的调度策略比较简单,没法知足业务需求,所以就出现了负载均衡。linux
客户端的流量首先会到达负载均衡服务器,由负载均衡服务器经过必定的调度算法将流量分发到不一样的应用服务器上面,同时负载均衡服务器也会对应用服务器作周期性的健康检查,当发现故障节点时便动态的将节点从应用服务器集群中剔除,以此来保证应用的高可用。nginx
负载均衡又分为四层负载均衡和七层负载均衡。四层负载均衡工做在OSI模型的传输层,主要工做是转发,它在接收到客户端的流量之后经过修改数据包的地址信息将流量转发到应用服务器。web
七层负载均衡工做在OSI模型的应用层,由于它须要解析应用层流量,因此七层负载均衡在接到客户端的流量之后,还须要一个完整的TCP/IP协议栈。七层负载均衡会与客户端创建一条完整的链接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器创建另一条链接将请求发送过去,所以七层负载均衡的主要工做就是代理。算法
所谓四层负载均衡,也就是主要经过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。后端
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,即经过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改成后端服务器IP),直接转发给该服务器。TCP的链接创建,即三次握手是客户端和服务器直接创建的,负载均衡设备只是起到一个相似路由器的转发动做。在某些部署状况下,为保证服务器回包能够正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。浏览器
所谓七层负载均衡,也称为“内容交换”,也就是主要经过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。缓存
以常见的TCP为例,负载均衡设备若是要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端创建链接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,而后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
负载均衡设备在这种状况下,更相似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别创建TCP链接。因此从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。那么,为何还须要七层负载均衡呢?安全
七层应用负载的好处,是使得整个网络更"智能化", 参考咱们以前的另一篇专门针对HTTP应用的优化的介绍,就能够基本上了解这种方式的优点所在。例如访问一个网站的用户流量,能够经过七层的方式,将对图片类的请求转发到特定的图片服务器并可使用缓存技术;将对文字类的请求能够转发到特定的文字服务器并可使用压缩技术。
固然这只是七层应用的一个小案例,从技术原理上,这种方式能够对客户端的请求和服务器的响应进行任意意义上的修改,极大的提高了应用系统在网络层的灵活性。不少在后台,(例如Nginx或者Apache)上部署的功能能够前移到负载均衡设备上,例如客户请求中的Header重写,服务器响应中的关键字过滤或者内容插入等功能。
另一个经常被提到功能就是安全性。网络中最多见的SYN Flood攻击,即黑客控制众多源客户端,使用虚假IP地址对同一目标发送SYN攻击,一般这种攻击会大量发送SYN报文,耗尽服务器上的相关资源,以达到Denial of Service(DoS)的目的。
从技术原理上也能够看出,四层模式下这些SYN攻击都会被转发到后端的服务器上;而七层模式下这些SYN攻击天然在负载均衡设备上就截止,不会影响后台服务器的正常运营。另外负载均衡设备能够在七层层面设定多种策略,过滤特定报文,例如SQL Injection等应用层面的特定攻击手段,从应用层面进一步提升系统总体安全。
如今的7层负载均衡,主要仍是着重于应用普遍的HTTP协议,因此其应用范围主要是众多的网站或者内部信息平台等基于B/S开发的系统。 4层负载均衡则对应其余TCP应用,例如基于C/S开发的ERP等系统。
是否真的必要,七层应用的确能够提升流量智能化,同时必不可免的带来设备配置复杂,负载均衡压力增高以及故障排查上的复杂性等问题。在设计系统时须要考虑四层七层同时应用的混杂状况。
是否真的能够提升安全性。例如SYN Flood攻击,七层模式的确将这些流量从服务器屏蔽,但负载均衡设备自己要有强大的抗DDoS能力,不然即便服务器正常而做为中枢调度的负载均衡设备故障也会致使整个应用的崩溃。
是否有足够的灵活度。七层应用的优点是可让整个应用的流量智能化,可是负载均衡设备须要提供完善的七层功能,知足客户根据不一样状况的基于应用的调度。最简单的一个考核就是可否取代后台Nginx或者Apache等服务器上的调度功能。可以提供一个七层应用开发接口的负载均衡设备,可让客户根据需求任意设定功能,才真正有可能提供强大的灵活性和智能性。
利用DNS处理域名解析请求的同时进行负载均衡是另外一种经常使用的方案。在DNS服务器中配置多个A记录,如:www.mysite.com IN A 114.100.80.一、www.mysite.com IN A 114.100.80.二、www.mysite.com IN A 114.100.80.3.
每次域名解析请求都会根据负载均衡算法计算一个不一样的IP地址返回,这样A记录中配置的多个服务器就构成一个集群,并能够实现负载均衡。
DNS域名解析负载均衡的优势是将负载均衡工做交给DNS,省略掉了网络管理的麻烦,缺点就是DNS可能缓存A记录,不受网站控制。事实上,大型网站老是部分使用DNS域名解析,做为第一级负载均衡手段,而后再在内部作第二级负载均衡。
数据链路层负载均衡是指在通讯协议的数据链路层修改mac地址进行负载均衡。
这种数据传输方式又称做三角传输模式,负载均衡数据分发过程当中不修改IP地址,只修改目的的mac地址,经过配置真实物理服务器集群全部机器虚拟IP和负载均衡服务器IP地址同样,从而达到负载均衡,这种负载均衡方式又称为直接路由方式(DR).
在上图中,用户请求到达负载均衡服务器后,负载均衡服务器将请求数据的目的mac地址修改成真是WEB服务器的mac地址,并不修改数据包目标IP地址,所以数据能够正常到达目标WEB服务器,该服务器在处理完数据后能够通过网管服务器而不是负载均衡服务器直接到达用户浏览器。
使用三角传输模式的链路层负载均衡是目前大型网站所使用的最广的一种负载均衡手段。在linux平台上最好的链路层负载均衡开源产品是LVS(linux virtual server)。
IP负载均衡:即在网络层经过修改请求目标地址进行负载均衡。
用户请求数据包到达负载均衡服务器后,负载均衡服务器在操做系统内核进行获取网络数据包,根据负载均衡算法计算获得一台真实的WEB服务器地址,而后将数据包的IP地址修改成真实的WEB服务器地址,不须要经过用户进程处理。真实的WEB服务器处理完毕后,相应数据包回到负载均衡服务器,负载均衡服务器再将数据包源地址修改成自身的IP地址发送给用户浏览器。
这里的关键在于真实WEB服务器相应数据包如何返回给负载均衡服务器,一种是负载均衡服务器在修改目的IP地址的同时修改源地址,将数据包源地址改成自身的IP,即源地址转换(SNAT),另外一种方案是将负载均衡服务器同时做为真实物理服务器的网关服务器,这样全部的数据都会到达负载均衡服务器。
IP负载均衡在内核进程完成数据分发,较反向代理均衡有更好的处理性能。但因为全部请求响应的数据包都须要通过负载均衡服务器,所以负载均衡的网卡带宽成为系统的瓶颈。
HTTP重定向服务器是一台普通的应用服务器,其惟一的功能就是根据用户的HTTP请求计算一台真实的服务器地址,并将真实的服务器地址写入HTTP重定向响应中(响应状态吗302)返回给浏览器,而后浏览器再自动请求真实的服务器。
这种负载均衡方案的优势是比较简单,缺点是浏览器须要每次请求两次服务器才能拿完成一次访问,性能较差;使用HTTP302响应码重定向,多是搜索引擎判断为SEO做弊,下降搜索排名。重定向服务器自身的处理能力有可能成为瓶颈。所以这种方案在实际使用中并不见多。
传统代理服务器位于浏览器一端,代理浏览器将HTTP请求发送到互联网上。而反向代理服务器则位于网站机房一侧,代理网站web服务器接收http请求。
反向代理的做用是保护网站安全,全部互联网的请求都必须通过代理服务器,至关于在web服务器和可能的网络攻击之间创建了一个屏障。
除此以外,代理服务器也能够配置缓存加速web请求。当用户第一次访问静态内容的时候,静态内存就被缓存在反向代理服务器上,这样当其余用户访问该静态内容时,就能够直接从反向代理服务器返回,加速web请求响应速度,减轻web服务器负载压力。
另外,反向代理服务器也能够实现负载均衡的功能。 因为反向代理服务器转发请求在HTTP协议层面,所以也叫应用层负载均衡。优势是部署简单,缺点是可能成为系统的瓶颈。