使用ARR实现HTTP负载均衡
概述
本主题旨在指导读者一步步地配置ARR来实现高可用性及可扩展性。下面的演练同时描述了一些关于监控ARR内容服务器健康状况及客户端与服务器间亲和力的特性。
目标
下图是使用ARR来负载均衡HTTP请求的结构图:
先决条件
本演练需要下列先决条件:
l 装有IIS7的Win2008,或更高版本
l Microsoft ARR及相关模块
l 至少2台装有工作站点和应用程序的服务器
如果ARR组件没有安装,请在下列位置下载:
l Microsoft Application Request Routing Version 1 for IIS 7 (x86) here
l Microsoft Application Request Routing Version 1 for IIS 7 (x64) here
请按照这篇文章所示来安装ARR:安装ARR
另一个先决条件请看这篇文章:定义及配置ARR服务器组
步骤1 – 确认URL Rewrite规则
在这篇文章(定义及配置ARR服务器组)中,创建的URL Rewrite规则已经能被用在简单的负载均衡场景下了。
通过图形界面来确认URL Rewrite规则:
1. 打开IIS管理器
2. 选择myServerFarm农场(在定义及配置ARR服务器组中创建的服务器农场)
3. 如下图所示:
a)
4. 双击Routing Rules(路由规则)图标
5. 确认” Use URL Rewrite to inspect incoming requests”复选框处于选中状态
a)
6. Enable SSL offloading这个选项默认是选中状态的。当SSL Offloading处于启用状态时,所有在ARR服务器和内容服务器之间的通信都是明文的,甚至当客户端发起的是https请求时也是如此。当ARR服务器及内容服务器处于一个信任网络中,比如说同处于一个数据中心时,启用这个选项是不会牺牲安全性的。而且,启用这个属性可以最大化的优化内容服务器的资源,因为此时不需要为加密解密花费额外的耗费了。让我们来禁用SSL offloading。
7. 打开浏览器发送一些请求到ARR服务器
8. 想要确认这些请求已经被均匀的分散到了各个内容服务器,我们选中myServerFarm节点,双击Monitoring and Management(监控及管理)图标
a)
9. 在显示出的仪表盘中,确认这些请求被均匀的分发了
a)
命令行方式确认URL Rewrite规则:
1. 以administrator身份打开命令行
2. 导航到文件夹%windir%\system32\inetsrv
3. 想要确认URL Rewrite规则创建成功,输入如下命令:appcmd.exe list config -section:system.webServer/rewrite/globalRules。它会返回如下全局规则信息:
a) <system.webServer>
<rewrite>
<globalRules>
<rule name="ARR_myServerFarm_loadbalance" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
</conditions>
<action type="Rewrite" url="http://myServerFarm/{R:0}" />
</rule>
</globalRules>
</rewrite>
</system.webServer>
4. 想要禁用SSL offloading,先要清除所有的URL Rewrite规则:
a) appcmd.exe clear config -section:system.webServer/rewrite/globalRules
b) 然后,建立URL Rewrite规则来转发https流量。更进一步的,根据这个规则,如果客户端发起的是https请求,ARR也会使用ssl方式转发请求:
i. appcmd.exe set config -section:system.webServer/rewrite/globalRules /+"[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True']" /commit:apphost
ii. appcmd.exe set config -section:system.webServer/rewrite/globalRules /[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].match.url:"*" /commit:apphost
iii. appcmd.exe set config -section:system.webServer/rewrite/globalRules /+"[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].conditions.[input='{HTTPS}',pattern='On']" /commit:apphost
iv. appcmd.exe set config -section:system.webServer/rewrite/globalRules /[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].action.type:"Rewrite" /[name='ARR_myServerFarm_loadbalance_SSL',patternSyntax='Wildcard',stopProcessing='True'].action.url:"https://myServerFarm/{R:0}" /commit:apphost
c) 最后,为普通http请求的转发建立URL Rewrite规则
i. appcmd.exe set config -section:system.webServer/rewrite/globalRules /+"[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True']" /commit:apphost
ii. appcmd.exe set config -section:system.webServer/rewrite/globalRules /[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True'].match.url:"*" /commit:apphost
iii. appcmd.exe set config -section:system.webServer/rewrite/globalRules /[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True'].action.type:"Rewrite" /[name='ARR_myServerFarm_loadbalance',patternSyntax='Wildcard',stopProcessing='True'].action.url:"http://myServerFarm/{R:0}" /commit:apphost
d) 为了确认url rewrite规则被成功建立并且SSL offloading是禁用的,输入命令:appcmd.exe list config -section:system.webServer/rewrite/globalRules。它会返回类似如下的信息:
i. <system.webServer>
<rewrite>
<globalRules>
<rule name="ARR_myServerFarm_loadbalance_SSL" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
<add input="{HTTPS}" pattern="On" />
</conditions>
<action type="Rewrite" url="https://myServerFarm/{R:0}" />
</rule>
<rule name="ARR_myServerFarm_loadbalance" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" />
<conditions>
</conditions>
<action type="Rewrite" url="http://myServerFarm/{R:0}" />
</rule>
</globalRules>
</rewrite>
</system.webServer>
步骤2 – 配置健康检查监控
ARR通过以下两种方式监控内容服务器的健康状态:
l 通过现场流量
l 通过特定的URL来测试
当有请求到ARR服务器时,现场流量测试是被默认执行的。特定url测试是一种额外的测试。在本演练中将指导你配置特定url的测试方式。
图形方式配置健康检查监控:
1. url测试需要一个特定的url来做测试。为了满足这个条件,使用记事本来建立一个名为healthCheck.txt的文本文件,文件内容为”I am healthy.”
2. 把healthCheck.txt文件放到各个内容服务器上
3. 通过浏览器来确定这个文件能够被正常获取到
4. 在IIS管理器中,选择myServerFram服务器农场,如下图:
a)
5. 双击Health Test(健康测试)
a)
6. 在URL中输入http://(server name or FQDN of ARR server)/healthCheck.txt
7. 在Response match中输入healthy作为值。Response match是个可选测试,用来确保回复过来的Body中包含有期望值。在本例中,由于healthCheck.txt包含了”I am healthy.”字符串,所以Response match会匹配到单词”healthy”
8. 点击Apply保存更改
9. 为了确认健康检查监控的正确性,可以先停止内容服务器中的某一台。因为Interval(seconds)的值设置的是30秒,所以我们等待30秒。
10. 等待30秒后,发送几个请求到ARR服务器
11. 要想确认所有的请求都转发到了健康状态的服务器,我们来双击Monitoring and Management图标,然后用F5来刷新仪表盘。注意运行时统计信息已经被reset了,这个是被设计成这样的。你可以按需来发送几个额外的请求然后刷新仪表盘。
a)
12. 健康状况监控程序也可以在这种情况下使用:当一台不健康的服务器恢复健康时。为了验证这个功能,我们启动在第九步中停止的那个网站。再一次,因为Interval(seconds)设置的是30秒,我们等待30秒。
13. 等待30秒后,发送几个请求到ARR服务器
14. 为了确认请求被均匀的分配到了各个服务器,在IIS管理器中刷新仪表盘。注意运行时统计信息已经被reset了,这是被设计成这样的。你可以按需来发送几个额外的请求然后刷新仪表盘。
用命令行方式配置健康检查监控:
1. 以administrator身份打开命令行
2. 导航到文件夹%windir%\system32\inetsrv
3. 设置URL参数值为http://(server name or FQDN of ARR server)/healthCheck.txt以及Response match值为I am healthy.。输入:
a) appcmd.exe set config -section:webFarms /[name='myServerFarm1'].applicationRequestRouting.healthCheck.url:"http://(server name or FQDN of ARR server)/healthCheck.txt " /[name='myServerFarm1'].applicationRequestRouting.healthCheck.responseMatch:"I am healthy." /commit:apphost
步骤3 – 配置客户端亲和
ARR提供了客户端亲和特性,能够让客户端在一个会话中始终和一台内容服务器对应。当这个特性开启时,负载均衡算法只对客户端刚开始时起作用。从这点上来看,所有同一个客户的后续请求都会被路由到同一台内容服务器处理。这个特性在以下场景中是非常有用的:
当内容服务器是有状态的
客户端的请求必须路由到同一台内容服务器来处理
会话管理不是*化管理的
图形方式配置客户端亲和:
1. 打开IIS管理器
2. 选择myServerFarm农场,这是在这篇文章中建立的(定义及配置ARR服务器组)
3. 如下图所示:
a)
4. 双击Server Affinity图标(服务器亲和)
5. 想要启用客户端亲和,选中Client affinity复选框,然后点击Apply保存
a)
b) ARR使用一个cookie来启用客户端亲和。Cookie name属性是被输出到客户端的cookie名称。这意味着客户端必须能够接受cookie才能让这个特性起作用。
6. 为了确认客户端亲和正在起作用,我们先发送一些请求到ARR服务器。在IIS中刷新仪表盘(监控及管理图标)。确认只有一台服务器的统计信息是被更新的(因为现在是启用了客户端亲和了)。你可以按需发送其他请求然后刷新仪表盘。
命令行方式配置客户端亲和:
1. 以administrator方式打开命令行
2. 导航到文件夹%windir%\system32\inetsrv
3. 启用客户端亲和,输入:
a) appcmd.exe set config -section:webFarms /[name='myServerFarm1'].applicationRequestRouting.affinity.useCookie:"True" /commit:apphost
步骤4 - 禁止新连接
当想把某台内容服务器移出农场时,针对某台内容服务器设置禁止新连接选项是个优雅的解决方式。当启用了客户端亲和特性时,这变得很有趣,因为ARR会保持目前已有的会话而拒绝新连接。那就是说,当一个客户端与一台设置了禁止新连接的内容服务器关联后,客户端的请求会继续路由到这个内容服务器,就是说,对于客户端来说是没有影响的。然而,不会有新的客户再被转发到这台内容服务器上了。
图形方式设置禁止新连接:
1. 通过上面的步骤3来将一台客户端与一台内容服务器关联起来
2. 选择myServerFarm农场
3. 如下图所示:
a)
4. 双击Monitoring and Management(监控及管理)
5. 选择那台已经客户端亲和的内容服务器,在Actions那里,点击Disallow New Connections(不允许新连接)
6. 在确认对话框中,单击Yes
a)
7. 为了确认已被亲和的客户端与内容服务器,并且这台内容服务器已经设置了disallow new connections,让我们发送一些请求到ARR服务器。刷新IIS中的仪表盘。确认那台内容服务器的统计信息的改变。你可以按需发送更多的请求并且刷新仪表盘
8. 为了确认新的客户端已经不会被路由到禁止新连接的内容服务器,我们来删除cookie并且关闭重新打开浏览器
9. 发送一些请求到ARR服务器。刷新仪表盘。确认只有处于Available状态的内容服务器在改变统计信息。并且确认设置了Disallow new connections的服务器的统计信息没有改变过。