负载均衡的实现方式与算法
文章导航
负载均衡的实现方式
HTTP重定向负载均衡

HTTP重定向负载均衡需要一台重定向服务器。它的功能就是根据用户的HTTP请求根据负载均衡算法选择一个真实的服务器地址,并将服务器地址信息写入到重定向响应中返回给用户浏览器。用户浏览器再获取到响应之后,根据返回的信息,重新发送一个请求到真实的服务器上。
优点:
实现比较简单
缺点:浏览器需要请求两次服务器才能完成一次访问,性能较差。
- 重定向服务器本身容易成为性能的瓶颈,使得整个集群的伸缩性有限。
- 另外HTTP返回码302重定向,可能会使搜索引擎判断未SEO作弊,降低搜索排名。
DNS域名解析负载均衡

DNS域名解析负载均衡是在进行域名解析的时候分局负载均衡算法选择一个合适的I{P地址返回,这样来实现负载均衡。大型网站一般将DNS域名解析负载均衡作为第一级负载均衡的手段
优点:
- 将负载均衡的工作交由DNS,省去了管理完整负载均衡服务器的麻烦
- 技术实现比较灵活、方便、简单易行,成本低,适用于大多数TCP/IP应用
- 对于部署的服务而言,无需任何的修改
- 服务器可以位于互联网的任意位置
- 一些DNS还支持地址位置的域名解析,即域名解析成距离用户地址位置最近的一个服务器地址,这样可以加快用户的访问速度。
缺点;
- 因为DNS是多级解析的,因此当集群结构改变后,需要很长时间才能使缓冲的DNS信息刷新。
- 不能按照服务器的处理能力来分配负载。DNS负载均衡采用的是简单的轮询算法,不能区分服务器之间的差异,不能反映服务器的运行状态。
- 可能会造成额外的网络问题,为了使本DNS服务器和其它DNS服务器能够即时的交互,保证DNS数据及时更新,使地址能够随机分配,一般都要将DNS的刷新时间设置的较小,但太小将会使DNS流量大增造成额外的网络问题。
反向代理负载均衡

通过反向代理服务器来选择合适的服务器作为目的服务器进行请求的转发。来实现负载均衡
IP负载均衡
IP负载均衡又称为网络层负载均衡,它和原理就是通过内核驱动更改IP的目的地址来完成数据负载均衡。
原理图:
IP负载均衡在内核进程完成数据分发,处理性能得到了很好的提高。但是由于所有请求和响应都要经过负载均衡服务器,集群的最大响应数据吞吐量将受到负载均衡服务器网卡带宽的限制。
数据链路负载均衡
数据链路层负载均衡通过修改通信协议数据包的mac地址进行负载均衡。
这种三角传输模式的链路层负载均衡是目前大型网站使用比较广泛的负载均衡手段。在Linux平台下最好的链路层负载均衡开源产品时LVS(Linux Virtual Server)。
基本的负载均衡算法
轮询法
将请求按照顺序轮流的分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
随机法
通过随机算法,根据后端服务器的列表大小指来随机的选择其中的一台服务器进行访问。
源地址哈希法
源地址哈希的思想是根据获取客户端的IP,通过hash函数计算得到的一个数值,用改数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问的服务器的序列。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
加权轮询法
不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
加权随机法
与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。
最小连接数法
最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。
Nginx提供的负载均衡算法
- 轮询
- 加权轮询
- IP_hash
- fair
根据后端服务器的响应时间来进行分配,响应时间段的优先分配。 url_hash
Dubbo提供的负载均衡算法
加权随机
- 加权轮询
- 最小活跃调用
一致性hash算法























