windows平台下实现高可用性和可扩展性-ARR和HLB
本文档提供了关于如何将应用程序请求路由(ARR)与硬件负载均衡器一起使用以实现高可用性和可伸缩性的说明性指导。本文采用F5大IP负载均衡器来说明ARR与硬件负载平衡器之间的工作关系。
IIS7.0及以上版本的Microsoft Application Request Routing(ARR)是一个基于代理的路由模块,它基于HTTP报头、服务器变量和负载平衡算法将HTTP请求转发到内容服务器。下图显示了典型的ARR部署:
虽然ARR为内容服务器(Content server)提供了高可用性和可伸缩性,但总体部署并不是高度可用或可伸缩的,因为:
-
ARR是单点失效。
-
内容服务器(Content server)的可伸缩性受到一个ARR服务器最大容量的限制。
为了克服这些挑战,管理员可以考虑使用多个具有硬件负载均衡器的ARR服务器,例如F5大IP。ARR可以在主动/被动模式下部署,以实现高可用性,也可以在主动/主动模式下实现高可用性和可伸缩性。本白皮书描述了如何将ARR和F5大IP一起部署,以便在实现总体高可用性和可伸缩性的同时启用核心ARR方案。
应用ARP和F5 BIG-IP
ARR是作为IIS之上的一个模块构建的,它的目的是在第7层(应用程序)做出路由决策。更准确地说,ARR依赖另一个IIS模块URL重写来检查传入的HTTP请求头和服务器变量来做出路由决策。根据这种设计,管理员可以根据应用程序级别的信息编写智能路由规则,例如:
- 主机名(HTTP_HOST):根据主机名将通信量路由到不同的内容服务器。
- 请求资源(URL):基于文件扩展名,确定请求的资源是用于静态内容还是用于动态内容,并相应地路由请求。
-
客户端信息(HTTP_USER_Agent):根据浏览器类型和版本,将请求路由到适当的内容服务器
-
自定义标头(由应用程序设置为Cookie):根据应用程序设置的cookie信息(如用户首选项或用户ID)路由通信量。
以上只是一些例子。有关HTTP头和服务器变量的完整列表,请参阅附录A。
F5 BIG-IP的第3层和第4层的功能赞扬了ARR在基于第7层(如HTTP报头和服务器变量)进行路由决策方面的优势。同时,ARR不为自己提供容错部署特性,必须依靠其他互补技术和解决方案来实现ARR层的高可用性,如下所示:
场景1:基于http的路由和负载平衡
基于HTTP的路由和负载平衡方案支持三层部署体系结构,其中包括:
- 第1层(Web):提供处理静态内容以及路由和负载平衡到第2层服务器的剩余动态请求的双重目的。
-
第2层(应用程序):依赖于业务逻辑的过程动态内容。
-
第3层(数据):存储数据。
下图说明了3层部署:
尽管上面的示例显示了将静态内容与动态内容区分开来的路由规则,但另一个常见的场景是将表示请求与Web服务请求区分开来。
选项1:Active/Passive
在主动/被动模式下,通常有两个ARR服务器,其中一个服务器处理请求,而另一个服务器作为故障转移服务器。如上所述,虽然此配置通过删除单个故障点来实现高可用性,但它并不是一个扩展解决方案,因为内容服务器的总容量受到一个ARR服务器的最大容量的限制。
在此设置中,由于两个ARR服务器的配置方式相同,因此使用了共享配置。F5 BIG-IP被配置为将所有请求路由到主动ARR服务器,并且只在必要时将请求路由到被动ARR服务器。
除了ARR中的主机名关联特性外,不存在两个ARR服务器之间必须共享的运行时状态信息。因此,对于这种情况,无论是在ARR服务器上还是在F5 BIG-IP上都不需要特殊的配置。即使您使用ARR中的服务器关联特性,当F5 BIG-IP将请求路由到以前被动但现在主动的服务器时,也会通过请求头中的cookie向被动服务器提供亲缘关系状态信息。
这个场景在ARR版本1版本中完全支持。
ARR配置
步骤1:
- 在两个ARR服务器上启用共享配置。按照本文档中的步骤在IIS中设置共享配置。
步骤2:
- 使用arr配置3层部署架构。按照本文档中的步骤在3层部署体系结构中配置ARR。
- 在更高层次上,上面的文档描述了:
- 如何使ARR服务器上的静态内容可用。
- 如何为静态内容编写URL重写规则,以便直接从ARR服务器为它们服务。
- 如何为动态内容编写URL重写规则,以便将它们转发到应用程序服务器。
F5 BIG-IP 配置
在这种情况下,所有可用的ARR服务器都被认为是活动的,并且是负载均衡通信量的候选服务器。使用BIG-IP LTM来确定ARR前端的健康和性能,并将流量引导到性能最好的前端。
步骤1:配置ARR服务器池。
- 在“Local Traffic”部分,单击“pool”。然后单击Create按钮创建一个池。
- 任何唯一的名称都适用于池;这个例子使用ARR_Pool。对于健康监视器,您可以使用定制的HTTP监视器或默认的HTTP监视器。-你可以把负载平衡方法设置为循环。在这个场景中,由于只有一个主动和被动的ARR服务器,所以不使用负载平衡。-一定要启用优先级组激活。这会配置 BIG-IP 以最高优先级的值将流量发送到服务器(s)。当这些服务器(s)不可用时,大ip将流量发送到ARR服务器,并获得下一个最高优先级值。在这个场景中,10.0.1的ARR服务器的优先级值为1,10.0.0.2的优先级值为2。所有的流量将被发送到10.0.2,直到它下降,然后流量将被发送到10.0.1。
步骤2:配置虚拟服务器。
- 在“本地流量”部分,单击“虚拟服务器”。然后单击Create按钮创建虚拟服务器。
- 任何唯一的名称都适用于虚拟服务器;示例使用arr_vs.-对于目标,可以使用用户指向浏览器的IP地址。在这种情况下,我们使用。对于服务端口,我们使用‘80’。-对于虚拟服务器类型部分,您有几个选项。因为您依赖于arr来路由,所以可以选择PerformanceHTTP,这是为最佳性能而设计的。-对于默认池,选择在步骤1中创建的池。
- 此时,您应该能够连接到此VirtualServer,该服务器将被发送到适当的ARR服务器。
备选案文2:积极/活跃在ARR中
在活动/活动模式下,可以有两个或多个ARR服务器。这种配置实现了高可用性和可伸缩性,与仅实现高可用性的活动/传递模式不同。由于多个ARR服务器的配置方式相同,因此使用了共享配置。F5大IP被配置为将传入请求加载到所有可用和健康的ARR服务器,而ARR服务器反过来将请求转发给内容服务器。
如前所述,主机名和内容服务器之间亲合映射的运行时状态信息存储在arr服务器实例中的内存中。为了在多个ARR服务器之间共享此信息,使用Microsoft外部IIS缓存。有关外部缓存的详细信息,请参阅文件。
ARR组态
主动/主动的ARR结构与主动/被动的ARR结构相同。主要区别在于F5是如何配置的。
步骤1:在两个ARR服务器上启用共享配置。
- 按照下面的步骤要在IIS中设置共享配置的文档。
步骤2:使用arr配置3层部署架构。
- 按照下面的步骤文档配置ARR在3层部署体系结构中。
-
在高级别上,上述文件描述:
- 如何使静态内容在arr服务器上可用。
- 如何为静态内容编写URL重写规则,以便直接从arr服务器为它们服务。
- 如何为动态内容编写URL重写规则,以便将它们转发到应用程序服务器。
步骤3:启用和配置外部缓存。
- 按照下面的步骤文档以启用和配置外部缓存以与arr一起使用。
F5大IP配置
在这种情况下,所有可用的ARR服务器都被认为是活动的,并且是负载均衡通信量的候选服务器。使用大ip ltm来确定arr前端的健康和性能,并将流量引导到性能最好的前端。
步骤1:配置ARR服务器池。
- 在“本地交通”部分,单击“池”。然后单击Create按钮创建一个池。
- 任何唯一的名称都适用于池;示例使用arr_Pool。-对于HealthMonitor,您可以使用自定义HTTP监视器或默认HTTP监视器。-由于您有多个ARR服务器来分发通信量,所以需要选择最适合您的需要的负载平衡方法。假设所有arr服务器都具有相似的硬件特性,则动态负载平衡方法(如最快、可观察或预测)将为您提供基于性能的分发。
步骤2:配置虚拟服务器。
- 在“本地流量”部分,单击“虚拟服务器”。然后单击Create按钮创建虚拟服务器。
- 任何唯一的名称都适用于虚拟服务器;示例使用arr_vs.-对于目标,可以使用用户指向浏览器的IP地址。在这种情况下,我们使用。对于服务端口,我们使用‘80’。-对于虚拟服务器类型部分,您有几个选项。因为您依赖于arr来路由,所以可以选择PerformanceHTTP,这是为最佳性能而设计的。-对于默认池,选择在步骤1中创建的池。
摘要
在本白皮书中,回顾了两种主要的ARR场景,通过部署多个ARR服务器和使用F5大IP来实现高可用性和可伸缩性。
附录
附录A:用于编写路由决策规则的所有可用HTTP头和服务器变量。
ALL_HTTP | ALL_RAW | APPL_MD_PATH |
---|---|---|
APPL_PHYSICAL_PATH | CERT_COOKIE | CERT_FLAGS |
CERT_ISSUER | CERT_KEYSIZE | CERT_SECRETKEYSIZE |
CERT_SERIALNUMBER | CERT_SERVER_ISSUER | CERT_SERVER_SUBJECT |
CERT_SUBJECT | CONTENT_LENGTH | CONTENT_TYPE |
DOCUMENT_ROOT | GATEWAY_INTERFACE | HTTP_ACCEPT |
HTTP_ACCEPT_ENCODING | HTTP_ACCEPT_LANGUAGE | HTTP_CONNECTION |
HTTP_CONTENT_LENGTH | HTTP_HOST | HTTP_IF_MODIFIED_SINCE |
HTTP_IF_NONE_MATCH | HTTP_REFERER | HTTP_UA_CPU |
HTTP_USER_AGENT | HTTPS | HTTPS_KEYSIZE |
HTTPS_SECRETKEYSIZE | HTTPS_SERVER_ISSUER | HTTPS_SERVER_SUBJECT |
INSTANCE_ID | INSTANCE_META_PATH | LOCAL_ADDR |
PATH_INFO | PATH_TRANSLATED | QUERY_STRING |
REMOTE_ADDR | REMOTE_HOST | REMOTE_PORT |
REMOTE_USER | REQUEST_FILENAME | REQUEST_METHOD |
REQUEST_URI | SCRIPT_FILENAME | SCRIPT_NAME |
SERVER_ADDR | SERVER_NAME | SERVER_PORT |
SERVER_PORT_SECURE | SERVER_PROTOCOL | SERVER_SOFTWARE |
URL |