vlambda博客
学习文章列表

一个字“绝”丨Nginx负载均衡解决的问题和实现方式都在这里啦!

点击上方蓝字关注我们

今天的话题,咱们来聊一聊Nginx负载均衡的话题,聊起这个话题,是因为威哥周末见了一个之前的学员,多年过去了,成了朋友,技术上的“精神伴侣”,吐槽公司最近在招人,面试了好多人,不是技术太菜,就是技术太水(好像是一样的),一顿愁眉苦脸,感叹招人不易。

这不,聊到了Nginx,互联网项目必备的技能点了,我说你是不是要求太高,用自己的技术水平去要求面试者,他说还真没有,就是一般性的问题而已,我说你都问了啥,说来听听,下面是他的问题:

负载均衡是为了解决什么问题?有哪几种实现负载均衡的方式?

还真是不难,很普通的问题而已,小伙伴们面试有遇到这个问题吗,如果是互联网公司面试,解决负载均衡的问题那是必不可少的,不懂的童鞋来恶补一下吧。

首先,负载均衡主要解决当数据量过大,连接数较多情况下,服务器硬件无法满足需要处理的性能消耗,也就是是说服务器成了瓶颈,服务器负载均衡解决服务器瓶颈,使大量的连接平均分发到多台服务器。在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。

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

#动态服务器组
upstream dynamic_server {
   server localhost:8080;  #tomcat 7.0
   server localhost:8081;  #tomcat 8.0
   server localhost:8082;  #tomcat 8.5
   server localhost:8083;  #tomcat 9.0
}

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

#其他页面反向代理到tomcat容器
location ~ .*$ {
  index index.jsp index.html;
  proxy_pass http://dynamic_server;
}

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

轮询

默认方式

weight

权重方式

ip_hash

依据ip分配方式

least_conn

最少连接方式

fair(第三方)

响应时间方式

url_hash(第三方)

依据URL分配方式

Nginx为我们默认提供了三种负载均衡的策略:

  • 轮询:将客户端发起的请求,平均的分配给每一台服务器。

  • 权重:会将客户端的请求,根据服务器的权重值不同,分配不同的数量。

现在咱们来分别对轮询,权重,ip_pash展开讲解一下。

轮询(默认方式)

想实现Nginx轮询负载均衡机制只需要在配置文件中添加以下内容:

upstream 名字 {
 server ip:port;
 server ip:port;
 ...
}
server {
 listen 80;
 server_name localhost;
 
 location / {
   proxy_pass http://upstream的名字/;
 }
}

weight(权重方式)

实现权重的方式

upstream 名字 {
 server ip:port weight=权重比例;
 server ip:port weight=权重比例;
 ...
}
server {
 listen 80;
 server_name localhost;
 
 location / {
   proxy_pass http://upstream的名字/;
 }
}

ip_hash(依据ip分配方式)

ip_hash实现

upstream 名字 {
 ip_hash;
 server ip:port;
 server ip:port;
 ...
}
server {
 listen 80;
 server_name localhost;
 
 location / {
   proxy_pass http://upstream的名字/;
 }
}

除了以上三种外,通过配置最少连接方式,也是可以更好达到负载均衡效果的方式。

least_conn(最少连接方式)

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。

#动态服务器组
upstream dynamic_server {
  least_conn;    #把请求转发给连接数较少的后端服务器
  server localhost:8080 weight=2;   #tomcat 7.0
  server localhost:8081;             #tomcat 8.0
  server localhost:8082 backup;       #tomcat 8.5
  server localhost:8083 max_fails=3 fail_timeout=20s;   #tomcat 9.0
}

注意:

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

小结一下

其中除了轮询和轮询权重外,都是Nginx根据不同的算法实现的。在实际运用中,需要根据不同的场景选择性运用,大都是多种策略结合使用以达到实际需求!

兄弟,你鞋废了吗,没鞋会,威哥再推荐一套Nginx的视频给你!

视频传送门:https://www.bilibili.com/video/BV1h54y177JL

今天的内容学会的同学留言:666

精选第一名,领取22年台历一本

点击【阅读原文】,开始学习nginx!