一、为什么需要负载均衡
随着业务的发展,业务的流量也越来越大,以前单台服务器提供的服务,无论如何优化,都不能满足现有业务的需求。这时,就需要将业务流量分摊到多个不同的服务器上来减少单个服务器的压力。而负载均衡(Load Balance)
就是用来将业务流量分发到不用的服务器上面的。
二、什么是负载均衡
+---------------------------------------------------------------------------+
| |
| +----------+ |
| | | |
| +------------> | Server | |
| | | | |
| | +----------+ |
| | |
| +----------+ +----------------+ | +----------+ |
| | | | | | | | |
| | Client | +-----> | Load Balance | +----------------> | Server | |
| | | | | | | | |
| +----------+ +----------------+ | +----------+ |
| | |
| | +----------+ |
| | | | |
| +------------> | Server | |
| | | |
| +----------+ |
| |
+---------------------------------------------------------------------------+
负载均衡(软件或硬件)会将所有的客户端流量,通过特定的调度算法分发到不同的后端服务器上,同时还会监控后端服务器的压力和监控状态,以便在某些后端服务器压力过大或故障时,减少对该服务器的流量分发,从而保证了整个业务的稳定。
三、利用DNS实现负载均衡
早期解决单个服务器压力过大的方法之一是利用DNS将域名解析到不同的IP的方式来实现的。如:客户端在不同的地区解析相同的域名时,DNS解析出离客户端最近的服务器IP。这样,不同的客户端就连接到提供了相同服务但是机器不同的服务器。从而分散了服务器压力,同时也缩短服务响应时间。这也是CDN原理。
利用DNS来实现负载均衡好处有成本低,实现简单等。但是弊端也是很明显的:
流量分发的不够均匀。
DNS在解析IP时,能够根据客户端地理位置来分发流量,但是没法根据后端服务器的实际压力来分发流量。这样就可能会出现一台服务器压力满载,而其他的服务器无压力的情况。支持的分发策略少。
DNS一般只支持轮询方式来解析。大大的限制了使用场景。服务器故障时切换延迟大。
由于DNS服务器是多层,且各层服务器中有缓存,导致了DNS修改后不能立即生效。这种情况下,如果一个后端服务器崩溃停止服务器,即使我们立即修改DNS,部分的客户端也无法立即恢复服务。这会严重影响用户体验。DNS劫持和缓存污染导致的安全问题。
由于DNS存在被劫持和缓存被污染可能,这会导致域名解析出来的IP可能不是我们服务器的IP,从而会导致客户端连接到了错误的服务器,造成安全问题。
所以严格来说,使用DNS只能算是分发流量,而不能算作真正的负载均衡。
Tips:
DNS劫持:
DNS服务器被控制,查询DNS时,服务器直接返回给你它想让你看的信息。DNS缓存污染:
黑客通过技术手段使用户查询到虚假解析信息。
四、基于OSI分层分类的负载均衡
层级 | OSI参考模型 | 各层解释 |
---|---|---|
7 | 应用层(Application) | 提供网络与用户应用软件之间的接口服务 |
6 | 表达层(Presentation) | 提供格式化的表示和转换数据服务,如加密和压缩 |
5 | 会话层(Session) | 提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制 |
4 | 传输层(Transimission) | 提供建立、维护和取消传输连接功能,负责可靠地传输数据(PC) |
3 | 网络层(Network) | 处理网络间路由,确保数据及时传送(路由器) |
2 | 数据链路层(DataLink) | 负责无错传输数据,确认帧、发错重传等(交换机) |
1 | 物理层(Physics) | 提供机械、电气、功能和过程特性(网卡、网线、双绞线、同轴电缆、中继器) |
参考OSI的七层模型,我们可以:
- 在第二层(数据链路层)做基于MAC地址的
二层负载均衡
。通过一个虚拟MAC地址接收请求,然后再将数据转发到真实的MAC地址。 - 在第三层(网络层)做基于IP地址的
三层负载均衡
。通过一个虚拟IP地址接收请求,然后再将数据转发到真实的IP地址。 - 在第四层(传输层)做基于IP和端口的
四层负载均衡
。通过一个虚拟IP地址和端口接收请求,然后再将数据转发到真实的IP地址和端口。 - 在第七层(应用层)做基于应用层信息(如:URL)的
七层负载均衡
。通过一个虚拟的URL接收请求,然后再将数据转发到真实URL所在的服务器。
Tips:
- DNS属于应用层的协议,所以利用DNS实现负载均衡算是七层负载均衡。
五、七层负载均衡
七层负载均衡
工作在OSI的第七层(传输层),位于第四层(应用层)之上,所以需要完整的TCP/IP协议栈的实现,这也让负载均衡能够解析流量的内容。
客户端不能与直接与后端服务器建立传输层的连接(如TCP连接),取而代之,客户端将直接与负载均衡建立连接,负载均衡解析完协议内容后,根据协议内容、流量分发策略和后端压力等信息选择一个后端服务器,并与服务器建立连接,然后将进行流量分发。所以,七层负载均衡的主要工作就是代理。
七层负载均衡
的好处是显而易见的:
可以查看修改流量内容。
能够查看流量内容让负载均衡能够记录日志,方便进行大数据分析;也能够根据内容来做更加智能的流量分发;还能对明显非法的访问进行简单的过滤。能够修改流量让负载均衡能够添加额外的信息到流量中,为后端的业务处理提供更丰富的信息。可以避免后端服务遭受传输层的流量攻击。
因为客户端不再直接与后端服务器建立传输层的连接,后端服务器也就不会再受到可能的SYN Flood攻击。无需特别的硬件就能实现。
因为七层负载均衡
工作在应用层,所以利用普通的软件即可实现。常用的软件有:Nginx、HAProxy等。
同时也带来了一些不便:
隐藏了客户端的连接信息。
因为负载均衡取代了后端服务器与客户端建立连接。所以后端服务器无法直接获取
真实的客户端IP信息等。但是可以通过修改流量的内容,将客户端的信息添加到流量中来避免此问题。增加了排错的难度。
增加七层负载的同时,也为将业务流程复杂化了,出错时也增加了排错的难度。
所以,在使用七层负载均衡
之前,需要综合考虑使用七层负载均衡
能带来的好处以及不便。如果使用负载均衡的主要目的是分发流量,均衡后端压力,还可以考虑使用四层负载均衡。
六、四层负载均衡
四层负载均衡
工作在OSI的第四层(传输层),不需要完整的TCP/IP协议栈的实现,所以也不能解析流量的内容。在这一点来说,效率比七层负载均衡
更高。
负载均衡仅能根据流量中目标地址和端口,加上指定的流量分发策略等信息进行流量分发。客户端能够直接与后端服务器建立传输层的连接(如TCP连接),此时负载均衡的作用类似于路由器转发报文,只是更加智能可控。所以,四层负载均衡的主要工作就是转发。
使用四层负载均衡
最明显的好处是在保持分发策略最大化可控的同时性能的最大化。因为四层负载均衡
并不需要解析传输层的协议内容,相比与七层负载均衡
来说,少了很多工作。
但是,使用四层负载均衡
的缺点也是很明显的:
成本高昂。
四层负载均衡
大多基于硬件来实现,虽然也有软件实现的。暴露了后端的服务器。
这与不用负载均衡前的情况相同,后端服务器直接暴露给客户端。服务器遭受攻击时会直接影响业务。
参考