大流量下负载均衡普遍策略
负载均衡种类
网络层次结构划分:
【OSI七层网络模型】 【ICP/IP四层网络模型】 【传输数据名称】
==============================================================================================
[七层]
[应用层] -------> | | ------> (消息报文 `Message-Data`)
[表示层] -------> | 应用层 {HTTP/HTTPS/DNS/FTP/..}| ------> (表示数据 `Presentation-Data`)
[会话层] -------> | | ------> (会话数据 `Session-Data`)
[四层]
[传输层] -------> | 传输层 {TCP/UDP}| ------> (段`Segments`/数据报 `User-Datagram`)
[网络层] -------> | 网络层 {ARP/IP/ICMP}| ------> (数据包 `Packets`)
[数据链路层] -------> | 数据链路层 | ------> (帧 `Frames`)
[物理层] -------> | | ------> (比特 `Bits`)
二层负载均衡(数据链路层)
用于局域网内部,提供虚拟 IP 地址,虚拟 MAC 地址接收数据,再流量进行分发到真正的 MAC 主机实例上,最后 MAC 主机直接响应用户
相关用法:
- 以太网链路聚合
- 以太网链路聚合 多条以太网物理链路捆绑在一起成为一条逻辑链路 从而实现增加链路带宽的目的
- 链路聚合控制协议:LACP(Link Aggregation Control Protocol)
- 增加链路带宽,链路互相动态备份
- PPP 捆绑技术
- 将多个物理链路合并或者捆绑成一个大逻辑链路的机制
- 增加带宽,减少延时,线路备份
优缺点:
效率高
Client (请求某 IP) => MAC LB (二层负载和真实服务器 IP 相同,经过负载修改真正 MAC 地址) => Server1 (服务集群:明确的 MAC 地址) => Client (直接响应)
不能跨子网
由于提供虚拟 MAC,再经过负载均衡器后,修改真实的 MAC 地址,这表明负载均衡器和真实服务器是二层可达
三层负载均衡(网络层)
外部对虚拟的 IP 地址请求,负载均衡接收后分配后端实际的 IP 地址响应,不同机器不同的 IP。
相关用法:
- OSPF
- RIP
优缺点:
可以跨子网
四层负载均衡 (传输层)
四层负载均衡,也称之为四层交换机,就是三层 VIP + 四层 PORT,来进行路由转发分配到真实的服务器。
四层负载均衡工作在 OSI 模型的传输层,主要是 TCP/UDP 协议,这两种协议中除了包含源 IP、目标 IP 以外,还包含源端口号及目的端口号。通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
主要基于 TCP 协议的负载均衡,通过 IP + PORT 来进行转发
转发模式:
DR Direct Routing
三角传输:通过修改 MAC 地址,让流量经过二层转发到达应用服务器
优点:高效,应用服务器直接把应答响应给到客户端,不需要经过负载均衡
缺点:依赖于二层负载,需要在同一个局域网内,所有应用服务器统一对外需要配置 VIP
NAT Network Address Translation
修改数据包的目的 IP 地址,让流量到达应用服务器,应用服务器处理完毕后,仍然需要让响应回到负载均衡器进行 源 IP 改成 VIP 才能让客户端识别出来
优点:应用服务器无需配置 VIP
缺点:负载均衡器需要以网关的形式存在,流量流入流出都要经过,必须在同一个局域网内
TUNNEL
源设备和目标设备之间建立一条虚拟通道,将数据包封装在通道中传输,类似 DR,但是需要支持 Tunnel
FULLNAT
可以摆脱局域网的限制
七层负载均衡 (应用层)
七层负载均衡,也称之为七层交换机,七层在四层上面,所以七层一般来说也是支持四层负载。除了根据 IP+PORT 来进行负载分流,也能通过 HOST、URL、Header 等进行分配。
七层负载均衡工作在 OSI 模型的应用层,应用层协议较多,常用 HTTP、DNS 等。七层负载就可以基于这些协议来负载。负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接 (三次握手) 后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。
四层和七层的负载均衡区别
- OSI 网络模型的层级不同
- 四层负载对应传输层
- 七层负载对应应用层
TCP 连接建立
- 四层负载,本身充当路由转发作用,在接收到客户端的流量以后通过修改数据包的地址信息将流量转发到后端服务器 ,只需要建立一次 TCP 连接 , 客户端直接和真实后端服务器连接
- 七层负载,充当中间人代理作用,七层负载均衡会跟客户端建立一层完整的连接将应用层的请求流量解析出来,再根据调度均衡算法选一台应用服务器并与之建立连接,需要建立两次 TCP 连接
灵活性
- 四层负载,仅支持网络层的转发,不解析用户请求内容
- 七层负载,从应用层可以解析用户请求内容,从而进行不同的处理
效率 - 四层负载,更加底层高效
- 七层负载,相对来说没有四层那么高效,但是功能更加丰富
具体代表协议
- 四层负载均衡:IP、MAC
- 七层负载均衡:HTTP、DNS
单机房
Nginx应用层负载:对于某一类应用而言,一般来讲是会有多个应用实例的。为了将流量分散到不同的应用实例,就需要进行负载均衡策略,可以使用nginx在应用层完成负载均衡。
DB负载:对于传统的有状态服务而言,会连接后台数据库,如果所有的应用实例都连接同一个db,那么db最后就会成为性能瓶颈。常用的方式就是借助于数据库代理进行分库、分表。数据库代理一般有应用端和数据库端的数据库代理,比如以应用端数据库代理为例,使用uid进行分库。
对于Nginx而言,nginx本身虽然具有高吞吐的特性,可以处理大量的请求,但是只靠nginx进行负载均衡,在超高流量下依然还是可能扛不住,对于nginx本身也需要加一层负载。一般而言可以使用lvs进行负载均衡。
LVS不同于nginx,LVS工作于七层中的四层,可以有更强大的吞吐量,扛百万级并发,但是再更高的流量下,单纯一个LVS依然还是可能成为性能瓶颈,例如对于微信抖音这种日常可能亿级别并发的,但就一个LVS还是扛不住的。LVS也需要负载,这时候借助于底层路由进行负载。
整体来讲就是:
底层route负载 -> LVS四层负载 -> nginx七层负载 ->应用本身 -> DB负载
多机房
多机房之间就需要使用DNS进行负载均衡了
标签:负载,七层,流量,四层,均衡,IP,应用层 From: https://www.cnblogs.com/cirth9/p/18508618