分布式环境中存在众多不确定因素,而Nginx作为核心代理服务器用于网络请求负载时,若出现宕机或无响应的情况,网页端请求会无法正常代理到后端应用,这会导致业务无法正常运转,因此需避免单点风险,实现高可用。
首先介绍Keepalived。Keepalived是用来做什么的?
Keepalived是一个高性能服务器的高可用或支持热备的解决方案,其主要特点是可以预防服务器单点故障的发生。Keepalived专门用于监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived会及时发现并将出现故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后续Keepalived又加入了VRRP的功能(虚拟路由冗余协议),用于解决静态路由的单点故障问题。通过VRRP可以实现网络不间断稳定运行,因此Keepalived一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。
Keepalived的两大核心功能包括健康检查和失败切换。所谓健康检查,就是采用TCP三次握手、icmp请求、HTTP请求等方式对负载均衡器后面的实际服务器(通常是承载真实业务的服务器)进行保活。失败切换主要是指应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,提高服务的稳定性。
1. VRRP实现原理
VRRP可以保证当主机的下一台路由出现故障时,由另一台路由器来代替出现故障的路由器进行工作。通过VRRP可以在网络发生故障时透明地进行设备切换而不影响主机之间的数据通信。VRRP包括以下几个部分:
1)虚拟路由器:虚拟路由器是VRRP备份组中所有路由器的集合,从备份组外面看备份组中的路由器,组中的所有路由器都一样,可以理解为在一个组中,主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才会回应接口的真实MAC地址。
2)主路由器:虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下,Master是由选举算法产生的,它拥有对外服务的虚拟IP,提供各种网络功能,如ARP请求、ICMP数据转发等。
3)备份路由器:虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受Master的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于Backup角色的备份路由器将重新进行选举,产生一个新的主路由器进入Master角色,继续提供对外服务,整个切换对用户来说是完全透明的。
VRRP路由器在运行过程中有以下状态:
注意
主路由器处于Master状态,备份路由器处于Backup状态。
VRRP使用选举机制来确定路由器的状态,具体优先级选举机制如下:
2. VRRP工作过程
根据优先级来确定主备角色,优先级高的路由器成为Master路由器,优先级低的成为Backup路由器。Master拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP报文,通知备份组内的其他设备自己工作正常。Backup路由器只接收Master发来的报文信息,用来监控Master的运行状态。当Master失效时,Backup路由器进行选举,优先级高的Backup将成为新的Master。
抢占方式下,当Backup路由器收到VRRP报文后,会将自己的优先级与报文中的优先级进行比较。如果Backup路由器的URRP报文大于通告报文中的优先级,则该路由器成为Master路由器;否则将保持Backup状态。
非抢占方式下,只要Master路由器没有出现故障,备份组中的路由器就会始终保持Master或Backup状态。Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器。
如果Backup路由器的定时器超时后仍未收到Master路由器发送来的VRRP报文,则认为Master路由器已经无法正常工作,此时Backup路由器会认为自己是Master路由器,并对外发送VRRP报文。备份组内的路由器根据优先级选举出Master路由器,并承担报文的转发功能。
利用Keepalived的VRRP,可实现Nginx的高可用。Nginx高可用结构如图4-12所示。
图4-12 Nginx高可用结构图
注意
使用Keepalived的VRRP来管理两台Nginx服务器,并虚拟出一个VIP(192.168.247.14),外界请求直接访问虚拟IP而不是真正的Nginx的IP。虚拟IP绑定的是Master,Backup服务器会和Master保持通信,并监听Master服务器的健康状态。当Master宕机或发生异常时,Master无法和Backup通信,Backup健康监听机制会认为Master已经宕机,从而将选举升级为Master,并把VIP绑定到自身,提供Master相应的功能。当之前宕机的主服务器恢复后,原服务器依然充当主服务器,而升级后的主服务器会降级到从服务器。