负载均衡
负载均衡可以在网络第四层(传输层)用lvs(基于一个物理IP地址增加多个虚拟IP地址,轮询)开源,或者NGINX第七层(应用层,基于网络流量控制),或者硬件F5支持第四到第七层路由,硬件负载均衡对应的是集群级别的,软件负载均衡对应的是机器级别的。
HTTP 重定向负载均衡
这种负载均衡方式仅适合WEB 服务器。
用户发出请求时,负载均衡服务器会根据HTTP请求,重新计算出实际的WEB服务器地址,通过302重定向响应发送给用户浏览器。用户浏览器再根据302响应信息,对实际的WEB服务器发出请求。
HTTP重定向方案优点是比较简单,缺点是性能比较差,需要2次请求才能返回实际结果,还有就是仅适合HTTP服务器使用。重定向服务器也很容易成为单点故障问题。
DNS 域名解析负载均衡
在DNS中存储了一个域名的多个主机地址,每次域名解析请求,都可以根据负载均衡算法返回一个不同的IP地址。这样多个WEB服务器就构成了一个集群,并由DNS服务器提供了负载均衡服务,比如北京用户访问百度,会解析域名,找到百度在北京的ip地址并进行访问。DNS负载均衡是地理级别的。
DNS域名解析负载均衡的优点是由DNS来完成负载均衡工作,服务本身不用维护负载均衡服务器的工作。
缺点也是,由于负载均衡服务器不是自己维护,是运营商负责的,没法做精细控制,而且DNS在客户端往往带有缓存,服务器的变更很难及时反映到客户端上。
反向代理负载均衡
反向代理服务器位于实际的服务器之前,他能够缓存服务器响应,加速访问,同时也启到了负载均衡服务器的效果。反向代理服务器解析客户端请求,根据负载均衡算法转发到不同的后台服务器上。用户和后台服务器之间不再有直接的链接。请求,响应都由反向代理服务器进行转发。
优点是和负载均衡服务集成在一起,部署简单。
缺点是所有的请求和响应都需要经过反向代理服务器。其本身可能会成为性能的瓶颈。著名的Nginx服务器就可以部署为反向代理服务器(通过uri找到location,再通过proxy_pass实现),实现WEB 应用的负载均衡(通过upstream实现),还可以使某个URL指定访问某个服务器,最大化服务器利用率。
上面的三种都是工作在OSI网络模型中的应用层,我们可以统称为应用层负载均衡(七层负载均衡)。下面介绍的几种工作在OSI网络模型中的4层以及4层以下(四层负载均衡),解决方案也具有更大的通用性。
IP负载均衡
用户请求包到达负载均衡服务器114.100.20.200后,负载均衡服务器在操作系统内核层获取网络数据包,根据负载均衡算法获取真实后台服务器地址192.168.1.1, 然后将数据包的目标地址改为192.168.1.1, 转发给内部服务器。整个过程都在内核层进行处理。收到192.168.1.1的响应包之后,会更改响应包的SRC IP, 转发给客户端用户。
采用IP层负载均衡算法,全部处理过程都在内核层(Ring 0)进行。和七层负载均衡相比,具有更好的性能,因为不需要建立socket连接,不需要三次握手和四次分手,就是说不需要在内核里面建立线程,也就没有用户态和内核态切换成本了,直接根据IP和端口号就能知道往哪里传输数据了,类似于路由器,只是负责流量转发。但是有缺点,比如要求后端服务器具备镜像能力,它会向所有服务器发送请求,而不是向某个服务器发送请求,导致服务器资源浪费,没有发挥服务器使用率最大化,不具备定向发送能力,而且由于所有的响应包都要经过负载均衡服务器,负载均衡服务器的网卡带宽,很容易成为系统的瓶颈,如果能够让响应包不经过负载均衡服务器,就可以极大的提升整个负载均衡服务器的服务能力。我们下面介绍的数据链路层负载均衡,就具有这个能力。
数据链路层负载均衡
数据链路层负载均衡,顾名思义,就是工作在TCP/IP协议最底层的数据链路层,进行负载均衡。我们常用的以太网中,在这一层主要采用数据帧进行通信,每个网卡都具有唯一的MAC地址,数据帧用MAC地址来标识数据的来源与目的地。
数据链路层负载均衡通过修改数据包的MAC地址,实现负载均衡。这种数据传输方式又称为三角传输,负载均衡数据分发过程中不修改IP地址,只修改目的MAC地址,通过配置真实物理服务器集群所有机器虚拟IP和负载均衡服务器IP一致,从而达到不修改数据包的源地址和目的地址就可以进行数据分发的目的,由于实际处理请求的真实物理服务器IP和数据请求目的IP一致,不需要通过负载均衡服务器进行地址交换,可将响应数据包直接返回给用户,避免负载均衡服务器网卡带宽成为瓶颈。
这种负载均衡方式又称之为直接路由方式(DR)。如上图所示,用户请求到达负载均衡服务器114.100.20.200后,负载均衡服务器将数据包的目的MAC地址更改为00:1e:ec:bc:5e:03,并不修改数据包目的IP,由于服务器集群所有服务器的虚拟IP地址和负载均衡服务器IP地址一致,因此数据可以正常传输到达MAC地址为00:1e:ec:bc:5e:03的机器上,该服务器处理完之后,将响应数据包发送到网关服务器,网关服务器直接将数据包发送给用户,响应数据不需要通过负载均衡服务器,这样就避免了负载均衡服务器成为传输瓶颈的可能。
数据链路层负载均衡是目前使用最广泛的一种负载均衡方式。著名的负载均衡开源产品LVS(Linux Virtual Server),同时支持上面的IP负载均衡和数据链路层负载均衡。是学习负载均衡技术必须了解的产品。基于数据链路层的负载均衡虽然有非常好的性能,但是对网络拓扑也有比较大的限制,负载均衡服务器和后台服务器必须处于同一网络环境中才可以。lvs是4层负载均衡,也就是建立在osi的传输层协议之上,支持tcp和udp负载均衡,比其他高层(dns域名解析,应用层负载均衡,客户端调度)的负载均衡效率高很多。
keepalived工作在osi的第三层(会定期向服务器发送ICMP数据包来判断服务是否正常),第四层(会以tcp端口的状态判断服务是否正常)和第七层(会根据设定的策略,比如自定义检测脚本来判断服务是否正常)。