负载均衡
什么是负载均衡?
将大量的并发请求转给后端多个节点处理,减少工作响应时间,后端节点处理完再经过负载均衡返回给用户。
目前负载均衡大多数用于提高如Web服务器、FTP服务器等Internet服务器程序的可用性和可伸缩性。
负载均衡的分类:
1、二层负载均衡(MAC地址)
根据OSI模型分的二层负载,一般用虚拟mac地址的方式,外部对虚拟MAC地址请求,负载均衡接受后,分片后端实际的MAC地址响应。
2、三层负载均衡(IP)
一般采用虚拟IP的方式,外部对虚拟IP地址请求,负载均衡接收后,分配后端实际的IP地址响应。(即一个IP对一个IP的转发,端口全开放)
3、四层负载均衡(TCP)
在三层负载均衡的基础上,即从第四层“传输层”开始,使用“IP+Port”接收请求,再转发到应用的机器。
4、七层负载均衡(HTTP)
从第七层“应用层”开始,根据虚拟url或IP,主机名接收请求,再转向响应的处理服务器。
我们运维中最常见的是四层和七层负载均衡:
四层负载均衡
就是基于IP+端口的负载均衡:在三层负载均衡的基础上,通过发布三层的IP地址(VIP),然后加上四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行NAT处理,转发至后台服务器,并记录下这个TCP或UDP的流量时由哪台服务器处理的,后续这个连接的所有流量都会同样转发到同一台服务器处理。
对应的负载均衡器称为四层交换机(L4 Switch),主要分析IP层及TCP/UDP层,实现四层负载均衡。此种负载均衡不理解应用协议(如HTTP/FTP/MySQL等等)
实现四层负载均衡的软件有:
- F5:硬件负载均衡器:功能强大,但成本高
- LVS:重量级四层负载软件
- nginx:轻量级四层负载软件,带缓存功能,正则表达式较灵活
- haproxy:模拟四层转发,较灵活。
七层负载均衡
就是基于虚拟的URL或主机IP的负载均衡:在四层负载均衡的基础上(没有四层是绝对不可能有七层的)。
再考虑应用层的特征,比如同一个Web服务器的负载均衡,除了根据VIP加80端口辨别是否需要处理的流量,还可根据七层的URL、浏览器类别、语言来决定是否要进行负载均衡。举个例子,如果你的Web服务器分两组:一组是中午的,一组是英文的,那么七层负载均衡就可以当用户来访问你的域名时,自动辨别用户语言,然后选择对应语言的服务器组进行负载均衡处理。
对应的负载均衡称为七层交换机(L7 Switch),除了支持四层负载均衡外,还要分析应用层的信息,如HTTP协议URI或Cookie信息,实现七层负载均衡。此负载均衡器能理解应用协议。
实现七层负载均衡的软件有:
- haproxy:天生负载均衡技能,全面支持七层代理,会话保持,标记,路径转移。
- nginx:只在http协议还mail协议上功能比较好,性能与haproxy差不多。
- apache:功能较差
- MySQL proxy:功能尚可
总得来说,一般LVS做4层负载;nginx做7层负载(也能做4层负载,通过stream模块); haproxy比较灵活,4层和7层负载都能做。
四层负载和七层负载的区别
1、从技术原理上分析
所谓四层负载均衡,主要通过报文中的目标地址和端口,再加上负载均衡设置的服务器选择的方式,决定选择的内部服务器。
以常见的TCP为例,负载均衡设备在接收到第一个来自客户端的SYN请求时,即通过上述方式选择一个最佳的服务器,并对报文中的目标IP地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡只是起到一个类似路由器的转发动作。在某些部署情况下,为保证服务器回包可以正确返回给负载均衡设备,在转发报文的同时可能还会对报文原来的源地址进行修改。
所谓七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内存,再加上负载均衡设备的服务器选择方式,决定最终选择的内部服务器。
已常见的TCP为例,负载均衡设备如果要根据真正的应用层内存再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接收到客户端发送的真正应用内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。聚在均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端及后端的服务器会分别经历TCP连接。所以从这个技术原理上看,七层负载均衡明显对负载均衡设备的要求更高。
四层负载均衡在中间传输层执行,他处理消息的传递,但不考虑消息的内容。例如TCP是网络上HTTP流量的第四层协议。在这一过程中,四层负载均衡会将网络数据包转发到上游服务器,但不会检查数据包的内容,只能通过检查TCP流中的前几个包来做有限的路由决策。
七层负载均衡在高级应用层上执行,会处理每个消息的实际内容。HTTP是网络上网络流量的主要7层协议。七层负载均衡比四层负载均衡更复杂的方式路由网络流量,尤其适用于基于TCP流量(如HTTP)。七层负载均衡会终止网络流量,并读取其中消息,他可以根据消息内容(如URL或cookie)做出负载均衡策略。随后,七层负载均衡与选定上游服务器建立新的TCP连接,并将请求写入服务器。
1.1、二者区别
1、七层负载均衡:基本都是基于http协议,适用于web服务器的负载均衡
2、四层负载均衡:基于TCP协议,可以做任何基于tcp/ip协议的负载均衡(haproxy, LVS)
3、二者主要区别在于利用的报文所在的层面是不同的,各有各的好处。
4、七层负载均衡的好处,是使得整个网络更“智能化”。例如访问一个网站的用户流量,可以通过七层的方式,将对图片类的请求转发到特定的图片服务器,并可以利用缓存技术;将对文字类的请求转发到特定的文字服务器,并可以利用压缩技术。
从技术原理上,七层负载可以对客户端的请求和服务器的响应进行任何意义上的修改,极大的提升了应用系统在网络层的灵活性。例如nginx或apache上部署的功能可以迁移到负载均衡器上,例如客户请求中的Header重写,服务器响应中的关键字过滤或内容插入等功能。
5、四层负载均衡的优点是较为灵活,可以作为多种软件的负载均衡器。
举个例子形象的说明:四层负载均衡就像银行的自助排号机,每一个到银行的客户,根据排号机的顺序,选择对应的窗口接受服务;而七层负载均衡像银行大堂经理,先确认客户需要办理的业务,再安排排号。这样办理理财、存取款等业务的客户,会去不同的地方排队,加快了业务办理流程。
1.2、七层负载均衡的好处
比基于四层负载均衡更占CPU,但很少会导致服务器性能下降。七层负载均衡可以做出更明智的决策,并可以对内容进行优化和更改,如加密、压缩等。还可以利用buffering来卸载上游服务器的慢速连接,从而提高性能。
执行七层负载均衡的组件通常被称为翻下代理服务器。
1.3、七层负载均衡示例
假设用户访问高流量网站,在会话期间,他可能会请求静态内容(例如图片或视频)、动态内容(如新闻订阅源)或交易信息(如订单状态)等等。七层负载均衡允许根据请求本身中的消息(如内容类型)来路由请求,即可以把图片或视频的请求路由到存储他的服务器,并进行高度优化以提供多媒体内容;可以将诸如折扣价之类的交易信息请求路由到负责管理定价的应用服务器。借助七层负载均衡,网络和应用架构师可以创建高度优化的服务器基础架构或应用交付网络,在保证可靠性的同时进行有效扩展。
1.4、简单总结
四层和七层最大的区别就是要效率还是要功能:
四层架构简单,无需解析消息内容,在网络吞吐量及处理性能上高于七层。
而七层负载优势在于功能多,控制灵活强大。
注意:四层负载均衡不识别域名,七层负载均衡识别域名
2、从应用场景的需求上分析
七层可以使网络转发更智能化。
对于安全性:如DOS攻击:这种攻击会发送大量SYN报文,耗尽服务器上的资源。四层负载会把SYN攻击都转发到后端服务器上,而七层负载可以在负载层拦截,不会影响后端服务器。