什么是负载均衡
假设生产环境只有一台服务器,一旦压力过大就很有可能导致Web服务响应缓慢,严重的可能会导致生产环境宕机。类似于12306抢票或者天猫购物节这种消费场景,几百万的用户量瞬间涌进来,单机的系统立刻就会因为支撑不住而瘫痪。此时就需要通过负载均衡来将流量均匀的分配到多个节点服务器上来减轻高流量带来的压力。即使某一个节点挂掉了,其它的节点也可以正常工作,不会造成生产环境宕机。
不过多节点负载均衡也会存在一个问题。那就是每台机器的软硬件配置可能存在差异。这样就会导致部分机器的响应特别快,部分机器的响应时间比较长。如果均分请求的话就会造成机器资源的浪费。比如某些性能比较好的机器不能承担更多的压力,某些性能比较差的机器却承担了过多的压力因此我们就需要一些负载均衡策略,将用户流量合理的分配到每台服务器上,充分发掘每台机器的性能,提高用户体验。实现负载均衡常用的软件有Nginx,Lvs,Apache,下面主要介绍Nginx。
负载均衡配置
/etc/nginx/sites-enabled/default
负载均衡配置在nginx.conf的http目录下,如下图
负载均衡策略
Nginx负载均衡通过upstream模块来实现,内置4种常用负载策略
upstream api/{
server localhost:1000;
server localhost:1001;
}
在这种策略下,Nginx会按照时间顺序将请求转发到不同的服务器上,如果某一台机器down掉了,会自动从负载策略中剔除,下次不再轮询
upstream api/ {
server localhost:1000 weight=10;
server localhost:1001 weight=20;
}
在这种策略下,Nginx会根据weight权重值来转发请求到服务器。权重越高的,转发越多。上图表示30次转发中有10次到了100机器,20次到了1001机器
upstream api/ {
ip_hash;
server localhost:1000 weight=10;
server localhost:1001 weight=20;
}
在这种策略下,Nginx会根据用户第一次请求时的ip计算出一个hash值。然后将请求分配到某一台服务器上,后续该用户所有的请求都会根据hash算法分发到最初处理的这台服务器。也就是说每个用户的请求都会被固定到某一台机器去处理。iphash可以和weight同用
upstream api {
least_conn;
server localhost:1000 weight=10;
server localhost:1001 weight=20;
}
在这种策略下,Nginx会计算每台服务器的连接,然后将请求转发给连接数最少的那台机器