一、什么是负载均衡
负载均衡,名字很直白了就是让服务器的负载更均衡合理(好像说了句废话^_^)。负载均衡在不同的应用场景意义也有所不同。负载均衡的作用总结起来就两点:灾备和分流。
灾备:在应用中的目的是提供系统的可用性,保证某个服务出现异常时不至于整体瘫痪。集群让有同样功能的服务互相替补。灾备是集群自然具有的能力
分流:在应用中的目的是为了提高系统的性能,通过集群让系统能够承载更大的压力。
负载均衡的关键只有一个,"分发"!。负载均衡的各种负载策略也只是为了让上面说到的分流更合理。所以说分流的优化是需要我们认为努力的,而灾备的能力是集群紫瑶具备的。
二、负载均衡方案
一、DNS负载均衡
主要负载算法,轮询。
二、Nginx负载均衡
Nginx的物种负载均衡算法:
1、round robin(默认)
轮询方式,依次将请求分配到各个后台服务器中,默认的负载均衡方式。 适用于后台机器性能一致的情况。 挂掉的机器可以自动从服务列表中剔除。
2、weight
根据权重来分发请求到不同的机器中,指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。比如:
upstream bakend { server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; }
3、IP_hash
根据请求者ip的hash值将请求发送到后台服务器中,可以保证来自同一ip的请求被打到固定的机器上,可以解决session问题。比如:
upstream bakend { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; }
4、url_hash(第三方)
根据请求的url的hash值将请求分到不同的机器中,当后台服务器为缓存的时候效率高。相当于某个服务只处理某些业务。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。Nginx中在做详细介绍
5、fair(第三方)
根据后台响应时间来分发请求,响应时间短的分发的请求多。例如:
upstream backend { server server1; server server2; fair; }
三、服务间负载均衡
服务间通信除了负载均衡,服务连接池还能够实现***故障转移、超时处理、限流限速、ID串行化***等诸多功能。
四、数据库负载均衡
在数据量很大的情况下,由于数据层(db/cache)涉及数据的水平切分,所以数据层的负载均衡更为复杂一些,它分为“数据的均衡”,与“请求的均衡”。这里的负载均衡和集群的概念有些不同。
1、数据的均衡
数据的均衡是指:水平切分后的每个服务(db/cache),数据量是均匀的。
2、请求的均衡
请求的均衡是指:水平切分后的每个服务(db/cache),请求量是均匀的。同时,根据水平切分的方式,主要又分为range水平切分和ID哈希水平切分。
分表分库再详细介绍
总结
负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行,其的关键在于均匀:
反向代理层的负载均衡,是通过“DNS轮询”实现的
站点层的负载均衡,是通过“nginx”实现的
服务层的负载均衡,是通过“服务连接池”实现的
数据层的负载均衡,要考虑“数据的均衡”与“请求的均衡”两个点,常见的方式有“按照范围水平切分”与“hash水平切分”