一、负载均衡介绍
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 七层模型来看,它工作在 TCP 层
七层负载:在 OSI 七层模型看,它工作在应用层
3.2 软件负载和硬件负载
软件负载:Nginx 和 LVS。
Nginx 工作在七层,LVS 工作在四层。
硬件负载:F5
它工作在四层。
3.3 应用程序、网络、DNS负载
应用程序负载均衡:应用程序负载均衡就是负载均衡器查看请求内容,比如 HTTP 头或会话 ID ,然后重新定向这个请求的流量。
网络负载均衡:网络负载均衡就是查看 IP 地址和其他网络信息,然后根据这些信息来定向这个请求流量。
DNS 负载均衡:域名就是由 DNS 服务器解析成 IP,然后通过 IP 定位到提供服务的服务器。DNS 可以做到全局负载均衡。它的缺点就是修改 DNS 后,解析不能马上生效。为了改进这个缺点,就用 HTTPDNS。
四、参考
- 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,这个算法论文地址