高性能负载均衡

Posted 天堂1223

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高性能负载均衡相关的知识,希望对你有一定的参考价值。

2.0介绍

如今的网上的用户体验需要性能和时间。为了实现这样的功能,多个同样系统的副本正在运行,并且负载在这些复制品之间分发。随着负载的增加,另外一个系统的副本可以联机。这个架构技术被称为横向扩展。基于软件的基础设施由于其灵活性而日益流行,从而打开了一个巨大的可能性的世界。对应高可用来说,用例是小到一组两个,还是大到全球数千个,仍然需要一个与基础设施一样的动态的负载均衡解决方案。nginx以不同的方式解决了这个需求,例如HTTP,TCP和UDP负载均衡,在本文中,我们将学习到这些东西。
当进行负载均衡的时候,重要的是对客户端的影响只能是正面的。许多现在web架构采用无状态应用层,在共享内存或数据库中存储状态。然而,这多所有的并不是真实的。会话状态在交互式应用程序是非常有价值和广泛的。这个状态可能由于某些原因被存储到应用服务器的本地;例如,应用中正在工作的数据非常大以至于在性能上网络开销非常昂贵。当状态被本地存储到应用服务器中的时候,对用户体验方面来说,后面的请求继续分发到同一个服务器是至关重要的。另一方面便是服务器在会员结束之前,不能释放这些数据。在一定程度上与有状态的应用工作需要一个智能化的负载均衡器。Nginx Plus提供了多种方式通过根据cookies和路由来解决这个问题。本文介绍会话持久性,因为它与Nginx的负载均衡有关。

确保Nginx正在服务的应用是健康的是至关重要的。对于一些原因,应用失败了。举几个例子,这可能是因为网络连接,服务器错误,或者是应用错误。代理和负载均衡器一定是足够智能来检测上游服务器的故障并停止向其传递流量。否则,客户端将会等待,仅仅被传送了一个超时。当服务器发生故障的时候,缓解服务器降级的一种方式就是,让代理检查上游服务器的运行状况。Nginx提供了两种不同方式的健康检查:被动的,在开源版本中是可用的;主动的,仅仅在Nginx Plus中可用。在常规的时间间隔中,主动的健康检查将会创造一个连接或请求到上游服务器,并且可以验证响应是否是正确的。被动的健康检查是,当客户端进行请求或连接的时候,检测上游服务器的连接和响应。你可能想要使用被动的健康检查来降低你上游服务器的负载,你可能想要使用主动的健康检查,在客户端被服务到故障之前,先检测到上游服务器的故障。本文的结尾将会对您正在进行负载均衡的上游服务器的运行状况进行检查。

2.1 HTTP负载均衡

问题

你需要在两个或多个HTTP服务器之间分发负载。

解决

使用Nginx的HTTP模块,使用upstream块来对HTTP服务器之间进行负载均衡。


	upstream backend
		server 10.10.12.45:80		weight=1;
		server app.example.com:80	weight=2;
	
	server 
		location / 
			proxy_pass http://backend;
		
	

讨论

HTTP的upstream模块控制着HTTP的负载均衡。这个模块定义目标池-任何Uninx套接字,IP地址和DNS记录或一个混合的组合。upstream模块也定义了任何一个独立的请求如何被分配到上游服务器中。

每一个上游目的地被server指令定义到上游池中。server指令被提供一个Unix套接字,IP地址,或一个FQDN,还有一定数量的可选的参数。可选的参数通过请求的路由给了更多的控制。这个参数包括在均衡算法中服务器的权重;服务器在待机环境,可用还是不可用,如何判断服务器是否可用。Nginx Plus提供了一些其他方便的参数,例如到服务器的连接限制,高级的DNS解析控制,和在服务器启动之后,缓慢的将连接扩展到服务器的能力。

2.2 TCP负载均衡

问题

你需要在两个或多个TCP服务器之间分发负载。

解决方法

使用Nginx的stream模块,使用upstream块来对TCP服务器之间进行负载均衡。


	stream
		upstream  mysql_read
			server read1.example.com:3306 weight=5;
			server read2.example.com:3306;
			server 10.10.12.34:3306	backup;
		
	
		server
			listen 3306;
			proxy_pass mysql_read;
		
	

上述示例中的server块指导Nginx监听TCP的3306端口,并且在两个MySql数据库的读副本中进行负载均衡,并且列出了另外一个作为备份,如果最初选定的失败的话,将会传递流量。这个配置没有被放到conf.g文件夹中,因为这个文件夹是被包含在http块中的;相替代的,你应该创建两一个文件夹,名称为stream.conf.d,在nginx.conf文件中打开stream块,并且为流配置包含新的文件夹。

谈论

TCP的负载均衡是通过stream模块定义的。stream模块,和HTTP模块相似,允许你定义上游服务器池,并配置监听服务器。当配置一个服务器监听给定的端口的时候,你一定要定义他要监听的端口,或者是可选的,一个地址和一个端口。在那,一个目的地一定被配置了,无论他是到另外一个地址的反向代理,还是一个上游的资源池。

上游的TCP负载均衡很像上游的HTTP负载均衡,他定义了上游资源作为服务器,并配置了Unix套接字,IP或者是完全合格的域名称(FQDN),还有服务器权重,最大连接数量,DNS解析器和连接上升期;无论服务器在活跃状态,关闭状态还是备份状态。

Nginx Plus为TCP负载均衡提供了更多的特征。这个高级特征通过本系列可以看到。在后面的文章中,对所有负载均衡的健康检查将会讲到。

以上是关于高性能负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

干货 | Nginx负载均衡原理及配置实例

高性能负载均衡是如何架构的?

21 | 高性能负载均衡:算法

高可用keepalived

性能测试类型

Keepalived+Nginx实现负载均衡高可用