利用ARR实现IIS负载均衡

[TOC]

现状

  • 目前有2台机器(比如 site01site02)安装了 IIS 8.5(使用默认 80 端口)并运行了一个站点,比如 xxx.abc.com
  • 由于IIS高可用采用的是DNS轮询,经过长时间的运行发现,大部分情况iis请求都集中于一台,而另外一台基本无压力,在业务高峰的时候这就无法忍受了。如何才能实现真正的iis负载均衡呢?

利用Application Request Route实现IIS负载均衡

Application Request Route(简称ARR)是一个寄宿于IIS7(及以后的IIS版本)的一个基于代理的模块,它可以通过判断 Http Headers,Server Variables以及负载均衡算法将HTTP的请求转发到不同的处理服务器之上,即一种基于IIS的负载均衡解决方案

准备工作

  • 第1步,[所有节点] 将后端站点 xxx.abc.com端口从 80 改为 8001,避免和proxy端口冲突,同时建议在 index.html 上添加标识
#.节点1执行
echo this is site01 > c:\website\xxx.abc.com\index.html

#.节点2执行
echo this is site02 > c:\website\xxx.abc.com\index.html
  • 第2步,[节点1] 新建一个空的 proxy 站点用于分发,并使用 80 端口

安装ARR及URL Retire

本示例,以 site01 作为分发服务器

#.官方下载
https://www.microsoft.com/web/Downloads/platform.aspx
https://www.iis.net/downloads/microsoft/application-request-routing
https://www.iis.net/downloads/microsoft/url-rewrite

创建并配置 Server Farm

以下在安装了 ARR 的节点上操作,比如 site01

  • 第4步,创建一个 Server Farm,比如 arr

  • 第5步,添加2个后端节点ip,同时修改每个站点的httpPort,比如第1步已改为 8001

  • 第6步,待 arr 创建完成之后,双击打开 Routing Rules,然后选择右侧的 URL Rewrite

  • 第7步,编辑入站规则,并选择右上角的 应用,这里的正则表达式 {SERVER_PORT} 会将 80 端口的请求转发给 arr 的2个后端站点上

  • 第8步,双击打开 Load Balance,配置负载均衡(示例2个节点权重各占50%),并选择右上角的 应用

  • 第9步,双击打开 Caching,配置缓存(示例 取消缓存),并选择右上角的 应用

后续工作

站点优化

  • 第10步,修改DNS解析,将域名指向配置了arr模块的节点ip,也就是示例中的 site01 对应的ip
  • 第11步,考虑到这个proxy站点承担了所有后端站点的请求转发,建议对这个proxy站点做如下的优化:
1. 将 最大用户进程数 从默认的1改为5,只是端口转发,很快就响应完了,开太多也浪费内存。
2. 将 队列长度 从默认的1000改为20000

故障演练

测试的时候,通过本机绑定host来测试,参考如下:

type NUL > C:\Windows\system32\drivers\etc\hosts
echo 192.168.3.211 xxx.abc.com > C:\Windows\system32\drivers\etc\hosts
type C:\Windows\system32\drivers\etc\hosts
  • 场景1:由于第8步配置了权重各50%,且第9步取消了缓存,正常情况下访问站点,命中率应该各50%。

经确认,确实如此。

  • 场景2:将节点2的后端站点(就是 xxx.abc.com 这个站点)停掉,再次访问站点,所有的请求都落到了后端站点1上。

  • 场景3:将节点1的后端站点(就是 xxx.abc.com 这个站点)停掉,再次访问站点,所有的请求都落到了后端站点2上。

  • 场景4:将节点1的proxy站点(就是监听了80端口的站点)停掉,再次访问站点则提示“无法访问此页面

遇到的问题

  • 问题1:最初2个后端站点默认配置了80端口,配置入站规则之后,负载均衡并没有生效。后来调整了后端站点的端口为8001,在分发服务器上创建 proxy 站点并配置80端口(详细参考第1、2、7步),才实现了预期目标。
  • 问题2:由于默认的caching策略,浏览器客户端会有缓存,导致请求命中率并非各50%,后来关闭了cache并将 Memory cache duration 从默认60秒改为1秒(详细参考第9步),才实现了预期目标。
Copyright © www.sqlfans.cn 2024 All Right Reserved更新时间: 2023-05-16 19:29:35

results matching ""

    No results matching ""