Nginx-负载均衡-调度算法-weight、ip_hash、least_conn、url_hash

Nginx-学习目录

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节点较近的两个用户,有一个用户离"新增加的节点”更近,所以该用户就会被分配至新增加的服务器节点。(影响的也仅仅是局部用户。)

 

posted @ 2023-05-01 15:13  小粉优化大师  阅读(1316)  评论(0编辑  收藏  举报