Nginx-负载均衡-调度算法-weight、ip_hash、least_conn、url_hash
1、负载均衡调度算法类型
1.1、轮询调度算法
按时间顺序逐一分配到不同的后端服务器(默认)
1.2、加权轮询调度算法
加权轮询,weight值越大,分配到的访问几率越高
1.3、ip_hash调度算法
每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
1.4、least_conn调度算法
将请求传递到活动连接数最少的服务器。
2、负载均衡调度算法解析和配置
2.1、轮询调度算法
2.1.1、解析
轮询调度算法的原理是将每一次用户的请求,轮流分配给内部中的服务器。
轮询算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。
2.1.2、配置方法
]# cat /etc/nginx/conf.d/proxy_web.cyc.com.conf upstream web { server 192.168.10.5:8080; server 192.168.10.7:8080; } server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; } }
2.2、加权轮询调度算法
2.2.1、解析
轮询调度算法没有考虑每台服务器的处理能力,在实际情况中,由于每台服务器的配置安装的业务应用等不同,其处理能力会不一样。
所以,我们根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
2.2.2、配置方法
]# cat /etc/nginx/conf.d/proxy_web.cyc.com.conf upstream web { server 192.168.10.5:8080 weight=5; server 192.168.10.7:8080 weight=1; } server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; } }
2.3、ip_hash调度算法
2.3.1、解析
ip_hash是基于用户请求的IP,对该IP进行hash运算,根据hash运算的值,将请求分配到后端特定的一台节点进行处理。
ip_hash算法实现公式: hash(ip) % node_counts = index
2.3.2、配置方法
cat >/etc/nginx/conf.d/proxy_web.cyc.com.conf<<'EOF' upstream web { ip_hash; server 192.168.10.5:8080; server 192.168.10.7:8080; } server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; } } EOF
2.4、url_hash调度算法
2.4.1、解析
根据用户请求的URL进行hash取模,根据hash运算的值,将请求分配到后端特定的一台节点进行处理。 URL算法使用场景如下: client-->nginx-->url_hash-->cache1-->app 1、用户请求nginx负载均衡器,通过url 调度算法,将请求调度至Cache1; 2、由于Cache1节点没有对应的缓存数据,则会请求后端获取,然后返回数据,并将数据缓存起来; 3、当其他用户再次请求此前相同的URL时,此时调度器依然会调度至cache1节点处理; 4、由于Cache1节点已存在该URL资源缓存,所以直接将缓存数据进行返回;能大幅提升网站的响应;
2.4.2、配置后端节点
# web01 echo "web01 Url-1" > /opt/web01/url1.html echo "web01 Url-2" > /opt/web01/url2.html # web02 echo "web02 Url-1" > /opt/web02/url1.html echo "web02 Ur-l2" > /opt/web02/url2.html
2.4.3、配置方法
cat >/etc/nginx/conf.d/proxy_web.cyc.com.conf<<'EOF' upstream web { hash $request_uri consistent; server 192.168.10.5:8080; server 192.168.10.7:8080; } server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; } } EOF # 请求同一个url,会始终定向到同一个服务器节点
# consistent表示使用一致性hash算法
2.4.4、测试访问
# client测试,会发现请求相同的URL ,始终会被定向至某特定后端节点。 curl -H Host:web.cyc.com http://192.168.10.4/url2.html
2.5、least_conn调度算法
2.5.1、解析
least_conn调度算法实现原理,哪台节点连接数少,则将请求调度至哪台节点。
假设∶A节点有1000个连接、b节点有500连接,如果此时新的连接进入会分发给b节点
2.5.3、配置方法
cat >/etc/nginx/conf.d/proxy_web.cyc.com.conf<<'EOF' upstream web { least_conn; server 192.168.10.5:8080; server 192.168.10.7:8080; } server{ listen 80; server_name web.cyc.com; location / { proxy_pass http://web; include proxy_params; } } EOF
3、扩展-Hash算法
3.1、ip_hash
3.1.1、流程图
3.1.2、下掉一台后的流程图
3.1.3、存在的问题
如果有大量的用户调度到某一节点,而该节点刚好故障,则该算法会重新计算结果,从而造成大量的用户被转移其他节点处理,而需要重新建立会话。
3.2、一致性hash调度算法
为了规避上述hash情况,一致性hash算法就诞生,一致性 Hash算法也是使用取模的方法,但不是对服务器节点数量进行取模,而是对2的32方取模。即,一致性Hash算法将整个Hash 空间组织成一个虚拟的圆环, Hash函数值的空间为0~2^32 - 1
3.2.1、整个哈希环图
虚拟的圆环,Hash函数值的空间为0 ~ 2^32 - 1
3.2.2、整个环形已顺时针方向旋转分布在环形内图
整个环形已顺时针方向旋转,然后计算服务器,将服务器信息分布在环形的各个位置。
3.2.3、用户近访问原则图
当有用户请求,也会根据hash运算,将用户分布到环形中,然后用户以就近访问原则,访问离自己最近的服务器。
3.2.4、服务器减少原理图
服务器减少:节点3故障后,原先连接的用户节点则会顺时针方向迁移到节点4服务器。(影响的仅是局部用户)
3.2.5、服务器增加原理图
新增节点,原先离用户3节点较近的两个用户,有一个用户离"新增加的节点”更近,所以该用户就会被分配至新增加的服务器节点。(影响的也仅仅是局部用户。)