部署负载平衡 IIS Web 服务器


本教程是系列教程中的第三篇,可帮助您使用 Microsoft Active Directory、SQL Server 和互联网信息服务 (IIS) 部署高可用性 Windows 架构。在本教程中,您将设置两个在同一地区内的不同区域运行的 IIS Web 服务器。然后,需要将 Web 服务器连接到 SQL Server 可用性组和网域控制器。在负载平衡器后面设置 Web 服务器可以降低单个服务器的负载。如果其中一个服务器离线,您仍可以让应用保持运行状态。

本系列教程包含以下内容:

您可以在 Google Cloud 项目上设置网域控制器和 SQL Server 实例。此部署中的每个组件还可与网域控制器提供的 Windows 身份验证安全集成。

本教程中介绍的架构适合在 Google Cloud 上运行。但某些组件(如 Active Directory 和 SQL Server)可在本地运行。本教程仅介绍在 Google Cloud 上运行所有组件的场景。

目标

  • 创建跨两个区域的两个网络子网。
  • 在每个区域中部署 Microsoft SQL Server 虚拟机。
  • 配置每个 SQL Server 实例以加入 Active Directory 网域。
  • 创建 Windows Server 故障转移集群。
  • 创建和配置 SQL Server bookshelf 示例数据库。
  • 设置 SQL Server Always On 可用性组。

费用

在本教程中,您将继续使用在之前教程中配置的 Google Cloud 资源。您会使用以下收费组件:

价格计算器估算,该环境的费用约为 $4/天。

准备工作

您在本教程中使用的配置要求您能够访问一个 Windows 网域控制器和一个正在运行的 Active Directory 网域。如果您还没有此环境,请完成以下教程中的步骤:

对于本教程的各个部分,请在 Windows 工作站上执行任务。它可以是您的本地计算机,且不必位于您用于 IIS Web 服务器的 VPC 网络中。请确保工作站上已安装以下各项:

初始化通用变量

在本系列教程的第一篇中,您定义了多个变量来控制基础架构元素在 Google Cloud 中的部署位置。验证变量是否仍正确设置,是否与您之前设置的值一致。

  1. 打开 Cloud Shell。

    打开 Cloud Shell

  2. 在 Cloud Shell 中创建以下环境变量,以设置在本教程后面的部分需要使用的值。

    这些命令将地区设置为 us-east1。如果您在上一个教程中使用了其他地区,请更改此脚本中的地区,使其与之前使用的地区匹配。

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    your-project-id 替换为您正在使用的 Google Cloud 项目的 ID。

创建网络基础架构

在本部分中,您需要将子网添加到现有的 Virtual Private Cloud (VPC) 网络。(您在之前的教程中创建了 VPC 网络。)这些子网提供为 Web 服务器实例分配的唯一 IP 地址范围,这些范围之后可以根据各个子网提供可选的防火墙政策。

  1. 在 Cloud Shell 中,将子网添加到现有 VPC 网络:

    gcloud compute networks subnets create public-webapp-zone \
        --network $vpc_name \
        --region $region \
        --range 10.5.0.0/24 \
        --project $project_id
    
  2. 创建内部防火墙规则,以允许内部 IP 地址之间的流量:

    gcloud compute firewall-rules create  allow-internal-ports-public-webapp \
        --network $vpc_name \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 10.5.0.0/24 \
        --project $project_id
    

启动 Web 服务器

您可以使用 Google Cloud Marketplace 中的映像来预配您的 Web 服务器。预配 Web 服务器后,您可以将其用作部署 Web 应用的目标。

创建第一个服务器

  1. 转到 Google Cloud Marketplace。

    转到 Google Cloud Marketplace

  2. 在 Google Cloud 控制台中,选择您希望在其中运行 Web 服务器的 Google Cloud 项目。由于本教程是基于上一个集构建的,因此请在本教程中使用与上一个教程相同的项目。

  3. 在页面中设置以下值:

    • 部署名称:webserver1
    • 地区:zone_1
    • Windows Server 操作系统版本:2016
    • 启动类型:SSD 永久性磁盘
    • 磁盘大小:200 GB
    • 网络名称:vpc_name
    • 子网名称:public-webapp-zone
    • 防火墙:允许 WebDeploy 流量允许 HTTP 流量

    zone_1vpc_name 替换为您之前初始化变量时使用的值。

  4. 点击部署,然后等待 Google Cloud 控制台指示部署已完成。

连接到服务器实例

  1. 在 Cloud Shell 中,为 webserver1 实例创建密码:

    gcloud compute reset-windows-password webserver1 \
        --zone $zone_1 \
        --project $project_id \
        --quiet
    
  2. 使用远程桌面协议 (RDP) 连接到新的 Windows 实例。使用您在上一步中创建的凭据。

配置服务器实例

  1. webserver1 实例上,以管理员身份打开 PowerShell 终端。

  2. 为 DNS IP 地址和域名设置变量:

    $DNS1 = "10.1.0.100"
    $DNS2 = "10.2.0.100"
    $DomainName = "example-gcp.com"
    
  3. 创建一个名为 webapp.service 的本地服务帐号,稍后您将用它来发布 Web 应用:

    net user webapp.service * /add
    

    出现提示时,输入一个密码。请使用安全系数高的密码,并将其存储在安全的位置以备将来使用。

  4. 启用该帐号并将其加添到“管理员”本地组:

    net user webapp.service /active:yes
    net localgroup administrators webapp.service /add
    
  5. 配置 DNS 服务器:

    netsh interface ip set dns Ethernet static $DNS1
    netsh interface ip add dns Ethernet $DNS2 index=2
    
  6. 将 Web 服务器联接到 example-gcp.com 网域:

    Add-Computer -DomainName $DomainName -Credential (Get-Credential "example\Administrator")
    

    出现提示时,输入管理员帐号的密码。这是您在本系列教程的第一篇教程中创建 Active Directory 林时使用的网域帐号。请使用安全系数高的密码,并将其存储在安全的位置以备将来使用。

    您可以忽略以下错误消息:

    WARNING: The changes will take effect after you restart the computer webserver1.
    
  7. 重新启动虚拟机:

    Restart-Computer
    

    这会关闭您打开的 RDP 会话。

创建第二个服务器实例并对其进行配置

现在,您需要重复上述过程,以创建第二个服务器实例。

  1. 使用以下值重复服务器创建过程

    • 部署名称:webserver2
    • 地区:zone_2
    • 机器类型:2 个 vCPU
    • Windows Server 操作系统版本:2016
    • 启动类型:SSD 永久性磁盘
    • 磁盘大小:200 GB
    • 网络名称:vpc_name
    • 子网名称:public-webapp-zone
    • 防火墙:允许 WebDeploy 流量允许 HTTP 流量

    zone_2vpc_name 替换为您之前初始化变量时使用的值。

  2. webserver2 Windows 实例创建密码:

    gcloud compute reset-windows-password webserver2 \
        --zone $zone_2\
        --project $project_id \
        --quiet
    

    此步骤将为您的用户帐号设置用于连接 RDP 的密码。用户名是您的 Google 帐号名称(即 gcloud config get-value core/account 命令返回的用户名)。记下用户名和密码,以便稍后在本教程中使用。

  3. 使用 RDP 连接到实例。使用您在上一步中创建的凭据。

  4. 连接到 webserver2 实例。按照第一个实例中使用的步骤操作,不过需使用您为第二个服务器实例创建的密码。

  5. 配置 webserver2 实例。按照第一个实例的配置步骤操作。使用相同的密码创建相同的服务帐号。

克隆 Web 应用

下一项任务是配置每个 IIS 服务器并为其部署一个示例 ASP.NET 应用。Web 应用具有可用于自动连接到上一教程中配置的 SQL Server 实例的凭据。

  1. 确保您已登录安装了 Visual Studio 和 Git 的 Windows 工作站。

  2. 在 Windows 工作站的命令窗口中,将示例源代码库克隆到该工作站:

    cd c:\
    git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git
    cd getting-started-dotnet
    git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
    
  3. 转到以下文件夹:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  4. 要在 Visual Studio 中打开示例应用解决方案,请双击 2-structured-data.sln 文件。

  5. 解决方案资源管理器窗格中,双击 Web.config 文件以将其打开。

  6. GoogleCloudSamples:ProjectId 键设置为项目 ID。

    对于项目 ID webapp-sql-ad,该行类似于以下内容:

    <add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
    
  7. GoogleCloudSamples:BookStore 值设置为 sqlserver

    <add key="GoogleCloudSamples:BookStore" value="sqlserver" />
    
  8. 在文件末尾附近的 <connectionStrings> 下,找到具有 name="LocalSqlServer" 属性的 connectionStrings XML 子元素。之后,执行以下操作:

    • connectionString 值更新为 SQL Server 可用性组监听器的名称,即 sql-listener。(您可以在本教程系列的部署多子网 SQL Server 中设置此监听器。)
    • Initial Catalog 更改为 bookshelf
    • Integrated Security 设置为 True
    • 使用您在设置数据库时为数据库服务帐号创建的用户名和登录密码。
  9. 保存并关闭 Web.config 文件。

  10. 要构建解决方案,请在 Visual Studio 菜单中,点击构建 > 构建解决方案

部署 ASP.NET 应用

在本部分中,您需要将 Web 应用部署到两个 Web 服务器。

  1. 在工作站上,如果您关闭了 2-structured-data.sln 文件,请将其重新打开。在以下文件夹中找到该文件,然后双击该文件:

    C:\getting-started-dotnet\aspnet\2-structured-data
    
  2. 在 Visual Studio 中,点击工具 > Google Cloud Tools > Google Cloud Explorer

  3. 选择您正在处理的项目,然后展开 Google Compute Engine

  4. 右键点击 webserver1 实例。

  5. 选择管理 Windows 凭据 (Manage Windows Credentials)。

  6. 点击添加凭据

  7. 输入用户名 webapp.service

  8. 选择我拥有此用户的密码 (I have password for this user),然后输入您之前在启动 Web 服务器时创建的密码。

  9. 确认未选中为我创建密码 (Create a password for me),然后点击保存

  10. 要关闭 Windows 凭据窗口,请点击关闭

  11. 关闭 Google Cloud Explorer

  12. 在 Visual Studio 中,点击工具 > Google Cloud Tools > 将 2-structured-data 发布到 Google Cloud (Publish 2-structured-data to Google Cloud)。

  13. 发布对话框中,选择 Compute Engine

  14. 选择 webserver1 虚拟机,然后将凭据设置为 webapp.service

  15. 要构建和部署示例应用,请点击发布

    示例应用发布后,Visual Studio 会在默认的网络浏览器中打开该应用。

  16. webserver2 重复此过程。

设置负载均衡

现在,您可以为 Web 服务器设置网络负载均衡。在此过程中,您需要向负载均衡器添加健康检查。全局负载均衡器会自动在 IIS 服务器之间分配请求。此外,如果其中一个 IIS 服务器未通过健康检查且处于离线状态,则负载均衡器会自动将流量定向到其他服务器。

  1. 在 Cloud Shell 中,为负载均衡器创建静态外部 IP 地址:

    gcloud compute addresses create webapp-lb-ip \
        --region $region \
        --project $project_id
    

    虚拟机实例会接收发往此 IP 地址的数据包。

  2. 添加 HTTP 健康检查对象:

    gcloud compute http-health-checks create bookshelf-check \
        --project $project_id \
        --request-path /Books
    

    此示例使用健康检查机制的默认设置。您可以自定义这些设置。您可以指定 /Books 请求路径,因为这是示例 Web 应用使用的路径。

  3. 添加与虚拟机实例位于同一地区的目标池。目标池需要健康检查服务才能正常运行;请使用您在第 2 步中针对此目标池创建的健康检查对象。

    gcloud compute target-pools create books-lb \
        --region $region \
        --http-health-check bookshelf-check \
        --project $project_id
    
  4. 将 IIS 服务器实例添加到目标池:

    gcloud compute target-pools add-instances books-lb \
        --instances webserver1 \
        --instances-zone $zone_1 \
        --project $project_id
    
    gcloud compute target-pools add-instances books-lb \
        --instances webserver2 \
        --instances-zone $zone_2 \
        --project $project_id
    

    目标池中的各个实例必须位于同一地区中。不过,这些实例可以位于同一地区的不同区域中。

  5. 添加转发规则,以代表指向目标池的外部 IP 地址和端口范围:

    gcloud compute forwarding-rules create www-rule \
        --region $region \
        --ports 80 \
        --address webapp-lb-ip \
        --target-pool books-lb \
        --project $project_id
    

将流量发送到实例

配置负载均衡服务后,您便可以开始将流量发送到负载均衡器。

  1. 设置负载均衡后,请等待至少一分钟时间,以便配置完全加载。
  2. 在 Cloud Shell 中,检查负载均衡器中实例的运行状况:

    gcloud compute target-pools get-health books-lb \
        --region $region \
        --project $project_id
    

    输出类似于以下内容:

    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-c/instances/webserver1
    ipAddress: 35.190.170.76
    kind: compute#targetPoolInstanceHealth
    ---
    healthStatus:
    - healthState: HEALTHY
    instance: https://www.googleapis.com/compute/v1/projects/sales-enablement-support/zones/us-east1-b/instances/webserver2
    ipAddress: 35.190.170.76
    
  3. 复制 ipAddress 值,该值是负载均衡器的 IP 地址。

  4. 在浏览器窗口中,输入负载均衡器 IP 地址。

    如果一切正常,您会看到已部署的 ASP.NET Web 应用的默认页:

    Bookshelf 应用的默认网页。

测试负载均衡和冗余

现在您可以验证组件离线时的集群行为。您可以选择关停 Active Directory、SQL Server 和 IIS 服务器的实例,在多个级层测试负载平衡和冗余。

  1. 在 Google Cloud 控制台中,转到“虚拟机实例”页面:

    转到“虚拟机实例”页面

  2. 为 Active Directory、SQL Server 或 IIS 选择一个实例。您可以选择这些实例中的任意一个,以模拟离线组件。

    为此架构创建的映像的列表。

  3. 点击停止

  4. 在浏览器窗口中,再次输入负载均衡器 IP 地址。

    您会看到默认的 Bookshelf 应用页面。这表示即使基础架构的组件不再可用,应用仍可运行。

  5. (可选)对其他组件重复第 2 步和第 3 步。例如,如果您之前关停 SQL Server 实例,这次则关停 IIS 实例。

    只要每个组件的一个实例正在运行,应用就会继续运作。

清除数据

完成本教程后,您可以清理您创建的 Google Cloud 资源,以免这些资源日后产生费用。您可以删除整个项目,也可以删除资源。以下部分介绍如何删除这些资源。

删除项目

  • In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  • In the project list, select the project that you want to delete, and then click Delete.
  • In the dialog, type the project ID, and then click Shut down to delete the project.
  • 删除项目中的资源

    在本教程开始时,您定义了变量,用于控制基础架构元素的部署位置。您将在本部分中使用这些变量进行清理。确保设置了以下变量:

    region=us-east1
    zone_1=${region}-b
    zone_2=${region}-c
    vpc_name=webappnet
    project_id=your-project-id
    

    your-project-id 替换为您正在使用的 Google Cloud 项目的 ID。

    1. 删除您在本教程中创建的虚拟机:

      gcloud compute instances delete ad-dc1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete ad-dc2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete cluster-sql2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver1 \
          --zone $zone_1 \
          --project $project_id \
          --quiet
      
      gcloud compute instances delete webserver2 \
          --zone $zone_2 \
          --project $project_id \
          --quiet
      
    2. 删除您在本教程中创建的防火墙规则和路由:

      gcloud compute firewall-rules delete \
          allow-internal-ports-private-ad \
          allow-internal-ports-private-sql \
          allow-internal-ports-public-webapp \
          allow-rdp \
        --project $project_id \
        --quiet
      
      gcloud compute firewall-rules delete \
          webserver1-tcp-80 \
          webserver1-tcp-8172 \
          webserver2-tcp-80 \
          webserver2-tcp-8172 \
        --project $project_id \
        --quiet
      
      gcloud compute routes delete \
          cluster-sql1-route \
          cluster-sql1-route-listener \
          cluster-sql2-route \
          cluster-sql2-route-listener \
        --project $project_id \
        --quiet
      
    3. 删除 VPC 网络中的子网:

      gcloud compute networks subnets delete \
          --region $region \
          private-ad-zone-a \
          private-ad-zone-b \
          private-sql-zone-a \
          private-sql-zone-b \
          public-webapp-zone \
        --project $project_id \
        --quiet
      
    4. 删除 VPC 网络:

      gcloud compute networks delete $vpc_name \
          --project $project_id \
          --quiet
      
    5. 删除您创建的负载均衡器静态 IP 地址:

      gcloud compute addresses delete webapp-lb-ip \
          --region $region \
          --project $project_id \
          --quiet
      
    6. 删除负载均衡器基础架构:

      gcloud compute forwarding-rules delete www-rule \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute target-pools delete books-lb \
          --region $region \
          --project $project_id \
          --quiet
      gcloud compute http-health-checks delete bookshelf-check \
          --project $project_id \
          --quiet
      

    后续步骤