【原文】https://www.toutiao.com/i6593604356799463944/前端
【原文】https://www.toutiao.com/i6592741060194075143/linux
1、什么是负载均衡?nginx
互联网早期,业务流量比较小而且业务逻辑比较简单,单台服务器即可以知足基本的需求;但随着互联网的发展,业务流量愈来愈大而且业务逻辑也愈来愈复杂,单台机器的性能问题以及单点问题凸显了出来,所以须要多台机器来进行性能的水平扩展以及避免单点故障。可是要如何将不一样的用户的流量分发到不一样的服务器上面呢?web
早期的方法是使用DNS作负载,经过给客户端解析不一样的IP地址,让客户端的流量直接到达各个服务器。可是这种方法有一个很大的缺点就是延时性问题,在作出调度策略改变之后,因为DNS各级节点的缓存并不会及时的在客户端生效,并且DNS负载的调度策略比较简单,没法知足业务需求,所以就出现了负载均衡。正则表达式
客户端的流量首先会到达负载均衡服务器,由负载均衡服务器经过必定的调度算法将流量分发到不一样的应用服务器上面,同时负载均衡服务器也会对应用服务器作周期性的健康检查,当发现故障节点时便动态的将节点从应用服务器集群中剔除,以此来保证应用的高可用。算法
负载均衡又分为四层负载均衡和七层负载均衡。四层负载均衡工做在OSI模型的传输层,主要工做是转发,它在接收到客户端的流量之后经过修改数据包的地址信息将流量转发到应用服务器。sql
七层负载均衡工做在OSI模型的应用层,由于它须要解析应用层流量,因此七层负载均衡在接到客户端的流量之后,还须要一个完整的TCP/IP协议栈。七层负载均衡会与客户端创建一条完整的链接并将应用层的请求流量解析出来,再按照调度算法选择一个应用服务器,并与应用服务器创建另一条链接将请求发送过去,所以七层负载均衡的主要工做就是代理。apache
2、四层和七层负载均衡的区别?后端
2.1 - 技术原理上的区别。浏览器
所谓四层负载均衡,也就是主要经过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN 请求时,即经过上述方式选择一个最佳的服务器,并对报文中目标IP地址进行修改(改成后端服务器IP),直接转发给该服务器。TCP的链接创建,即三次握手是客户端和服务器直接创建的,负载均衡设备只是起到一个相似路由器的转发动做。在某些部署状况下,为保证服务器回包能够正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
所谓七层负载均衡,也称为“内容交换”,也就是主要经过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
以常见的TCP为例,负载均衡设备若是要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端创建链接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,而后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
负载均衡设备在这种状况下,更相似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别创建TCP链接。因此从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。那么,为何还须要七层负载均衡呢?
2.2 - 应用场景的需求。
七层应用负载的好处,是使得整个网络更"智能化", 参考咱们以前的另一篇专门针对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等系统。
2.3 - 七层应用须要考虑的问题。
3、负载均衡的算法?
一、随机算法
二、轮询及加权轮询
三、最小链接及加权最小链接
四、哈希算法
五、IP地址散列
六、URL散列
4、负载均衡的实现(DNS > 数据链路层 > IP层 > Http层)?
1 - DNS域名解析负载均衡(延迟)
利用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域名解析,做为第一级负载均衡手段,而后再在内部作第二级负载均衡。
2 - 数据链路层负载均衡(LVS)
数据链路层负载均衡是指在通讯协议的数据链路层修改mac地址进行负载均衡。
这种数据传输方式又称做三角传输模式,负载均衡数据分发过程当中不修改IP地址,只修改目的的mac地址,经过配置真实物理服务器集群全部机器虚拟IP和负载均衡服务器IP地址同样,从而达到负载均衡,这种负载均衡方式又称为直接路由方式(DR).
在上图中,用户请求到达负载均衡服务器后,负载均衡服务器将请求数据的目的mac地址修改成真是WEB服务器的mac地址,并不修改数据包目标IP地址,所以数据能够正常到达目标WEB服务器,该服务器在处理完数据后能够通过网管服务器而不是负载均衡服务器直接到达用户浏览器。
使用三角传输模式的链路层负载均衡是目前大型网站所使用的最广的一种负载均衡手段。在linux平台上最好的链路层负载均衡开源产品是LVS(linux virtual server)。
3 - IP负载均衡(SNAT)
IP负载均衡:即在网络层经过修改请求目标地址进行负载均衡。
用户请求数据包到达负载均衡服务器后,负载均衡服务器在操做系统内核进行获取网络数据包,根据负载均衡算法计算获得一台真实的WEB服务器地址,而后将数据包的IP地址修改成真实的WEB服务器地址,不须要经过用户进程处理。真实的WEB服务器处理完毕后,相应数据包回到负载均衡服务器,负载均衡服务器再将数据包源地址修改成自身的IP地址发送给用户浏览器。
这里的关键在于真实WEB服务器相应数据包如何返回给负载均衡服务器,一种是负载均衡服务器在修改目的IP地址的同时修改源地址,将数据包源地址改成自身的IP,即源地址转换(SNAT),另外一种方案是将负载均衡服务器同时做为真实物理服务器的网关服务器,这样全部的数据都会到达负载均衡服务器。
IP负载均衡在内核进程完成数据分发,较反向代理均衡有更好的处理性能。但因为全部请求响应的数据包都须要通过负载均衡服务器,所以负载均衡的网卡带宽成为系统的瓶颈。
4 - HTTP重定向负载均衡(少见)
HTTP重定向服务器是一台普通的应用服务器,其惟一的功能就是根据用户的HTTP请求计算一台真实的服务器地址,并将真实的服务器地址写入HTTP重定向响应中(响应状态吗302)返回给浏览器,而后浏览器再自动请求真实的服务器。
这种负载均衡方案的优势是比较简单,缺点是浏览器须要每次请求两次服务器才能拿完成一次访问,性能较差;使用HTTP302响应码重定向,多是搜索引擎判断为SEO做弊,下降搜索排名。重定向服务器自身的处理能力有可能成为瓶颈。所以这种方案在实际使用中并不见多。
5 - 反向代理负载均衡(nginx)
传统代理服务器位于浏览器一端,代理浏览器将HTTP请求发送到互联网上。而反向代理服务器则位于网站机房一侧,代理网站web服务器接收http请求。
反向代理的做用是保护网站安全,全部互联网的请求都必须通过代理服务器,至关于在web服务器和可能的网络攻击之间创建了一个屏障。
除此以外,代理服务器也能够配置缓存加速web请求。当用户第一次访问静态内容的时候,静态内存就被缓存在反向代理服务器上,这样当其余用户访问该静态内容时,就能够直接从反向代理服务器返回,加速web请求响应速度,减轻web服务器负载压力。
另外,反向代理服务器也能够实现负载均衡的功能。
因为反向代理服务器转发请求在HTTP协议层面,所以也叫应用层负载均衡。优势是部署简单,缺点是可能成为系统的瓶颈。
当系统面临大量用户访问,负载太高的时候,一般会使用增长服务器数量来进行横向扩展,使用集群和负载均衡提升整个系统的处理能力。
从单机网站到分布式网站,很重要的区别是业务拆分和分布式部署,将应用拆分后,部署到不一样的机器上,实现大规模分布式系统。分布式和业务拆分解决了,从集中到分布的问题,可是每一个部署的独立业务还存在单点的问题和访问统一入口问题,为解决单点故障,咱们能够采起冗余的方式。将相同的应用部署到多台机器上。解决访问统一入口问题,咱们能够在集群前面增长负载均衡设备,实现流量分发。
系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。
纵向扩展,是从单机的角度经过增长硬件处理能力,好比CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提高,不能知足大型分布式系统(网站),大流量,高并发,海量数据的问题。
所以须要采用横向扩展的方式,经过添加机器来知足大型网站服务的处理能力。好比:一台机器不能知足,则增长两台或者多台机器,共同承担访问压力。这就是典型的集群和负载均衡架构:以下图:
1.解决并发压力,提升应用处理性能(增长吞吐量,增强网络处理能力);
2.提供故障转移,实现高可用;
3.经过添加或减小服务器数量,提供网站伸缩性(扩展性);
4.安全防御;(负载均衡设备上作一些过滤,黑白名单等处理)
1)二层负载均衡(mac)
根据OSI模型分的二层负载,通常是用虚拟mac地址方式,外部对虚拟MAC地址请求,负载均衡接收后分配后端实际的MAC地址响应)
2)三层负载均衡(ip)
通常采用虚拟IP地址方式,外部对虚拟的ip地址请求,负载均衡接收后分配后端实际的IP地址响应)
3)四层负载均衡(tcp)
在三次负载均衡的基础上,用ip+port接收请求,再转发到对应的机器。
4)七层负载均衡(http)
根据虚拟的url或IP,主机名接收请求,再转向相应的处理服务器。
1)四层的负载均衡就是基于IP+端口的负载均衡:在三层负载均衡的基础上,经过发布三层的IP地址(VIP),而后加四层的端口号,来决定哪些流量须要作负载均衡。
对应的负载均衡器称为四层交换机(L4 switch),主要分析IP层及TCP/UDP层,实现四层负载均衡。此种负载均衡器不理解应用协议(如HTTP/FTP/MySQL等等)。
实现四层负载均衡的软件有:
2)七层的负载均衡就是基于虚拟的URL或主机IP的负载均衡
对应的负载均衡器称为七层交换机(L7 switch),除了支持四层负载均衡之外,还有分析应用层的信息,如HTTP协议URI或Cookie信息,实现七层负载均衡。此种负载均衡器能理解应用协议。
实现七层负载均衡的软件有:
总的来讲,通常是lvs作4层负载;nginx作7层负载;haproxy比较灵活,4层和7层负载均衡都能作。
场景一:应用于高访问量的业务
若是您的应用访问量很高,您能够经过配置监听规则将流量分发到不一样的服务器上。
场景二:横向扩张系统
您能够根据业务发展的须要,经过随时添加和移除服务器,来扩展应用系统的服务能力,适用于各类Web服务器和App服务器。
场景三:消除单点故障
当其中一部分服务器发生故障后,负载均衡会自动屏蔽故障的服务器,将请求分发给正常运行的服务器,保证应用系统仍能正常工做。
场景四:同城容灾 (多可用区容灾)
为了提供更加稳定可靠的负载均衡服务,当主可用区出现机房故障或不可用时,负载均衡仍然有能力在很是短的时间内切换到另一个备可用区恢复服务能力;当主可用区恢复时,负载均衡一样会自动切换到主可用区提供服务,保证服务依然正常运行。