likes
comments
collection
share

Nginx负载均衡

作者站长头像
站长
· 阅读数 22

今天的话题,咱们来聊一聊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_hash:基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上。 

现在咱们来分别对轮询,权重,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根据不同的算法实现的。在实际运用中,需要根据不同的场景选择性运用,大都是多种策略结合使用以达到实际需求,兄弟,你鞋废了吗,没鞋会,可以再私聊V哥帮你定位下问题。

转载自:https://juejin.cn/post/7390335243897651251
评论
请登录