负载均衡的五种实现方案
负载均衡(Load Balance),指将负载(工作任务)进行平衡、分摊到多个操作单元上进行执行。
通过负载均衡,可以将高并发的请求分发到由多台应用服务器组成的一个服务器集群上,从而利用多台服务器资源处理高并发下的计算压力。
负载均衡大的技术方向分硬件负载均衡设计 和 软件负载均衡,硬件设备通常比较贵成本较高,这里主要讲软件实现负载 均衡的实现方案。
HTTP重定向负载均衡
HTTP 重定向负载均衡是一种比较简单的负载均衡技术实现。
用户的 HTTP 请求到达负载均衡服务器后,负载均衡服务器根据某种负载均衡算法计算得到一个应用服务器的地址,并通过 HTTP 状态码 302 重定向响应,将新的 IP 地址发送给用户的浏览器,浏览器收到重定向响应后,重新发送请求到真正的应用服务器,以此来实现负载均衡。
缺点也比较明显:
完成一次访问,需要请求两次服务器,一次请求是到负载均衡服务器,二次是重定向到应用服务器。影响了处理请求处理性能,增加网络耗时风险。
重定向真正的应用服务器,就会把应用服务器的 IP 暴露给外网,这带来了安全问题。
通常互联网服务器会有较严格的防火墙安全控制,对 IP 和 端口进行限制。
实际使用时只会将 负载均衡的 IP 地址暴露给外部访问,真正的应用服务器使用的是内网 IP,外部无法直接访问。
HTTP 重定向负载均衡在实践中很少使用。
DNS负载均衡
互联网应用通常是通过域名访问的,HTTP 协议是基于 IP 加端口建立通信息,在域名服务商购买域名成功后需要指定服务器的IP和端口。使用域名访问需要通过 DNS 将域名解析到具体的 IP服务器才能建立 HTTP 连接。
可以在 DNS 解析实现负载均衡,在域名解析配置时,同一个域名添加多个解析地址。几乎所有域名服务商都支持域名分析负载均衡。
大型互联网应用通常并不会直接通过 DNS 解析得到应用服务器的 IP 地址,而是解析得到负载均衡服务器的 IP 地址。
反向代理负载均衡
将发送给应用服务器的请求进行负载均衡,即将不同的用户请求分发到不同的服务器上。
Nginx 这样的 HTTP 服务器可以同时提供反向代理与负载均衡功能。
反向代理服务器是工作在HTTP协议层上的,所以它代理的也是 HTTP 的请求和响应。
作为互联网应用层的一个协议,HTTP 协议相对比较重,效率较低,所以反向代理负载均衡通常用在较小规模的互联网系统上,即只有几台或者十几台服务器的规模。
反向代理负载均衡是工作在应用层网络协议上的负载均衡,因此也叫应用层负载均衡。
IP负载均衡
OSI 七层模型的网络层:进行逻辑地址(IP)寻址,为数据在节点之间传输创建逻辑链路,通过路由算法为分组选择最佳路径,实现不同网络之间的路径选择。对应TCP/IP 参考模型的网际互联层。
TCP/IP 参考模型的网际互联层,注重重新赋予主机一个 IP 地址来完成对主机的寻址。
应用层负载均衡之下的负载均衡方法是在 TCP/IP 协议的 IP 层进行负载均衡,IP 层是网络通信协议的网络层,所以有时又称为网络层负载均衡。
在请求到达负载均衡服务器后,负载均衡服务器会对网络层数据包的 IP 地址进行转换,将期修改为应用服务器的 IP 地址,然后把数据包重新发出去,请求数据就会到达应用服务器。
IP 负载均衡工作在 IP 协议层,可以在操作系统内核直接修改 IP 数据包的地址,因此效率比应用层的反向代理负载均衡高得多。
但依然有一个缺陷,就是不管是请求还是响应数据包,都要通过负载均衡服务器进行 IP 地址转换后,才能正确地把请求数据分发到应用服务上,或将数据包响应给客户端。
数据链路层负载均衡
OSI 七层模型的数据链路层:是在通信实体间建立数据链路,传输基本单位为 帧。数据链路层由 MAC(介质访问控制子层)和 LLC(逻辑链路控制子层)组成。
数据链路层:建立逻辑连接,进行硬件地址寻址,差错校验。将比特组合成字节进进而组合成帧,用 MAC 地址访问介质。
数据链路层负载均衡可以解决响应数据量大而导致的负载均衡服务器输出带宽不足的问题。
链路层负载均衡是通过修改数据链路层里的网卡 mac 地址来实现的,并不会修改数据包的 IP 地址。
由于应用服务器和负载均衡器使用的是相同的虚拟 IP 地址,因此 IP 路由不受影响。网卡会根据自己的 mac 的地址选择负载均衡服务器发送自己网卡的数据包中,并交给对应的应用程序云处理,处理结束以后,当把响应数据包发送到网络上时,因为 IP 地址没有被修改,所以这个响应会直接到达用户的浏览器,而不会再经过负载均衡服务器。
Linux 上实现 IP 负载均衡和链路层负载均衡的技术是 LVS,目前 LVS 的功能已经集成到 Linux 中了,通过 Linux 可以直接配置实现这两种负载均衡。