什么是负载均衡?

负载均衡指的是将用户的请求分摊到不同的服务器上处理,以提高系统的整体并发处理能力和可靠性。负载均衡可以有专门的软件和硬件来完成,一般情况下,硬件的性能和稳定性更好,但是太贵了,所以一般使用软件的负载均衡


负载均衡分类

负载均衡可以简单分为 服务端负载均衡 和 客户端负载均衡 这两种

服务端负载均衡

服务端负载均衡就是在服务端引入一个独立的负载均衡器(如 Nginx、LVS、Envoy、F5),由它来接收客户端请求并分发到后端实例。
它可以分为 二层负载均衡, 四层负载均衡, 七层负载均衡, 六层负载均衡,
其中 四层负载均衡(基于 TCP/UDP,性能高,但只能做转发)和 七层负载均衡(基于 HTTP/HTTPS,可以根据 URL、Header 做复杂策略)。
常见算法有轮询、加权轮询、最少连接、一致性哈希等。
在实际生产环境中,服务端负载均衡不仅负责流量分发,还要做健康检查、容灾、会话粘性和灰度发布。

四层负载均衡

四层负载均衡,也就是传输层(针对TCP/UDP)主要是 IP和端口的负载均衡,不关注具体的报文和URL,只是对TCP请求的流量转发

七层负载均衡

七层的负载均衡工作在OSI的第七层,主要协议是HTTP这一层的负载均衡比第四层的负载均衡请求方式更加复杂,它会读取报文的数据部分(比如我们说的HTTP部分的报文),然后根据读取的数据内容(如URL、Cookie)做出负载均衡决策,也就是说,七层负载均衡器的核心是报文内容(如URI、Cookie)层面的负载均衡,执行第七层负载均衡的设备通常称为反向代理服务器。

七层负载均衡会比四层负载均衡消耗更多的性能,不过功能性更强

常见方法有使用Nginx做反向代理:Nginx | 梦始, 和 DNS解析: DNS | 梦始

客户端负载均衡

主要用于系统内部不同的服务之间,有现成的负载均衡组件


负载均衡常用算法

随机法

简单粗暴把流量随机分给不同的服务器,适合于各个服务器性能接近的集群

轮询法

按照顺序挨个访问服务器,还可以设置权重,适合于性能不同的集群,服务器配置的权重越高访问的次数越大,可以合理对于性能高的服务器多分配权重

两次随机法

在随机法基础上多增加了一次随机,多选出一个服务器,之后根据两台服务器的情况比较选择一个更好的服务器,两次随机法的好处是可以动态地调节后端节点的负载,使其更加均衡,如果只使用一次随机法,可能导致某些服务器过载,而某些服务器空闲

哈希法

将请求的参数信息转换成一个哈希值,然后根据哈希值来确定请求哪一台服务器处理

在服务器数量不变的情况下,相同的请求参数总是发到同一台服务器处理,比如同个IP的请求、同一个用户的请求

一致性哈希法

和哈希法一样,都是用哈希值确定服务器的使用,但是解决了一个问题,常规哈希法在服务器数量增加的情况下分配会发生变化,一致性哈希法将数据和哈希映射到一个环上面,根据哈希值的顺序确定数据属于哪个节点。当服务器增加或者删除,只影响该服务器的哈希,而不会导致整个服务器的哈希键值重新分布

最小连接法

当有新的请求出现时候,先遍历服务器节点选择其中连接数量最小的一台服务器连接

这种办法并不能完全保证合理,因为连接的少不一定就负载小

最少活跃法

和最小连接一样,选择最小活跃的一台,更加科学一点

最快响应法

不同于最小连接法和最少活跃法,最快响应时间为标准来选择具体哪一台服务器处理。客户端会维持每个服务器的响应时间,每次挑选响应时间最短的,这种方法可以使得请求更快被响应,但会造成流量过多集中于高性能服务器问题