高性能负载均衡2

Posted 天堂1223

tags:

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

2.3 UDP负载均衡

问题

你需要在两个或多个UDP服务器之间进行负载均衡。

解决方法

在UDP服务器之间使用nginxstream模块进行负载均衡,使用被定义为udp的upstream块。


	stream
		upstream ntp 
			server ntp1.example.com:123	weight=2;
			server ntp2.example.com:123;
		

		server 
			listen 123 udp;
			proxy_pass ntp;
		
	

这个配置块使用UDP协议在两个上行的NTP(Network Time Protocol)服务器之间进行负载均衡。指定UDP的负载均衡只需要直接使用udp参数设置在listen上。

如果你要负载均衡的服务需要在客户端和服务器之间来回发送多个数据包,你可以指定reuseport参数。这种服务的例子有OpenVPN,Voice over Internet Protocol(VoIP),虚拟桌面解决方案和数据传输层安全性(DTLS)。下列是使用Nginx来处理OpenVPN连接,并将他们代理到本地运行的OpenVPN服务的例子:


	stream 
		server 
			listen 1195 udp reuseport;
			proxy_pass 127.0.0.1:1194
		
	

讨论

你可能会问,“为什么我需要一个负载均衡器,并且什么时候我可以在DNS A或SRV记录中拥有多个主机?”,答案就是,不仅仅我们有可选的均衡算法,而且我们可以通过DNS服务器本身进行负载均衡。UDP服务组成了很多我们在网络系统中依赖的服务,例如,DNS,NTP和VoIP。UDP负载均衡对一些人来说并不常见,但是在规模上也同样有用。

你可以在stream模块中找到UDP负载均衡,就像TCP,大多数是以相同的方式配置的。主要的不同是listen指令指定开放套接字是用于处理数据报的。当处理数据报的时候, 有一些可用的在TCP中没有的其他指令,例如proxy_response指令,该指令用于指定Nginx有多少预期的响应从上游服务器中发来的。默认情况下,直到proxy_timeout限制到达之前,这是没有限制的。

reuseport参数指导Nginx为每一个工作进程创建一个独立的监听套接字。这允许内核在工作进程之间分发进入的连接,来处理客户端和服务器之间发送的多个数据包。reuseport特点仅仅工作在Linux内核3.9和更高版本,DragonFly BSD,FreeBSD 12和更多版本。

2.4 负载均衡方法

问题

循环制负载均衡不符合你的实例,因为你有异构的工作负载或服务器池。

解决方法

使用某一个Nginx的负载均衡方法,例如最少连接,最短时间,通用哈希,IP哈希或随机算法:


	upstream backend 
		least_conn;
		server backend.example.com;
		server backend1.example.com;
	

这个示例将后端上游池的负载均衡算法设置为最小连接。所有的负载均衡算法,带有异常的泛型哈希,随机,和最少时间算法都是单独的指令,例如前面的例子。这些指令的参数将会在下面的讨论中解释。

讨论

不是所有的请求或数据包带有相同的权重。例如,循环算法或者是在之前例子中使用的带权重的循环算法,将不会适用所有的应用或交通流。Nginx提供多个负载均衡算法,你可以使用他们来适用特殊的用例。除了能够选择这些负载均衡算法或方法,你也可以配置他们。下述的负载均衡方法在上游HTTP,TCP和UDP池中都是可用的。

循环算法

这是默认的负载均衡算法,该方法将会在上游池中的服务器的顺序分发请求。你也可以在带有权重的循环算法中考虑使用权重,如果上游服务器的容量不同,你可以使用该算法。权重的整型数值越高,在循环制算法中更喜欢该服务器。权重背后的算法只是加权平均数的统计概率。

最少连接

该方法通过代理当前请求到拥有最少开放连接的上游服务器来进行负载均衡的。最少连接,类似于循环制,当决定哪一个服务器发送连接的时候,也把权重引入计算。他的指令的名称为least_conn

最短时间

该算法仅仅在Nginx Plus中存在,最短时间与最少连接是相似的,他将当前连接代理到拥有最少平均反应时间的上游服务器。该算法是最复杂的负载均衡算法之一,并且满足高性能Web服务器的需求。该算法是最小连接的增值,因为小数量的连接并不能代表最快的响应。参数headerlast_byte在这个指令中必须要指定。当header被指定的时候,接收到响应头的时间被使用,当last_byte被指定的时候,接收全部响应的时间被使用。该指令的名称为least_time

泛型哈希

管理员使用给定的文本,请求或运行时或两者都存在的变量定义一个哈希值。Ngxin通过为当前请求产生一个哈希,并将他放到上游服务器上,来进行负载均衡。当你需要对请求被发送到哪里,或决定哪一个上游服务器最有可能有数据缓存有更多控制的时候,该方式是非常有用的。注意,当一个服务器从池中被添加或被移除的时候,哈希请求将会重新被分发。该方法有一个可选的参数,consistent,来最小化重新分发的影响。该指令的名称为hash

随机算法

该方法用于指导Nginx从服务器组中选择一个随机的服务器,并将服务器权重考虑进去。可选的two参数知道Nginx随机选择两个服务器,并使用提供的负载均衡方法来在这两个服务器之间进行负载均衡。默认情况下,如果two不携带方法被传递的话,least_con方法被使用。用于随机负载均衡的指令名称为"random"。

IP哈希

该方法仅仅工作于HTTP。IP哈希使用客户端IP地址作为哈希。轻微不同于在泛型哈希中的使用远程变量,该算法使用IPv4地址的前三个八位字节和整个IPv6地址。该方法需要确定客户端被代理到相同的上游服务器并且服务器是可用的,当会话状态收到关注并且没有被应用的共享内存被处理的时候,该算法是相当有用的。当分发哈希的时候,该方法也采用weight参数。该指令的名称为ip_hash

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

Dubbo加权轮询负载均衡的源码和Bug,了解一下?

负载均衡算法

负载均衡-2.Haproxy

Nginx的负载均衡

平滑的加权轮询均衡算法

Nginx——nginx作为负载均衡服务(轮询策略与加权轮询)