Nginx 负载均衡

2020-09-28 14:53:18 浏览数 (1)

1.1 什么是负载均衡

  负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡(Load Balance)其意思就是分摊到多个操作单元上进行执行。   我们在日常生活中经常免不了要去一些比较拥挤的地方,比如地铁站、火车站、电影院、银行等。无论是买票,还是排队入场,这些场所一般都会设置多个服务点或者入口的。如果没有人引导的话,大多数情况下,最近的入口会挤满人。而哪些距离较远的服务点或者入口就宽松很多。这种情况下,就会大大浪费资源,因为如果可以把这些排队的人很好的分散到各个入口的话会大大缩短排队时间。其实,网站的建设也是一样的。为了提升网站的服务能力,很多网站采用集群部署,就像话剧院有多个入口一样。这时候,就需要一个协调者,来均衡的分配这些用户的请求,可以让用户的可以均匀的分派到不同的服务器上。

1.2 Nginx 实现负载均衡

  Nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块,upstream 模块应该放于 http 模块内。Nginx 负载均衡策略主要有 热备、轮询、加权轮询、最少连接数以及 IP Hash。我们先来看看 upstream 怎么用。

代码语言:javascript复制
http {
	upstream myserver { 
		server  http://47.103.4.205:3333;
		server  http://47.103.4.206:3333;
	}
	
	server {
		location / {         
		 	proxy_pass  myserver;    
		}   
	}
}

1.2.1 热备

  如果有 2 台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。即有 A、B 两台服务器,正常情况都是 A 在工作,当 A 猝死,B 开始工作。

代码语言:javascript复制
upstream myserver { 
	server  http://47.103.4.205:3333;
	// 备用需要加 backup
	server  http://47.103.4.206:3333 backup;
}

1.2.2 轮询

  Nginx 默认就是轮询其权重都默认为 1,服务器处理请求就转圈来。即有 A、B、C 三台服务器,轮询状态 ABCABCABC 转圈工作。

代码语言:javascript复制
upstream myserver { 
	server  http://47.103.4.205:3333;
	server  http://47.103.4.206:3333;
	server  http://47.103.4.207:3333;
}

1.2.3 加权轮询

  跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置则变为轮询。即有 A、B 两台服务器,A 的权重是 1,B 的权重是 2,则 A 工作一次,B 工作两次,ABBABB。

代码语言:javascript复制
upstream myserver { 
	server  http://47.103.4.205:3333  weight=1;
	server  http://47.103.4.206:3333  weight=2;
}

1.2.4 ip_hash

  Nginx 会对客户端请求的 ip 进行 hash 操作,然后根据 hash 结果将同一个客户端 ip 的请求分发给同一台服务器进行处理。采用这种方式的原因是,当你服务端的一个特定 url 路径被同一个用户连续访问时,如果负载均衡策略还是轮询的话,那该用户的多次访问会被打到各台服务器上,这显然并不高效(会建立多次http链接等问题)。甚至考虑一种极端情况,用户需要分片上传文件到服务器下,然后再由服务器将分片合并,这时如果用户的请求到达了不同的服务器,那么分片将存储于不同的服务器目录中,导致无法将分片合并。采用 Nginx 提供的 ip_hash 策略。既能满足每个用户请求到同一台服务器,又能满足不同用户之间负载均衡。

代码语言:javascript复制
upstream myserver { 
	server  http://47.103.4.205:3333;
	server  http://47.103.4.206:3333;
	ip_hash;
}

1.2.5 参数

down:表示当前的 server 暂时不参与负载均衡。 backup:预留的备份机。当其他所有的非 backup 机出现故障或者忙的时,才会请求 backup 机,因此这台机器的压力最轻。 max_fails:允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。 fail_timeout:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。

0 人点赞