SLB负载均衡和DNS协议
SLB 负载均衡
负载均衡(Server Load Balancer,下文简称 SLB)的引入,可以降低单台云服务器 ECS(下文简称 ECS)出现异常时对业务的冲击,提升业务的可用性。同时,结合弹性伸缩服务,通过动态调整后端服务器,可以快速对业务进行弹性调整(扩容或缩容),以快速应对业务的发展。
负载均衡原理
**负载均衡CLB(Classic Load Balancer)**是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。负载均衡扩展了应用的服务能力,增强了应用的可用性。
负载均衡通过设置虚拟服务地址,将添加的同一地域的多台ECS实例虚拟成一个高性能和高可用的后端服务池,并根据转发规则,将来自客户端的请求分发给后端服务器池中的ECS实例。
负载均衡默认检查云服务器池中的ECS实例的健康状态,自动隔离异常状态的ECS实例,消除了单台ECS实例的单点故障,提高了应用的整体服务能力。此外,负载均衡还具备抗DDoS攻击的能力,增强了应用服务的防护能力。
负载均衡的组成
- 负载均衡实例 (Instances):一个负载均衡实例是一个运行的负载均衡服务,用来接收流量并将其转发给后端服务器,至少添加一个监听(Listeners)和两台ECS实例。
- 监听(Listeners):监听客户端的请求并将其转发给后端服务器,监听也会对后端服务器进行健康检查。
- 后端服务器(Backend Servers):后端服务器是一组接收前端请求的ECS实例,可以单独添加ECS实例到后端服务器池;
健康检测
负载均衡通过健康检测来判断后端服务器(ECS实例)的业务可用性。健康检查机制提高了前端业务整体可用性,避免了后端ECS异常对总体服务的影响。
开启健康检测时,当后端某台ECS健康检测出现异常时,负载均衡会自动将新的请求转发到其他健康检测正常的ECS上;当ECS恢复正常运行时,负载均会会将其自动恢复到负载均衡服务中。
负载均衡在用集群部署,LVS集群或者Tengine集群内相关的节点服务器同时承载着数据转发和健康检测的职责。
Ps:
-
LVS集群:Linux Virtual Server,可以实现LINUX平台下的简单负载均衡,LVS采用三层结构:负载调度器、服务器池、共享存储。
-
Tengine集群:Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性;
HTTP/HTTPS监听健康检查机制
针对七层(HTTP或HTTPS协议)监听,健康检查通过HTTP HEAD探测来获取状态信息;
检查机制如下:
- Tengine节点服务器根据监听的健康检测配置,像后端的向后端ECS的内网IP+【健康检查端口】+【检查路径】发送HTTP HEAD请求(包含设置的【域名】);
- 后端ECS收到请求后,根据相应服务的运行情况,返回HTTP状态码;
- 如果在【响应超时时间】之内,Tengine节点服务器没有收到后端ECS返回的信息,则认为服务无响应,判定健康检查失败;
- 如果在【响应超时时间】之内,Tengine节点服务器成功接收到后端ECS返回的信息,则将该返回信息与配置的状态码进行比对。如果匹配则判定健康检查成功,反之则判定健康检查失败;
健康检测中域名的设置
当使用HTTP方式进行健康检查时,可以设置健康检查的域名,但并非强制选项。因为有些应用服务器会对请求中的host字段做校验,即要求请求头中必须存在host字段。如果在健康检查中配置了域名,则SLB会将域名配置到host字段中去,反之,如果没有配置域名,SLB则不会在请求中附带host字段,因此健康检查请求就会被服务器拒绝,可能导致健康检查失败。综上原因,如果您的应用服务器需要校验请求的host字段,那么则需要配置相关的域名,确保健康检查正常工作。
TCP监听健康检查机制
针对四层TCP监听,为了提高健康检查效率,健康检查通过定制的TCP探测来获取状态信息:
1、SLB服务器根据监听的健康检查配置,向后端ECS的内网IP+【健康检查端口】发送TCP SYN数据包;
2、后端ECS收到请求后,如果相应端口正在正常监听,则会返回SYN+ACK数据包;
3、如果在【响应超时时间】之内,LVS节点服务器没有收到后端ECS返回的数据包,则认为服务无响应,判定健康检查失败;并向后端ECS发送RST数据包中断TCP连接;
4、在【响应超时时间】之内,LVS节点服务器成功收到后端ECS返回的数据包,则认为服务正常运行,判定健康检查成功,而后向后端ECS发送RST数据包中断TCP连接;
健康检查状态对请求转发的影响如下:
- 如果目标ECS的健康检查失败,新的请求不会再分发到相应ECS上,所以对前端访问没有影响;
- 如果目标ECS的健康检查成功,新的请求会分发到该ECS上,前端访问正常;
- 如果目标ECS存在异常,正处于健康检查失败时间窗,而健康检查还未达到检查失败判定次数(默认为三次),则相应请求还是会被分发到该ECS,进而导致前端访问请求失败;
业务流程如下所示:
网络流量路径说明
传统型负载均衡CLB作为流量转发服务,将来自客户端的请求通过CLB集群转发至后端服务器,后端服务器再将响应通过内网返回给CLB。
入网流量路径
1、TCP/UDP协议和HTTP/HTTPS协议的流量都需要经过LVS集群进行转发;
2、LVS集群内的每一台节点服务器均匀地分配海量访问请求,并且每一台节点服务器之间都有会话同步策略,以保证高可用;
- 如果相应的CLB实例服务端口使用的是四层协议(TCP或UDP),那么LVS集群内每个节点都会根据CLB实例的策略,将其承载的服务请求按策略直接分发到后端ECS服务器;
- 如果相应的CLB实例服务端口使用的是七层HTTP协议,那么LVS集群内每个节点会先将其承载的服务请求均分到Tengine集群,Tengine集群内的每个节点再根据CLB策略,将服务请求按策略最终分发到后端ECS服务器;