常见的服务器集群负载均衡技术:二三四七层负载均衡,DNS、LVS、F5、nginx负载均衡

服务器集群负载均衡技术

LB:load balance负载均衡器。有时也叫做director。

 

DNS负载均衡

DNS负载均衡,最基础的是轮询方式,循环返回不同的服务器IP地址。可以同时返回多个服务器IP地址,但是IP地址顺序在变化。用户会首先使用第一个IP地址进行访问。

现在有了改进版本。比如AWS Route53 。

DNS服务器可以检测服务器的状态。如果服务器故障了,不会告诉用户使用这个服务器。

DNS服务器可以按照权重返回DNS应答。

DNS服务器可以返回时延最小的那个服务器。

DNS服务器可以根据用户的IP地址,返回最近的服务器。

 

GSBL

在不同地域的机房间进行负载均衡的这个方法,叫全局负载均衡GSBL(Global Server Load Balancing)。所以不同的运营商返回的服务器IP不一样。

 

CDN

静态内容放在CDN服务上。CDN源服务器向分布在各地的CDN节点同步内容。客户使用最近的CDN节点获取内容。客户做域名解析时,DNS服务器根据客户的IP地址,将离它最近的CDN节点的IP地址返回给他。DNS服务器可以设置在CDN中,所以DNS服务器甚至知道CDN节点的负载情况,从而优先返回负载轻的CDN节点。每个ISP内部都设置CDN。

 

二层负载均衡

二层负载均衡器通过虚拟MAC地址接收请求,然后修改报文的目的MAC地址为上游服务器MAC地址。源IP和目的IP不变。负载均衡服务器和真实服务器共享同一个VIP。后续相同源IP的报文固定使用这个上游服务器。

应答不用经过负载均衡设备。

可以使用LVS(Linux Virtual Server) DR(直接路由)工作模式实现二层负载分担。

 

三层负载均衡

根据IP地址进行三层负载均衡。三层负载均衡设备通过一个虚拟的IP地址接收请求,然后修改DIP地址为上游服务器的IP地址。后续相同源IP的报文固定使用这个上游服务器。

因为前端的负载均衡设备了修改了报文的DIP,所以应答要仍然经过负载均衡设备,将应答的SIP转换成原来的IP。

四层、七层负载均衡器如果只修改IP地址。就可以理解为是三层负载均衡。

 

四层负载均衡

四层负载均衡就是根据IP地址、端口将报文转发到不同的上游服务器(不同IP地址+端口)。四层负载均衡设备通过一个虚拟的IP地址接收请求,然后修改DIP地址为上游服务器的IP地址。上游服务器可以使用IP地址进行标识。也可以让一组提供相同服务的服务器使用同一个IP地址,这个时候可以通过目的端口标识组中的不同服务器。也可以让所有服务器都是用同一个IP地址,那么也是通过目的端口标识不同服务器。可以根据源IP标识用户,相同的源IP使用相同的服务器。源端口不能作为用户标识,因为同一个用户同一个会话可能经历多个TCP连接,每次使用不同的源端口。

因为前端的负载均衡设备了修改了报文的IP地址和端口号,所以应答要仍然经过负载均衡设备。

可以使用LVS NAT模式、F5或者HaProxy实现四层负载均衡。通常四层负载均衡后的上游服务器是nginx。

 

七层负载均衡

七层负载均衡是根据IP地址、端口号和应用层报文中的字段如HTTP报文中的URL、主机名、session-id、language,转发报文到不同的上游服务器。URL代表不同的服务。主机名代表实际的服务器。Session-id表示应用层会话。一个应用层会话活动期间可以会有多个TCP会话。所以通过TCP会话不能代表应用层会话。不同语言的服务可以由不同的服务器来提供。

可以使用Nginx或者Haproxy实现七层负载均衡。其中,Haproxy也可以用来实现redis、mysql、rabbitmq和zookeeper的负载均衡。F5也支持根据session-id进行负载分担。

 

LVS

可以使用ldirectord、keepalived进行服务器健康检查。

LVS支持DR、NAT和TUN三种模式。

DR模式修改DMAC。服务器直接将应答返回给客户。应答不用经过LVS。要求LVS和服务器都在同一网段。服务器配置为不响应ARP请求。LVS和server都连在同一个二层交换机上。

DR模式的拓扑:

RT-----SW-----server

             |

           LVS

TUN模式是使用IP in IP隧道来实现的。将原始报文添加一个外层IP头部,DIP是实际服务器。实际服务器收到报文后,剥除外层头部,得到原始的IP报文。返回的应答不用经过负载均衡器。服务器需要支持IP in IP隧道,需要安装相关内核模块。缺点是网络开销增大。DR模式拓扑也适用于TUN模式。但是LVS和server之间可以存在3层设备。

NAT模式不仅要转换IP层的IP地址、传输层的端口号。还要需要转换应用层报文中的IP地址和端口号。NAT模式下应答也要经过LVS,使得LVS容易成为瓶颈。

NAT模式使用拓扑RT----LVS----SW----server。

 

F5硬件负载均衡器

F5是硬件负载均衡器。可以工作在4层或者7层。支持双机热备。支持服务器健康检查。

Performance L4 + DNAT:

按照纯四层的方式处理数据包,只看源IP、源端口、目的IP和目的端口。数据包到达F5后,只改变目的IP和目的端口为后端服务器地址和端口进行转发。

后端操作:默认网关需要指向F5。返回的数据要经过F5。

Performance L4 + SNAT + DNAT:

F5按照纯四层的方式处理数据包,只看源IP、源端口、目的IP和目的端口。F5转发数据包时,改变源IP地址为为F5的VIP,同时也改变目的IP为后端地址和端口进行转发。返回的数据要经过F5。

后端操作:不需要任何操作。

standard + DNAT:

与Performance L4 + DNAT的不同是需要打断TCP连接。能够对应用层内容中的IP地址和端口号进行修改。但是性能降低。返回的数据要经过F5。

standard + SNAT + DNAT,与Performance L4 + SNAT + DNAT的不同是需要打断TCP连接。能够对应用层内容中的IP地址和端口号进行修改。但是性能降低。返回的数据要经过F5。

 

Nginx负载均衡:

按照轮询或者权重来分配负载。使用ip_hash选项让每个源IP定向到同一个服务器,解决session问题。使用url_hash选项让每个url定向到同一个后端服务器,使得后端服务器的缓存更加有效。使用fair选项,则nginx会考虑后端服务器的响应速度,给他们分配负载。

 

一般性话题

负载均衡器对服务器进行心跳检查,摘除故障服务器。

比如使用nginx进行负载均衡时,可以使用Consul将upstream server动态注册到nginx,从而实现upstream服务器的自动发现。Consul支持服务注册、服务发现。支持TCP、HTTP健康检查,自动摘除有故障的服务器。使用HTTP长轮询实现触发更新。支持优先消费本机房的服务。使用raft算法实现集群数据一致性。

不管是哪一种负载均衡,都要尽量不要打断用户层会话。

 

典型使用方式

使用F5/LVS进行四层负载均衡到nginx服务器,然后再由Nginx/Haproxy服务器七层负载均衡到tomcat。

 

一个应用服务器只访问一个数据库集群。

上一篇:Vscode 设置Python3 为默认调试运行环境 方法


下一篇:Python和Sublime的整合