服务器集群负载均衡技术
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。
一个应用服务器只访问一个数据库集群。