Nginx负载均衡模块详解

一、关于负载均衡

在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。

Nginx不仅是一个出色的web软件,其七层代理和负载均衡也是相当出色。Nginx做前端代理,当用户请求服务时,可以根据url进行判断,然后分配到不同的后台webserver上。

实现原理:

首先在http模块中配置使用upstream模块定义后台的real server池,名为proxy-web,在池子中我们可以添加多台real server,其中状态检查、调度算法都是在池子中配置;然后在serverr模块中定义虚拟主机,但是这个虚拟主机不指定自己的web目录站点,它将使用location匹配url然后转发到上面定义好的web池子中,最后根据调度策略再转发到后台real server上

二、Nginx负载均衡策略

负载均衡用于从“upstream”模块定义的后端服务器列表中选取一台服务器接受用户的请求。一个最基本的upstream模块是这样的,模块内的server是服务器列表:

http {
	upstream static {
			server 192.168.1.1:80 weight=1 max_conns=1000 max_fails=3 fail_timeout=3;
			server 127.0.0.1:80 backup;
		}
}


    • 192.168.1.1:80:指定后端真实服务器可以是域名或ip,默认是80端口

    • weight:指定每个后端主机的调度的权重,默认为1

    • max_conns:指定后端主机最大并发连接数

    • max_fails:指定后端主机健康检查多少次失败后才将主机标记为不可用(默认1次,0为不做健康检测)

    • fail_timeout:指定后端主机健康检测超时多少时间为一次失败(默认10秒)

    • backup:指定sorry_server,当所有后端主机健康检测失败时,会显示此服务器的页面

    • down:将当前主机标记为不可用(维护时使用)

在upstream模块配置完成后,要让指定的访问反向代理到服务器列表:

server {
        listen 80;
        server_name www.aa1.com www.test.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location ~* \.(png|jpg|jpeg|html|htm|js|css|xml|gif)$ {
                proxy_pass http://static;
        }
}

这就是最基本的负载均衡实例,但这不足以满足实际需求;目前Nginx服务器的upstream模块支持6种调度算法:

轮循

默认方式

Weight

按权重比例调度

Ip_hash

根据源ip调度

Lease_conn

最少连接方式

Fair(第三方)

响应时间方式

Url_hash(第三方)

根据url分配方式

(1)rr轮询(默认)

按照请求顺序分配到每个RS,和lvs中的rr算法一样,如果RS宕机,会自动剔除,默认情况下只检测80端口,如果RS报402、403、503、504错误,会直接返回给客户端。

(2)weight(权重)

在rr的基础上再加上权重(默认是rr+weight),权重轮询和访问成正比,值越大分配的越多,可以根据服务器的配置设置权重,可以解决服务器性能不均进行请求分配的问题

(3)ip_hash

解决动态网页session共享问题 

每个访问请求按照IP地址的hash值进行分配,ip的hash值只要相同就会被分配到同一台服务器上(lvs负载均衡的-p参数,keepalived配置里的persistence_timeout 50),该调度算法可以解决动态网页session共享问题,但有时会导致请求分配不均

提示:由于国内用的都是nat模式,所以hash不适合使用 

ip_hash不能和其他的算法一块使用,即不能使weight或backup


hash的原理:将源地址进行hash计算,并和后端服务器的权重总数相除后转发到某服务器,使同一个客户端访问的请求始终派发到特定服务器,有一个缺点;当后端服务器发生宕机或新添加时权重总数发生变化,客户端下次可能被派发至新的服务器

consistent(一致性哈希):一致性hash的采用的是除数特别大,假设有一个hash环。是个闭环。把32位二进制的整数转换为十进制后均匀分布在整个环上。hash结果是除以2的32次方-1(hash是除以). 那么结果一定是落在环上的。那么,这个点靠近谁,就缓存在谁那里。假设a节点坏了。那么下一次的计算结果就是旁边的邻居。但是邻居的缓存不会受到影响。只是坏掉的A节点会从新去缓存。


(4)fair(第三方)

按照后端服务器的响应时间来配置,响应时间短的优先分配,比上面的都更智能,此种算法可以按照页面大小和加载时间长短智能的进行负载均衡,nginx本身不支持fair,需要下载nginx的upstrea_fair模块

(5)url_hash(第三方)

主要应用于缓存服务器上 

按照访问的url来分配请求,让相同的url定向到同一个服务器,后端服务器为缓存服务器的时候效果更显著,在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。 

缺点:如果有一台机器宕机了,那就苦了,consistent_hash可以解决这个问题 

可以提高后端缓存服务器的效率,nginx本身不支持url_hash的,需要下载hash软件

(6)least_conn 

最少连接数,哪个连接少就分配到哪台设备

猜你喜欢

转载自blog.51cto.com/13777759/2400115