负载均衡load balancing和算法分类概要介绍
一、负载均衡介绍
1.1 什么是负载均衡
负载均衡(load balancing)
它是计算机的一种技术,用来在计算机集群、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。-来自 wikipedia
负载均衡主要作用是将多个连接或作业合理的分配到多个操作单元上执行,用于解决互联网中高可用和高并发问题。
在互联网应用程序服务中,负载均衡就是一种合理分配网络流量到你后端执行程序的一种方法。
后端有多个相同程序提供服务,负载均衡器就可以把多个客户端请求合理分配给后端服务器(应用程序在服务器里)。
负载均衡器就像餐厅的前台接待员,客人来了后,接待员就把客人引导到合适的台桌和座位上,后续的服务员在为客户提供服务。
1.2 负载均衡作用
扩展性
你可以使用负载均衡器在多个服务器之间均衡的调度访问流量。
你还可以添加或删除你的后端服务器,只需要把这台服务器的信息告诉负载均衡器。你可以放心扩展你的服务器。
可以同时应对访问的流量高峰或流量低谷。
高可用性
第一:负载均衡器后面有多台服务器,如果其中一台服务器故障了,还有其它服务器可以提供后端服务。
第二:当你的应用程序升级或服务器需要维护时,不需要停机,因为前面有负载均衡器,可以帮你摘除没有提供服务的服务器。
第三:负载均衡器还可以帮你检查后端服务健康情况,服务不可用时,可以摘除这个服务,等到服务可用后,又可以添加这个服务。
性能
负载均衡器可以提高后端服务程序性能。
它可以把访问负载按照一定方式分配到后端不同服务器,以此来提高服务程序性能。
这个不同的方式指的是按照什么算法什么策略。
它也可以定位到较近的服务器以减少网络延迟。
二、负载均衡算法
最常用的 Web 服务器 Nginx,我们经常拿它作为 web 服务器的负载均衡器使用。
负载均衡有哪些算法呢?下面介绍,
2.1 轮询算法RoundRobin
轮询算法就是按照循环的方式来访问后端服务器。
比如上面有 3 台后端服务器,这种算法就是按照服务器1,服务器2,服务器3 依次轮询一台服务器提供服务。
2.2 加权轮询算法
因为每台服务器可能性能不同、网络带宽不同,那性能好的服务器就可以多提供些访问服务,性能差的就少提供。
那怎么做?可以加一个权重指标,来标识服务器访问性能好坏。权重较高,表示服务器性能好,就多接收一些访问流量。权重低的就少接收访问流量。
比如在 Nginx 里,weight 就表示权重,weight 值越大表示权重越高,那么后端服务器就可以多接收访问流量。
平均加权轮询算法:
每个服务器对应 2 个权重,为 weight 和 currentWeight,weight 是固定,而 currentWeight 动态调整,初始值为 0。
2.3 随机选择算法Random
随机选择算法就是随机性的选择一台后端服务器提供服务。
比如有 3 台服务器 1、2、3,每一次选择有可能是 1,也可能是 2,也可能是 3,每次选择都是随机的。
随机数也可以加个权重。
2.4 最少连接数
最少连接数算法,就是负载均衡器将检查后端哪些服务器的活跃连接数最少,就将访问流量发送给这些服务器。
这个活跃连接数一般就是指 TCP 连接数。
2.5 哈希算法hash
哈希算法一般有:ip 哈希,url 哈希,hash算法,一致性hash算法等算法。
2.6 最短响应时间
最短响应时间就是将服务器的响应时间和活跃连接数结合起来,用来确定一个最佳的服务器。
2.7 Power of Two Choices
Nginx 在 1.15.1 中增加了这种新的负载均衡算法 Power of Two Choices。
简单理解就是随机从所有可用节点中选择两个节点,然后计算这2个节点负载情况,计算出一个负载较低的服务器,就选择这台服务器处理本次请求。
具体可以看这篇文章:nginx-power-of-two-choices-load-balancing-algorithm
算法论文地址:The Power of Two Random Choices: A Survey of Techniques and Results
三、负载均衡类型
3.1 四层负载和七层负载
这四层负载和七层负载是指在 OSI 七层网络模型。越往上越接近软件,越往下越接近硬件。
四层负载:在 OSI 七层模型来看,它工作在 TCP 传输层
七层负载:在 OSI 七层模型看,它工作在应用层
3.2 软件负载和硬件负载
软件负载:Nginx、HAproxy 和 LVS
Nginx 工作在七层,OSI 网络模型的第七层应用层。
HAproxy 也是工作在七层,支持七层的负载规则。
LVS 它允许在 linux 内核态,工作在传输层和网络层,软件负载均衡中性能最高。
Nginx 作为负载均衡器代理后端应用服务集群,示意图:
软件负载均衡虽然比硬件负载性能差些,但是对于一般应用基本够用。而且它还便于操作,免费,可以灵活配置。
硬件负载:F5、Array 和 NetScaler
它工作在四层。功能强大,可以支持各种负载均衡算法。性能强大,可以支持百万以上并发。比软件负载均衡性能更好。
缺点就是很贵,一台普通F5得10多万,好点要尽百万。
3.3 应用程序、网络、DNS负载
应用程序负载均衡:
应用程序负载均衡就是负载均衡器查看请求内容,比如 HTTP 头或会话 ID ,然后重新定向这个请求的流量。
网络负载均衡:
网络负载均衡就是查看 IP 地址和其他网络信息,然后根据这些信息来定向这个请求流量。
DNS 负载均衡:
域名就是由 DNS 服务器解析成 IP,然后通过 IP 定位到提供服务的服务器。DNS 可以做 全局负载均衡 - 地理位置和数据机房级别的负载均衡。
DNS 的缺点: 修改 DNS 解析规则后,解析不能马上生效,因为它有缓存。为了改进这个缺点,可以用 HTTPDNS。
HTTPDNS 也有缺点:它不像 DNS 是一个标准协议,不通用。不适合 web 业务,因为 web 中的 DNS 解析是由浏览器解析的,不容易控制。所以 HTTPDNS 一般多用于 APP 应用、客户端应用,这种可以完全掌控的应用。
四、多级负载均衡
LVS + Nginx 多级负载均衡
- 两台 LVS 在四层负载均衡,可以组成主备或双主结构
- 后面的 Nginx 可以组成负载集群,可以横向扩展。一台 Nginx 负载均衡不可用,还有其它的 Nginx 可用,可用性更高
- 后面的应用服务器集群也可以横向扩展
DNS + Nginx 多级负载均衡
根据地址位置进行负载均衡。由 DNS 解析出 IP 地址,根据 IP 地址计算出地理位置,然后导向相应地理位置的 Nginx 负载均衡集群。
比如一家公司在北京和深圳设有 2 地数据中心,华北相关地方访问北京数据中心,华南相关地方访问深圳数据中心。
这家公司就可以根据用户访问 IP 地址计算出用户相应地理位置,然后根据地理位置访问对应最近的数据中心。
五、参考
- https://www.nginx.com/blog/nginx-power-of-two-choices-load-balancing-algorithm/ nginx 的 p2c 算法
- https://nginx.org/en/docs/http/ngx_http_upstream_module.html nginx 模块
- https://www.eecs.harvard.edu/~michaelm/postscripts/handbook2001.pdf The Power of Two Random Choices: A Survey of Techniques and Results,这个算法论文地址