第四章 负载均衡网络设计

到目前为止,我们已经详细讨论了使用负载均衡器来提高服务器群可扩展性、可用性、可管理性的几种功能和特性。本章我们主要讨论负载均衡器部署的问题,讨论在现有的网络中部署负载均衡器的几种方案。我们还将讨论如何设计高可用的方案,以实现整个网络中不同网络组件的容错处理,包括负载均衡器在内。
在讨论网络结构之前,我们需要了解一些基本概念。首先讨论是否把负载均衡器当作二层交换机或三层路由器来使用,这在网络设计中是非常关键的。然后从不涉及到高可用性的简单的网络结构入手,延伸到负载均衡器如何实现双机的高可用性,并将讨论不同的高可用性设计和必需的条件。本章将详细描述网络结构由简单到复杂的变化过程,而不只是提供一个特定的网络设计方案。
4.1把负载均衡当作二层交换机还是三层路由器
交换机的基本功能就是在接收端口接收数据包,选择输出端口并将数据包发送出去。如何选择输出端口取决于交换机的具体类型。
二层交换机利用数据链路层的MAC地址来决定数据包的输出端口。三层交换机,也就是路由器,利用网络层的信息来决定数据包的输出端口。当采用IP协议时,三层交换机利用数据包中的IP地址来决定数据包的输出端口。
客户端和服务器,通常被称为主机,会把管理员提供的路由器的IP地址设置为缺省网关。当给不同网段的IP地址发送数据包时,主机会把数据包发送给缺省网关。路有器作为缺省网关会利用路由协议根据数据包的IP地址来决定如何转发数据包。
负载均衡器一般在四层或者四层以上工作,这取决于我们使用的功能特性。当接收到目地址是VIP并以负载均衡器的MAC地址为其目的MAC地址的数据包后,负载均衡器根据数据包中四层以上的信息实现负载均衡功能。通过利用数据包中的信息和服务器健康检查的结果以及服务器负载的状态,负载均衡器选择一台真实的服务器来提供服务,并将请求转发到这台服务器。同时负载均衡器会修改数据包中的相关信息,例如目的IP地址、TCP或者UDP端口号码。修改数据包之后,负载均衡器需要确定输出端口并发送这个数据包,负载均衡器可以象二层交换机或路由器那样转发数据包。
负载均衡器只对特定的数据包提供四层以上的交换,那就是以VIP为目的地址并有相应服务器回应的数据包。所有其他的数据包均在二层或三层交换,这取决于负载均衡器的配置。
图4.1是负载均衡器在二层工作模式下数据包转发和IP寻址的过程。服务器和负载均衡器的缺省网关都指向路由器。所有的服务器都在同一个网段内,这样,服务器之间可以通过负载均衡器直接通讯,而不需要经过路由器。需要注意的一点是,从服务器端返回的数据包的目的MAC地址是M1,即路由器的MAC地址。但是由于服务器采用公网IP地址,无法节省IP地址资源,所以这种方案没有吸引力。这样也无法防止用户直接访问服务器,除非在路由器或负载均衡器上设置访问控制列表。可以让服务器使用私网IP地址,但是这样就有需要在路由器同一个接口上面配置两个网段。负载均衡器使用公网IP地址在一个网段,服务器使用私网IP地址在另外一个网段。我们需要在路由器跟负载均衡器相连的接口上定义两个IP地址:一个IP地址在VIP的网段,而另外一个IP地址在服务器的网段。有些负载均衡产品提供一些特殊的功能,可以避免在路由器接口上设置多个IP地址。
图4.1 不启用路由的负载均衡器部署方式
服务器的缺省网关指向负载均衡器时,数据包的流程和IP寻址过程如图4.2所示,负载均衡器象路由器一样转发数据包。缺省网关的地址为:10.10.10.1,定义在负载均衡器连接服务器的接口上。本文中使用网关IP来表示服务器缺省网关的IP地址。
图4.2 负载均衡器作为路由器的部署方式
因为缺省网关指向负载均衡器,服务器回应的数据包的目的MAC地址是M2,也就是负载均衡器的MAC地址,如图4.2所示。
有人会问,为什么不用VIP来做服务器的缺省网关?当然可以,但是可能会有多个VIP,每个VIP为不同的客户和应用提供服务,而服务器的缺省网关只能有一个。所以,采用单独的IP地址作为缺省网关,跟VIP地址分开是比较合理的。另外,网关IP地址必须与服务器在同一网段。如果服务器分布在不同的网段,每个网段都需要定义一个缺省网关。所以,把VIP和缺省网关分开会比较方便。
路由和交换功能跟整个负载均衡功能是分开的,路由和交换功能就是根据IP地址或者MAC地址来决定下一跳和输出端口,而负载均衡功能在OSI模型中的更高层工作。如果真实服务器和负载均衡器在同一个网段或者广播域,负载均衡器可以通过第二层交换把数据包发送到真实服务器上。如果服务器和负载均衡器不在同一个广播域,如何转发数据包就取决于负载均衡器是在二层工作还是在三层工作。如果负载均衡器是一个三层交换机,它会根据路由表来决定下一跳的地址。如果负载均衡器是一个第二层交换机,负载均衡器会把数据包发送到缺省网关,由缺省网关把数据包路由到真实的服务器。
如果负载均衡器是以三层路由器的方式进行工作,还有一个好处,服务器可以把缺省网关指向负载均衡器。这样就保证了在特定的网络环境中服务器回应的数据经过负载均衡器,例如单臂网络环境中,如图2.13。我们接下来要讨论的一些网络设计中会用到这种功能。另外,负载均衡器能够对外部交换机和路由器隐藏服务器的私有IP地址。如果服务器在不同的网段,它们可以通过负载均衡器互相通信。不过,负载均衡器以三层路由的方式进行工作时,在配置和管理上要比二层工作方式稍微复杂一点。通常,只要求负载均衡器进行简单的路由,不会运行BGP之类复杂的路由协议。
在本章的后续部分,假定负载均衡器以三层路由的方式进行工作,所以服务器的缺省网关都指向负载均衡器。
4.2简单的网络设计
接下来讨论最简单的部署负载均衡器的网络设计,然后由简单到复杂,一直到高可用的网络结构设计。
最简单的设计方案如图4.1和4.2所示,服务器是直接连接在负载均衡器上。服务器通常使用100M线路连接到负载均衡器,而负载均衡器则通过100M或者1000M线路连接路由器。服务器也可通过千兆线路连接到负载均衡器,而负载均衡器通过两个或者多个千兆线路连接到路由器。这种设计受限于负载均衡器的端口密度,能够连接的服务器的数量有限。不同厂家负载均衡器产品的端口密度都不一样,每端口的价格要比三层交换机或者二层交换机高很多。因此,大多数客户都通过二层交换机扩展端口,服务器通过二层交换机连接至负载均衡器,如图4.3所示。
图4.3 服务器通过2层交换机连接
在图4.3所示的方案设计中,所有访问服务器的流量都会经过负载均衡器。如果同一台交换机上面有些服务器的应用系统不需要负载均衡怎么办?在这个方案中,即使是此类流量也会经过负载均衡器。不同的负载均衡产品,其架构、性能都会有所不同,因此可能会遇到性能瓶颈的问题。如果要避免不必要的流量经过负载均衡器,可以使用单臂结构,如图4.4所示,这种结构在第二章服务器直接返回(DSR)中曾经讨论过。在实际环境中经常使用这种结构,可以获得更好的性能和吞吐量,对某些特殊应用可以避免NAT。在单臂结构中,负载均衡器像一只手臂一样连接到交换机。需要进行负载均衡的服务器配置私有IP地址,不需要负载均衡的服务器使用公网IP地址,网关指向路由器:141.149.65.1,只有访问VIP的流量才进入负载均衡器。
图4.4 单臂结构
在图4.4所示的网络结构中,如果服务器的网关指向路由器,由于数据包的目的地址是客户端的IP地址,所以服务器RS1和RS2返回的流量不经过负载均衡器,导致请求失败。有三种方法可以解决这个问题,第一种就是使用DSR的模式,还能够获得更高的吞吐,对于FTP或者流媒体的应用还能够避免NAT,但是必须把服务器的Loopback地址配置成VIP的地址。第二,可以在负载均衡器上面配置源地址的NAT,强制返回的流量经过负载均衡器。第三,服务器RS1和RS2的缺省网关指向负载均衡器上面的地址:10.10.10.1。
4.3 高可用的设计
如果一台服务器出现故障,负载均衡器可以通过健康检查发现并把流量导向其他的服务器。但是如果负载均衡器出现故障该怎么办呢?在本节,我们会讨论几种高可用的网络结构设计,允许故障的发生,包括负载均衡器在内。
负载均衡器可以两台一起工作,有两种工作方式:主-备模式或者主-主模式。当以主-备模式工作时,一台负载均衡器作为备用,而另外一台处于工作状态,完成所有的负载均衡工作。当以主-主模式工作时,两台负载均衡器都在工作,互相作为对方的备份。使用两台设备进行容错在网络中并不是一个新的概念,RFC2338定义的虚拟路由冗余协议(VRRP)可以让两台或者更多的路由器互相之间提供备份的功能。在负载均衡器的高可用结构设计类似VRRP的概念,但是会有些不同,我们会在后续部分进行讨论。
4.3.1 主-备模式
顾名思义,主备的配置就是让两台负载均衡器在主-备模式下进行工作,如图4.5所示:
图4.5 主-备模式
在这个例子中,顶端放置一台路由器,在底部放置一台二层交换机连接所有的服务器。路由器和交换机都存在单点故障,后面我们再讨论这个问题。现在,我们看一下负载均衡器在主-备模式下是如何工作的。假定左侧的负载均衡器为主设备,对所有的请求进行负载均衡。备机不响应任何请求,不处理任何流量。主设备控制VIP,负责响应所有的ARP请求。通过响应ARP请求,广播自己的MAC地址,路由器和服务器能够识别到VIP,并把MAC地址绑定到跟主负载均衡器相连的网卡。由于VIP是一个虚拟的地址,负载均衡器通常会构造一个MAC地址。MAC地址长度为六个字节,前三个字节表示硬件制造厂商,后三个字节是厂商定义的序列号。如果第一个字节为02则表示该MAC地址是自己生成的,只具有本地意义。有一点需要注意,除了VIP地址之外,负载均衡器还有一个管理地址,用来配置和管理负载均衡器。比如我们需要通过Telnet访问负载均衡器,就需要用到管理地址。负载均衡器用自己的MAC地址跟管理地址绑定。尽管备用设备不控制VIP,它同样会响应自己管理地址的ARP请求。
哪一台设备作为备用设备还是主设备,取决于初始配置或者两台负载均衡器之间的协议。例如使用VRRP时,每台路由器都配置一个权重或者优先级,优先级高的路由器作为主设备。
主设备和备用设备之间用一根专用的线路连接起来,使用一种特殊的协议检查对方的健康状况。负载均衡器一般都使用专用的线路进行健康检查,这条线路上面不会传输其他数据。在主备模式下,禁止在这条线路上面转发数据包,防止因二层转发造成环路。如果这个专用线路出现故障,负载均衡器必须尝试使用其他备用线路互相进行健康检查。在图4.5中,负载均衡器可以使用上面通过路由器互联的线路或者下面通过二层交换机互联的线路跟对方通信。有些负载均衡器可以用两个或者更多的线路配置端口捆绑(Trunk Group),作为专用线路。端口捆绑能够在组里面任意一条线路出现故障的情况下,使用其他正常线路进行通信。在图4.5中的方案设计中,负载均衡器可以通过路由器或者二层交换机之间的线路到达对方,为什么还需要专用的线路呢?当路由器或者二层交换机之间的线路出现拥塞的时候,可能会丢包。负载均衡器之间专用的线路能够提供可靠的通信,并在发生故障时能够快速检测出来。
如果主设备出现故障,备用设备会检测到故障,并立即接管所有服务。许多负载均衡器都能在一秒钟之内检测到故障,发生切换。在切换的过程中,备用设备会把所有VIP地址广播成自己的MAC地址。这会导致图4.5中所示的路由器和二层交换机立即更新VIP对应的MAC地址,并学习到这个MAC是在跟备用设备相连的另外一个接口上面。由于服务器都通过二层交换机连接到负载均衡器,所以不会感觉到什么异常。
如果负载均衡器同时还作为路由器使用,并且服务器的网关指向负载均衡器。当发生切换时,备机必须同时接管网关地址保证服务器能够访问到缺省网关地址。如果负载均衡器只工作在二层,不负责三层转发,服务器则把顶端的路由器作为缺省网关。
除了管理地址和其他主备的设置之外,两台设备的配置必须一样。配置发生改变时,有些负载均衡产品可以自动把配置从主设备同步到备用设备上面。这样能够保证主备设备之间的配置保持一致。
当备用设备接管时,为了快速开始负载分发它必须全面了解服务器的健康状况。因此,备用设备必须持续进行服务器的健康检查准备随时接管服务。当备用设备接管服务时,如果它没有会话信息,所有已经建立的连接都会被中断。为了避免这种情况出现,负载均衡器必须支持有状态切换,后面会有详细介绍。
很多条件都会触发主设备切换,最直接的一个就是主设备发生故障。如果路由器和主设备之间的链路出现故障,主设备就不能继续提供VIP的服务了,因此必须切换到备用设备。同样,如果负载均衡器失去了跟二层交换机之间的连接,如图4.5中所示,负载均衡器就不能跟服务器进行通信,也必须切换到备机。总之,为了保证主设备能够正常工作,它自己必须是健康的,并且能够跟上端路由器和下面的交换机正常通信。
由于服务器通过二层交换机连接到主设备和备用设备,它能够被主设备和备用设备同时访问。我们在考虑负载均衡器的高可用性时,路由器和二层交换机仍然存在单点故障。如果路由器发生故障,我们就完全失去了Internet连接。如果二层交换机出现故障,所有的服务器都无法访问。我们将在本章的后续部分讨论这个问题,接下来,我们看一下主-主模式是如何工作的。
4.3.2 主-主模式
使用主备配置,虽然能实现高可用性,然而备用设备一直处于空闲状态除非主设备发生故障。在主-主配置中,两台负载均衡器同时工作并互为备份。由于两台设备同时工作,我们可以得到更高的负载均衡性能。如果一台设备出现故障,另外一台会接管所有的工作。
是否支持主-主工作模式及其工作原理都因产品而异。有两种不同的主-主工作方式,第一种需要配置多个VIP。如图4.6所示,两个VIP:VIP1和VIP2。在负载均衡器1上面,VIP1处于主用状态,而VIP2处于备用状态,在负载均衡器2上面,VIP2处于主用状态,VIP1处于备用状态。如果负载均衡器1出现故障,跟主-备模式一样,负载均衡器2会接管VIP1,同时提供VIP1和VIP2的服务。如果负载均衡器2出现故障,负载均衡器1会接管VIP2,并同时提供两个VIP的服务。现在,我们必须找到一个方法把客户端的请求分发到两个VIP上面,也就是两个负载均衡器上面。我们可以使用DNS来解决这个问题,把域名同时解析到两个VIP上面,使用轮循的方式,这样两个VIP就都能收到请求了。另外一种实现方式是每个VIP都是不同的应用。例如:HTTP应用使用VIP1,FTP应用使用VIP2,用这种方式把请求分发到两台负载均衡器上面。
图4.6 主-主模式是如何工作的
先来看DNS轮循的方式。把VIP绑定到相同的真实服务器,并且每个负载均衡器都有一个不同的网关地址。由于每个服务器上面只能配置一个缺省网关,如果把所有服务器的缺省网关都设置为网关IP1,那么所有返回的流量都会回到负载均衡器1而不管是哪个负载均衡器处理的请求。解决上述问题,第一种方法就是使用源地址的NAT强制返回的数据包返回到正确的负载均衡器,或者使用DSR使用非对称的数据流向。另外一种方法就是不同的VIP绑定不同的真实服务器。比如把VIP1绑定到RS1和RS2,VIP2绑定到RS3和RS4。同时把RS1和RS2的缺省网关指向网关IP1,RS3和RS4的缺省网关指向网关IP2。这样我们就把服务器分成两组,每个负载均衡器负责一组。所有服务器返回的流量都会回到正确的负载均衡器,从而避免使用源地址的NAT或者DSR。如果负载均衡器1出现故障,负载均衡器2回接管VIP1的服务,同时接管网关IP1。
另外一种主-主模式的实现方式是两个负载均衡器之间共享相同的VIP。这种实现方式,两台设备都能提供VIP的服务,但任意时刻一个VIP只能由一台设备提供服务。只有控制VIP的设备才响应ARP请求,但是无论哪一台设备先收到这个VIP的数据包,都会进行处理。所以,在图4.6所示的方案设计中,所有的VIP1的请求都会到负载均衡器1,因为只有负载均衡器1才响应VIP1的ARP请求。同样,所有VIP2的请求都会先到负载均衡器2。但是如果两台负载均衡器都能够提供任意一个VIP的服务,我们可以把一半服务器的缺省网关指向负载均衡器1,把另一半服务器的网关指向负载均衡器2。这样返回的流量就能够在两台负载均衡器之间分发。
为了能同时提供两个VIP的服务,每台负载均衡器都必须知道所有的会话。因此,负载均衡器必须连续不断的同步会话信息保证针对一个特定会话有相同的负载分发策略和会话保持。同样,服务器返回的数据包会到达并穿过任意一个负载均衡器,除非服务器直接连接到负载均衡器上面。每台负载均衡器必须执行一致的NAT和任意其他返回数据包的处理。两台负载均衡器都使用相同的VIP有其优点,那就是不用担心数据包是如何返回的。因此,我们不必考虑是否需要使用DSR或者源地址NAT。当需要进行延时绑定处理时,在两台负载均衡器上面共享VIP是非常困难的。由于每个数据包都需要修改序列号,负载均衡器必须同步每个数据包的相关信息。大多数负载均衡器在主-主模式下工作时,支持不同设备提供不同的VIP的服务,只有极少数设备支持两台设备共用VIP。因此,本章后续部分我们只讨论不同设备提供不同VIP服务的情况。
使用主-主模式时,两台负载均衡器之间可能会需要一条专用的数据转发线路。图4.6中,负载均衡器之间有两条线路,一个用来检查对方健康状况,另外一个用来转发数据。在图4.6所示的网络结构中并不是必须具备这两条线路,但有些网络结构中却是必须的,后面我们会讨论到。在图4.6所示的方案中,如果负载均衡器1到二层交换机的线路出现故障,它还可以通过到负载均衡器2的数据链路到达二层交换机。如果负载均衡器1和二层交换机之间的线路出现故障,我们可以让两台设备进行切换,也可以让负载均衡器1继续提供服务,通过负载均衡器2到达二层交换机,这种方式能够提供更好的负载均衡性能。
在主-主模式的方案设计中,如图4.7所示,可能存在多个二层环路。例如:在路由器和两台负载均衡器之间存在一个环路,在负载均衡器和二层交换机之间存在另外一个环路。我们可以对服务器、或者下面的二层交换机、或者两个负载均衡器之间的线路都使用不同的子网或者VLAN。如果不能在二层避免环路,那么就必须要使用STP协议来阻断端口,防止环路。
图4.7 主-主配置 二层环路
4.3.3 有状态切换
发生切换时,备机接管服务,因为备用设备没有主设备正在处理的TCP连接状态的信息,任何打开的TCP连接都会中断,这就是无状态切换。相对的,备用设备接管服务而不用中断已经存在的TCP连接就是有状态切换。对UDP来说,并不存在这个问题,UDP本身就是无状态的。然而,当应用需要进行会话保持时,即使是UDP的应用,在无状态切换时也会中断。使用有状态切换时,备用设备必须要维护一个会话保持表,这样才能跟主设备保持一致。
有状态切换需要两台设备之间互相通信,无论是连接建立还是拆除。协议和具体的实现方法,不同设备各有不同,但是备用设备必须保证会话表跟主设备保持一致,并且实时更新。当主设备出现故障时,备用设备必须知道每台服务器的压力,有一份完整的会话表拷贝,根据需要进行会话保持。
当负载均衡器基于URL、Cookie或者SSL ID进行交换,需要延时绑定时,提供有状态切换是非常复杂的。因为每个请求和应答的数据包的序列号或者应答号都需要修改,备用设备必须更新每个数据包的序列号和应答号,保证正常切换,这会产生大量的开销。基于SSL会话ID进行交换时,为了能提供有状态切换,备用设备必须实时更新SSL会话ID表。当备用设备接管时,它必须能够把SSL会话ID绑定到正确的服务器保证会话保持。
有状态切换是高可用的一大特性,因为它不仅允负载均衡器出现故障,还不会中断现有的活动的连接。对有些应用系统来讲,有状态切换是非常必要的。一般来讲,有状态切换可以给长连接的应用带来很大益处。例如:流媒体应用,其连接打开的时间跟我们观看的时间一样长。HTTP一般都是短连接,浏览器在一个TCP连接中产生一个或多个请求之后,就会关闭这个连接。为了更有效利用负载均衡器的资源,可以只针对特殊应用的VIP才启用有状态切换,而不是所有应用。
有状态切换会影响到负载均衡器的性能和网络设计。负载均衡器必须互相通信,进行会话表的更新,对负载均衡器来讲,这是额外的工作。负载均衡器都会有一个设置,就是两台设备之间多长时间检测一次对方的状态。负载均衡器之间私有链路连接越短越好,保证通信延时最小。在主-主模式时,有状态切换会影响到会话表的容量和使用率。如果负载均衡器1有50,000个在线连接,负载均衡器2有100,000个在线连接,为了保证有状态切换,每台负载均衡器都必须维护一个150,000条记录的会话表。
4.3.4多VIP
到目前为止,我们已经讨论了每台负载均衡器只有一个VIP的情况,事实上,每台负载均衡器上面可能会有多个VIP。负载均衡器必须协商哪个VIP在哪台设备上为主,或者网络管理员进行手工设置。由于每个VIP都会产生一定的压力,在负载均衡器之间合理的分配是非常重要的。另外,在某种网络拓扑结构中,一台负载均衡器只负责特定的VIP,其他所有VIP由另外一台设备控制也可能是合理的。如果负载均衡器1只跟VIP10对应的真实服务器之间的连接中断的话,最好的选择是只把VIP10切换到负载均衡器2。
4.3.5负载均衡器的恢复
当一个负载均衡器发生故障的时候,另外一台立即接管。但是,发生故障的负载均衡器被修好之后,该如何重新开始工作呢?使用有状态切换时,需要花费相当长的时间同步所有的会话信息。同步完成之后,才能认为这台设备完全恢复。不使用有状态切换时,两台负载均衡器之间切换会中断所有在线的会话。不过,让刚恢复的设备接管所有VIP是一个不错的选择,因为它能够提供更好的性能。当然,管理员为了避免中断在线会话,也可以手工控制切换的过程。
4.3.6 高可用的方案设计
在本节,我们来讨论几种高可用网络设计及其优缺点。
首先从简单的网络设计开始,一个路由器和一个负载均衡器,服务器直接连接到负载均衡器,如图4.1和4.2所示。为了实现负载均衡器的容错,我们使用两台负载均衡器,并以主-备模式工作,如图4.8所示。简单起见,我们把服务器分成两组,连接到不同的负载均衡器。VIP绑定到所有的真实服务器,如果备用设备出现故障,连接到备用设备的服务器是不能通过主设备来进行负载均衡的,只有一半的服务器能够提供服务。当然,任何一台负载均衡器故障,所有连接到这台负载均衡器的服务器都无法提供服务,这是这种网络设计最大的局限性。
图4.8 高可用方案设计一
改进上述方案就是负载均衡器使用主-主工作模式,如图4.9所示。通过使用主-主工作方式,我们可以从任意一个负载均衡器访问所有的服务器。在每台负载均衡器上面都有一个主用的VIP和一个备用的VIP。我们必须注意VIP如何跟真实服务器进行绑定,如何设置服务器的缺省网关。如果把VIP1绑定到RS1和RS2,VIP2绑定到RS3和RS4,那么我们得不到任何的高可用。因为,当负载均衡器1出现故障,绑定到VIP1的所有的真实服务器都无法访问。负载均衡器2不能够提供VIP1的服务,因为VIP1对应的真实服务器都不可用。因此必须把每个VIP对应的服务器连接到两台负载均衡器,才能获得高可用。
图4.9 高可用方案设计二
我们把每台真实服务器的缺省网关指向它直连的负载均衡器。例如对RS1和RS2而言,它们的网关就要指向网关IP1。这时流量的进出是不对称的,如果负载均衡器2发送一个VIP2的请求到RS1,从RS1返回的数据包会绕开负载均衡器2。这样,就必须使用源地址的NAT或者DSR。当然,我们可以在负载均衡器之间使用共享VIP的方式,这样任意一台负载均衡器就都能处理返回的数据包了。
图4.8和4.9存在的最大的一个问题是,当一台负载均衡器出现故障的时候,连接到这台设备所有的服务器都无法访问。为了避免这个问题,在图4.10所示的方案中在负载均衡器下面使用二层交换机连接所有的服务器。使用二层交换机的另外一个重要原因是端口密度的问题,负载均衡器上面每个端口的成本相对来讲比较高。端口密度就是指单位机柜空间内可用的端口个数,交换机能够在最小的机柜空间内提供更多的端口。
图4.10 高可用方案三
图4.10所示的方案设计与图4.6中所示类似,但是我们要考虑路由器和二层交换机的高可用性。
图4.11所示的方案设计有所改进,能够提供二层交换机的容错功能。在之前的方案设计中,只能提供负载均衡器的容错,如果连接服务器的二层交换机出现故障,那么所有的服务器都无法访问。在这个方案设计中,最好是把真实服务器按照VIP分成两组,每组的网关指向对应的负载均衡器上面的网关IP。这样,我们就可以把VIP1绑定到RS1和RS2,VIP2绑定到RS3和RS4,同时把RS1和RS2的缺省网关指向网关IP1,RS3和RS4的缺省网关指向网关IP2。这会避免双向的流量出现不对称的情况。另外,我们也可以把VIP绑定到所有的真实服务器,把服务器的网关指向两个缺省网关IP,在两个负载均衡器之间使用共享VIP的方式。这时,无论数据包从哪边返回,负载均衡器都能够处理。如果我们使用源地址的NAT或者DSR,就不用设置缺省网关,只需要保证在所有可用的路径之间进行负载分发就可以了。
图4.11 高可用方案设计四
图4.11中,二层交换机和负载均衡器都实现了双机容错,但路由器仍然是一个单点故障,图4.12所示的方案解决了这个问题。并且在这个方案中,所有设备互联都是使用端口聚合(Trunk Group)的方式。端口聚合是把两个或者两个以上的端口捆绑使用,用来连接两个交换机。端口聚合能够提供两个好处:提高带宽容量和容错。端口聚合的带宽是这个组中所有链路带宽的总合。如果一条链路出现故障,会自动切换到组中其他正常的链路。在端口聚合中几条链路之间分发负载的算法和支持的链路数量取决于产品本身。在之前的方案设计中,如果一个链路出现故障,会直接导致一个负载均衡器或者路由器无法使用,在图4.12所示的方案中,通过使用端口聚合解决了这个问题。
图4.12 高可用方案设计五
在图4.12所示的方案中,顶端的路由器使用VRRP提供高可用。我们使用两个VRRP IP地址,每个路由器接管一个。对于出站的流量,可以把负载均衡器1指向VRRP IP1,把负载均衡器2指向VRRP IP2,这样出站的流量就可以在两个路由器之间分发。有些负载均衡产品通过使用静态路由的方式也能实现负载的分发,在每个负载均衡器上面定义两条静态路由,每个VRRP IP地址一条,通过这种方式在两个路由器之间分发出站流量。
图4.13是单臂模式下高可用的方案设计,这种设计需要使用二/三层交换机,而不是之前连接服务器的二层交换机。二/三层交换机和路由器之间的虚线表示可选线路。如果使用二层交换机,并按照虚线进行连接的话,就有二层环路出现,必须使用STP(生成树协议)。在使用STP时,必须小心阻断正确的链路,提供最佳的数据流向。如果使用三层交换机,并按照虚线所示进行连接的话,可以通过配置不同的子网避免使用STP。在这个方案中,每台负载均衡器都能够访问所有的服务器。单台负载均衡器的故障不会影响到服务器的连接性。但是如果二/三层交换机出现故障,这台交换机上面连接的所有服务器和负载均衡器都将无法访问。但二/三层交换机的功能和配置都比较简单,相对来讲二/三层交换机出现故障的几率会比服务器和负载均衡器的小很多。
图4.13 高可用方案设计六
图4.13所示的方案有三种使用方式,第一种就是使用DSR。当使用DSR的时候,可以把VIP绑定到任意的服务器。只需要把不同的VIP合理分配到两个负载均衡器上面,保证负载均衡器的压力平均即可。同时应该把服务器的缺省网关指向路由器上面的VRRP地址,因为在DSR模式下,返回的数据包不用再经过负载均衡器。需要注意的一点是,这个方案中负载均衡器会穿透二/三层交换机之间的线路互相检测对方的健康状况。如果左边的交换机出现故障,负载均衡器2应该能检测到并立即接管所有的VIP。如果通过专用线路相连进行健康检查,负载均衡器就检测不到交换机的故障。
在这个方案中服务器使用私有IP地址是比较安全的。如果使用二层交换机连接服务器,那么就必须配置路由器,使其能够路由私有IP地址。我们也可以使用三层交换机给私有IP地址的服务器提供路由功能。
第二种方式就是把服务器进行分组,绑定到不同的VIP,并把服务器的缺省网关指向对应的负载均衡器。如果把VIP1绑定到RS1和RS2,那么RS1和RS2的网关就必须指向网关IP1,保证返回的数据回到负载均衡器1。如果负载均衡器1出现故障,负载均衡器2可以进行有状态切换,接管所有VIP的服务,在所有服务器之间进行负载均衡。这种方式对负载均衡器和交换机之间链路要求两倍的带宽,需要合理配置。客户端的请求从二层交换机进入负载均衡器,又从负载均衡器出来回到二层交换机,然后到真正的服务器。返回的流量回到负载均衡器之后,经过二层交换机回到路由器,然后路由到最终的客户端。每次请求和返回的数据包都会在负载均衡器和交换机之间的链路上通过两次,可以在负载均衡器和交换机之间使用端口聚合或者使用高速链路,例如千兆线路,或者两者同时使用来解决这个问题。
第三种方式是使用源地址的NAT,并把VIP绑定到所有的真实服务器,这种方式比较灵活。所有的请求和回应同样会两次经过负载均衡器和交换机之间的链路。
在这种方案设计中效率最高的是DSR,因为它能够提供很高的吞吐,具有最佳的数据流向和链路使用率。
到目前为止,每台服务器都使用一个网卡连接到负载均衡器或者交换机。把服务器连接到负载均衡器时,如果负载均衡器出现故障,那么服务器将无法访问。因此,我们使用二层交换机连接服务器,让两台负载均衡器都能访问所有的服务器。但是,如果二层交换机出现故障,那么连接到此交换机的所有的服务器将无法访问。图4.14所示的方案中,为了防止负载均衡器出现故障,每台服务器都使用两个网卡连接到负载均衡器。这也能够防止服务器的网卡或者线路出现故障,提高服务器的可用性。
图4.14 高可用方案设计7
当服务器使用两个网卡时,需要特别注意两个网卡的工作方式。这取决于服务器上面使用网卡的型号和操作系统的类型。有些网卡有两个接口,并且两个可以同时使用,或者两个接口以主备的方式进行工作。有些网卡厂商支持把两个网卡配置成一个组,网卡的工作方式为主备或者同时工作。
如果使用主备的工作方式,必须确认在哪种情况下,两个网卡才发生切换。在图4.14所示的方案中,每台服务器都有两个网络接口。这两个网络接口可能在一个网卡上面,也可能在两个不同的网卡上面。但这两个接口逻辑上是一个主备工作的组。主用的网卡连接到主用的负载均衡器,备用网卡连接到备用的负载均衡器。当主用的负载均衡器正常工作时,所有设备都工作的很好。当主设备出现故障,备用设备接管时,服务器上面备用的网卡也会变成主用的网卡吗?如果网卡不能切换,备用的负载均衡器将无法访问服务器。备用网卡切换的条件取决于网卡的厂商、驱动程序和服务器上面运行的操作系统。主用的负载均衡器可能出现各种各样的故障,最简单一种就是意外断电,这时主用网卡能够检测到链路故障,然后切换到另外一个网卡。比较难于判断的情况就是主用的负载均衡器因为软件或硬件的原因被挂起,没有响应,也无法管理。这种情况下,服务器主用网卡的线路上面是没有流量的,但是由于负载均衡器的物理端口仍然是好的,线路的状态却是正常的。如果备用网卡不能接管的话,备用负载均衡器依然无法访问服务器。
图4.15 高可用方案设计8
另外一个问题是当主用的网卡或者连接主用网卡的线路出现故障时,备用网卡接管服务。但是主用的负载均衡器仍然正常工作,如果备用的负载均衡器不能正常转发数据包的话,主设备将无法这些访问这台服务器。一般来讲,这种方案会存在一些问题,除非花很多精力来避免这些问题。
在图4.15所示的方案设计中,服务器上面的主用网卡分成两组,连接到两台不同的负载均衡器。需要把负载均衡器配置成主-主工作模式,并把VIP1绑定到RS1和RS2,把VIP2绑定到RS3和RS4。把RS1和RS2的缺省网关指向网关IP1,Rs3和RS4的缺省网关指向网关IP2。当两台负载均衡器都正常工作的时候,所有的负载均衡器和服务器能够被利用起来。如果负载均衡器1出现故障,VIP和网关IP1就切换到负载均衡器2。关键还是要注意,保证连接到主用负载均衡器的主用网卡也同时发生切换,保证负载均衡器2能够正常访问到这些服务器。改进这种方案的方法就是如果一个主用的网卡出现故障,备用网卡接管之后仍然能够通过另外一台负载均衡器访问这台服务器。例如:如果RS1的主用网卡出现故障,负载均衡器1仍然能够通过负载均衡器2访问RS1,因为我们使用的是主-主工作方式,负载均衡器2会转发流量。由于RS1的网关设置成网关IP1,服务器回应的数据包仍然会回到负载均衡器1。
在这种方案中,我们可以使用共享VIP的方式。这样的话,对于一个给定的VIP,两台负载均衡器都能处理流量。通过共享VIP,不必再担心数据是如何返回的,网关是否正确等问题。我们可以把每个VIP都绑定到所有的服务器,首先收到响应数据包的负载均衡器会进行处理。
使用主-主的工作模式,能够从任意一台负载均衡器访问到每一个服务器。使用共享VIP的方式,可以把VIP绑定到所有的服务器,同时不用再担心数据如何返回。 在图4.16所示的方案设计中,我们介绍两个网卡同时工作的情况。有一点需要注意,对负载均衡器来讲,每一个真实服务器IP地址看起来都是一台真正的服务器。因此,一个服务器有两个网卡同时工作时,每个网卡都有单独的IP地址,对负载均衡器来讲就是两台独立的真实服务器。配置的IP地址取决于服务器上面的操作系统,例如,Linux系统允许两个网卡使用同一个网段的IP地址。有些操作系统要求两个网卡必须配置不同网段的IP地址。还必须确认两个网卡能否同时配置缺省网关。如果操作系统只允许设置一个网关,不管是哪个网卡接收到的请求,所有返回的数据包都会经过同一个缺省网关,导致进出数据包的路径不一致。所以,当服务器到使用两个或者多个网卡连接多台负载均衡器时,最佳选择就是使用DSR或者源地址的NAT,这样就可以不用考虑操作系统和网卡的影响。
图4.16 高可用方案设计九
当一个网卡出现故障,负载均衡器就会认为这个IP地址对应的服务器出现故障,不影响服务器在第二块网卡上面继续提供服务。一般来讲,让两个网卡同时工作,只会产生更多的问题。 服务器使用多个网卡的原因不仅仅是获得高可用性,而是为了得到更高的吞吐。随着服务器处理能力的不断增强,网络I/O吞吐也不断提升。今天任何一台象样的服务器都会安装一个百兆的网卡,一台中等的服务器可能安装一个千兆网卡。1Gbps的网络吞吐需要大量的系统优化工作和非常高的硬件配置,要想得到100Mbps以上的吞吐量最简单的方法就是使用千兆网卡,而不是采用多个百兆网卡。这会避免使用多个网卡而出现的各种各样的问题。但是很多客户都是非常谨慎的,不能仅仅因为一个1000美金的网卡的故障,而导致价值100,000美金的服务器无法访问。因此,双网络接口能够防止服务器网卡或者链路出现故障。同时,使用双网卡也会带来一些问题,在上面的方案中我们都进行了讨论。如果用户能够使用DSR或者主-主工作模式的配置,使用双网卡就很简单了,因为使用DSR服务器返回的流量可以经过任意一条路径。但并不是所有人都愿意使用DSR方式,因为不想配置回环地址。另外使用DSR的话,还不能使用L5~L7层交换的功能,例如基于Cookie或者URL进行交换。不过可以使用源地址NAT作为备选方案。使用源地址NAT,就不用在服务器上面配置回环地址,还可以使用L5~L7的交换,但是因为源地址NAT的原因,服务器看不到客户端真实的IP地址。但这可以通过在负载均衡器上面统计客户端源IP地址进行解决。双网卡使用主-备工作模式,如图4.15所示,也许是最安全的一种方案。
4.3.7 负载均衡器之间的通信
无论是使用主-备工作模式,还是使用主-主工作模式,负载均衡器之间都需要使用某种协议进行通信。 当采用主-备工作模式时,负载均衡器需要决定自己的状态是主用的还是备用的。可以手工进行设置,也可以在设备之间自动协商,这取决于设备本身。在主-主工作模式下,负载均衡器必须决定每台设备上面主用的VIP和备用的VIP。由于每台负载均衡器的压力取决于它上面主用的VIP,因此在初始配置的时候,管理员可以把VIP分成两组,分别在两台负载均衡器上面主用。另外一种方式就是根据每台负载均衡器可用的容量和给定VIP对应服务器的可连接性来判断哪一台负载均衡器更适合提供服务。 在高可用的方案中,两台负载均衡器之间保证一条可靠的通信链路是至关重要的。使用端口聚合,用两个或者更多链路直接把两台负载均衡器连接到一起是最好的方案,除非使用如图4.13所示的方案。一般来讲,一款好的负载均衡器应该能够在直连线路出现故障的情况下,尝试使用其他可用链路跟另外一台进行通信。
4.4 小结
负载均衡器在提高服务器群高可用的同时,其自身也存在单点故障。使用两台负载均衡器一起工作,能够实现负载均衡器的容错。高可用的网络结构有很多种选择,每种方案的复杂性和优点各不相同。必须记住一点,越复杂的方案越不可靠。复杂的方案难以实现,并且很难排错,容易出现更多的人为错误。一个简单的有状态切换的高可用方案是提高服务器群可用性的最好的方法。

--------------------------------------------------------------------------------------------------------------------------------------

版权所有,转载请注明出处  京ICP备2021040351号