负载均衡
# 负载均衡
研究中
# 1. 概述
当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等。
在实际应用中,在 Web 服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为 Web 服务器流量的入口,挑选最合适的一台 Web 服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。
软件负载解决的两个核心问题是:选谁、转发,其中最著名的是 LVS(Linux Virtual Server)。
# 2. 分类
负载均衡就是一种计算机网络技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁碟驱动器或其它资源中分配负载,以达到最佳化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。大致可以分为以下几种,其中最常用的是四层和七层负载均衡:
# 2.1 二层负载均衡(mac)
负载均衡服务器对外依然提供一个 VIP(虚IP),集群中不同的机器采用相同 IP地址,但机器的 MAC 地址不一样。当负载均衡服务器接受到请求之后,通过改写报文的目标 MAC 地址的方式将请求转发到目标机器实现负载均衡。
# 2.2 三层负载均衡(ip)
和二层负载均衡类似,负载均衡服务器对外依然提供一个 VIP(虚IP),但集群中不同的机器采用不同的 IP 地址。当负载均衡服务器接受到请求之后,根据不同的负载均衡算法,通过 IP 将请求转发至不同的真实服务器。
# 2.3 四层负载均衡(tcp)
在传输层,只有 TCP/UDP 协议,这两种协议中除了包含源 IP、目标 IP 以外,还包含源端口号及目的端口号。四层负载均衡服务器在接受到客户端请求后,通过修改数据包的地址信息( IP+端口号 )将流量转发到应用服务器。
在三层负载均衡的基础上,通过发布三层的 VIP 加上四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的浏览进行 NAT 处理,转发至后台服务器,并记录下这个 TCP/UDP 的流量是从哪台服务器处理的,后续这个连接的所有流量都同样转发到同一台服务器处理。
以 TCP 为例,负载均衡设备在接收到第一个来自客户端的 SYN 请求时,通过上述方式选择一个最佳的服务器,并对报文中目标 IP 地址进行修改(改为后端服务器IP),直接转发给该服务器。TCP 的连接建立,即三次握手是客户端和服务器直接建立的,负载均衡设备只是起到一个转发作用。
实现四层负载均衡的有:
- F5:硬件负载均衡器,功能好,但成本高
- lvs:重量级的软件
- haproxy:模拟四层、七层转发,较为灵活
# 2.4 七层负载均衡(http)
基于虚拟的 URL 或主机 IP 的负载均衡,七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 HTTP、Radius、DNS 等。七层负载就可以基于这些协议来负载。也称为”内容交换“,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接收到客户端发送的真正应用层内容的保温,然后根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。此时负载均衡服务器更类似于一个代理服务器。负载均衡和前端客户端以即后端的服务器分别建立 TCP 连接。所以,七层负载均衡的设备的要求更高,七层的处理能力将低于四层。
七层负载均衡的软件:
- haproxy:天使负载均衡技能,全面支持四层、七层代理,会话保持,标记,路径转移
- nginx:只在 http 和 mail 协议上功能比较好,性能约 haproxy差不多
- apache:功能较差
- Mysql proxy:功能尚可
# 2.5 四层与七层的区别
四层负载均衡 | 七层负载均衡 | |
---|---|---|
基于 | 基于 IP + Port | 基于 URL 或主机 IP 等 |
类似于 | 路由器,转发 | 代理服务器,代理 |
复杂度 | 低 | 高 |
性能 | 高,无需解析内容 | 中,需要算法识别 URL 和 HTTP head 等信息 |
安全性 | 低 | 高 |
额外功能 | 无 | 会话保持,图片压缩等 |
TCP连接 | 未建立 | 客户端与负载均衡服务器,负载均衡服务器与服务端 |
从上面的对比看来四层负载与七层负载最大的区别就是效率与功能的区别。
四层负载架构设计比较简单,无需解析具体的消息内容,在网络吞吐量及处理能力上会相对比较高,而七层负载均衡的优势则体现在功能多,控制灵活强大。在具体业务架构设计时,使用七层负载或者四层负载还得根据具体的情况综合考虑。
# 3. 大型网站方案
对于一些大的网站,一般会采用 DNS + 四层负载 + 七层负载的方式进行多层次负载均衡。
lvs + nginx 的拓扑结构
参考: