本教程是系列教程中的第三篇,可帮助您使用 Microsoft Active Directory、SQL Server 和互联网信息服务 (IIS) 部署高可用性 Windows 架构。在本教程中,您将设置两个在同一地区内的不同区域运行的 IIS Web 服务器。然后,需要将 Web 服务器连接到 SQL Server 可用性组和网域控制器。在负载平衡器后面设置 Web 服务器可以降低单个服务器的负载。如果其中一个服务器离线,您仍可以让应用保持运行状态。
本系列教程包含以下内容:
- 部署容错 Microsoft Active Directory 环境
- 部署多子网 SQL Server
- 部署负载平衡 IIS 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 网络中。请确保工作站上已安装以下各项:
- Visual Studio 2013 或更高版本
- Git
- Tools for Visual Studio。您可以从链接页下载这些工具。
初始化通用变量
在本系列教程的第一篇中,您定义了多个变量来控制基础架构元素在 Google Cloud 中的部署位置。验证变量是否仍正确设置,是否与您之前设置的值一致。
打开 Cloud Shell。
在 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 地址范围,这些范围之后可以根据各个子网提供可选的防火墙政策。
在 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
创建内部防火墙规则,以允许内部 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 应用的目标。
创建第一个服务器
转到 Google Cloud Marketplace。
在 Google Cloud 控制台中,选择您希望在其中运行 Web 服务器的 Google Cloud 项目。由于本教程是基于上一个集构建的,因此请在本教程中使用与上一个教程相同的项目。
在页面中设置以下值:
- 部署名称:
webserver1
- 地区:zone_1
- Windows Server 操作系统版本:2016
- 启动类型:SSD 永久性磁盘
- 磁盘大小:200 GB
- 网络名称:vpc_name
- 子网名称:
public-webapp-zone
- 防火墙:允许 WebDeploy 流量、允许 HTTP 流量
将 zone_1 和 vpc_name 替换为您之前初始化变量时使用的值。
- 部署名称:
点击部署,然后等待 Google Cloud 控制台指示部署已完成。
连接到服务器实例
在 Cloud Shell 中,为
webserver1
实例创建密码:gcloud compute reset-windows-password webserver1 \ --zone $zone_1 \ --project $project_id \ --quiet
使用远程桌面协议 (RDP) 连接到新的 Windows 实例。使用您在上一步中创建的凭据。
配置服务器实例
在
webserver1
实例上,以管理员身份打开 PowerShell 终端。为 DNS IP 地址和域名设置变量:
$DNS1 = "10.1.0.100" $DNS2 = "10.2.0.100" $DomainName = "example-gcp.com"
创建一个名为
webapp.service
的本地服务帐号,稍后您将用它来发布 Web 应用:net user webapp.service * /add
出现提示时,输入一个密码。请使用安全系数高的密码,并将其存储在安全的位置以备将来使用。
启用该帐号并将其加添到“管理员”本地组:
net user webapp.service /active:yes net localgroup administrators webapp.service /add
配置 DNS 服务器:
netsh interface ip set dns Ethernet static $DNS1 netsh interface ip add dns Ethernet $DNS2 index=2
将 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.
重新启动虚拟机:
Restart-Computer
这会关闭您打开的 RDP 会话。
创建第二个服务器实例并对其进行配置
现在,您需要重复上述过程,以创建第二个服务器实例。
使用以下值重复服务器创建过程:
- 部署名称:
webserver2
- 地区:zone_2
- 机器类型:2 个 vCPU
- Windows Server 操作系统版本:2016
- 启动类型:SSD 永久性磁盘
- 磁盘大小:200 GB
- 网络名称:vpc_name
- 子网名称:
public-webapp-zone
- 防火墙:允许 WebDeploy 流量、允许 HTTP 流量
将 zone_2 和 vpc_name 替换为您之前初始化变量时使用的值。
- 部署名称:
为
webserver2
Windows 实例创建密码:gcloud compute reset-windows-password webserver2 \ --zone $zone_2\ --project $project_id \ --quiet
此步骤将为您的用户帐号设置用于连接 RDP 的密码。用户名是您的 Google 帐号名称(即
gcloud config get-value core/account
命令返回的用户名)。记下用户名和密码,以便稍后在本教程中使用。使用 RDP 连接到实例。使用您在上一步中创建的凭据。
连接到
webserver2
实例。按照第一个实例中使用的步骤操作,不过需使用您为第二个服务器实例创建的密码。配置
webserver2
实例。按照第一个实例的配置步骤操作。使用相同的密码创建相同的服务帐号。
克隆 Web 应用
下一项任务是配置每个 IIS 服务器并为其部署一个示例 ASP.NET 应用。Web 应用具有可用于自动连接到上一教程中配置的 SQL Server 实例的凭据。
确保您已登录安装了 Visual Studio 和 Git 的 Windows 工作站。
在 Windows 工作站的命令窗口中,将示例源代码库克隆到该工作站:
cd c:\ git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git cd getting-started-dotnet git checkout ad49d787eec88fb30a4b45b4146f5cb63c0519e
转到以下文件夹:
C:\getting-started-dotnet\aspnet\2-structured-data
要在 Visual Studio 中打开示例应用解决方案,请双击
2-structured-data.sln
文件。在解决方案资源管理器窗格中,双击
Web.config
文件以将其打开。将
GoogleCloudSamples:ProjectId
键设置为项目 ID。对于项目 ID
webapp-sql-ad
,该行类似于以下内容:<add key="GoogleCloudSamples:ProjectId" value="webapp-sql-ad" />
将
GoogleCloudSamples:BookStore
值设置为sqlserver
:<add key="GoogleCloudSamples:BookStore" value="sqlserver" />
在文件末尾附近的
<connectionStrings>
下,找到具有name="LocalSqlServer"
属性的connectionStrings
XML 子元素。之后,执行以下操作:- 将
connectionString
值更新为 SQL Server 可用性组监听器的名称,即sql-listener
。(您可以在本教程系列的部署多子网 SQL Server 中设置此监听器。) - 将
Initial Catalog
更改为bookshelf
。 - 将
Integrated Security
设置为True
。 - 使用您在设置数据库时为数据库服务帐号创建的用户名和登录密码。
- 将
保存并关闭
Web.config
文件。要构建解决方案,请在 Visual Studio 菜单中,点击构建 > 构建解决方案。
部署 ASP.NET 应用
在本部分中,您需要将 Web 应用部署到两个 Web 服务器。
在工作站上,如果您关闭了
2-structured-data.sln
文件,请将其重新打开。在以下文件夹中找到该文件,然后双击该文件:C:\getting-started-dotnet\aspnet\2-structured-data
在 Visual Studio 中,点击工具 > Google Cloud Tools > Google Cloud Explorer。
选择您正在处理的项目,然后展开 Google Compute Engine。
右键点击
webserver1
实例。选择管理 Windows 凭据 (Manage Windows Credentials)。
点击添加凭据。
输入用户名
webapp.service
。选择我拥有此用户的密码 (I have password for this user),然后输入您之前在启动 Web 服务器时创建的密码。
确认未选中为我创建密码 (Create a password for me),然后点击保存。
要关闭 Windows 凭据窗口,请点击关闭。
关闭 Google Cloud Explorer。
在 Visual Studio 中,点击工具 > Google Cloud Tools > 将 2-structured-data 发布到 Google Cloud (Publish 2-structured-data to Google Cloud)。
在发布对话框中,选择 Compute Engine。
选择
webserver1
虚拟机,然后将凭据设置为webapp.service
。要构建和部署示例应用,请点击发布。
示例应用发布后,Visual Studio 会在默认的网络浏览器中打开该应用。
对
webserver2
重复此过程。
设置负载均衡
现在,您可以为 Web 服务器设置网络负载均衡。在此过程中,您需要向负载均衡器添加健康检查。全局负载均衡器会自动在 IIS 服务器之间分配请求。此外,如果其中一个 IIS 服务器未通过健康检查且处于离线状态,则负载均衡器会自动将流量定向到其他服务器。
在 Cloud Shell 中,为负载均衡器创建静态外部 IP 地址:
gcloud compute addresses create webapp-lb-ip \ --region $region \ --project $project_id
虚拟机实例会接收发往此 IP 地址的数据包。
添加 HTTP 健康检查对象:
gcloud compute http-health-checks create bookshelf-check \ --project $project_id \ --request-path /Books
此示例使用健康检查机制的默认设置。您可以自定义这些设置。您可以指定
/Books
请求路径,因为这是示例 Web 应用使用的路径。添加与虚拟机实例位于同一地区的目标池。目标池需要健康检查服务才能正常运行;请使用您在第 2 步中针对此目标池创建的健康检查对象。
gcloud compute target-pools create books-lb \ --region $region \ --http-health-check bookshelf-check \ --project $project_id
将 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
目标池中的各个实例必须位于同一地区中。不过,这些实例可以位于同一地区的不同区域中。
添加转发规则,以代表指向目标池的外部 IP 地址和端口范围:
gcloud compute forwarding-rules create www-rule \ --region $region \ --ports 80 \ --address webapp-lb-ip \ --target-pool books-lb \ --project $project_id
将流量发送到实例
配置负载均衡服务后,您便可以开始将流量发送到负载均衡器。
- 设置负载均衡后,请等待至少一分钟时间,以便配置完全加载。
在 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
复制
ipAddress
值,该值是负载均衡器的 IP 地址。在浏览器窗口中,输入负载均衡器 IP 地址。
如果一切正常,您会看到已部署的 ASP.NET Web 应用的默认页:
测试负载均衡和冗余
现在您可以验证组件离线时的集群行为。您可以选择关停 Active Directory、SQL Server 和 IIS 服务器的实例,在多个级层测试负载平衡和冗余。
在 Google Cloud 控制台中,转到“虚拟机实例”页面:
为 Active Directory、SQL Server 或 IIS 选择一个实例。您可以选择这些实例中的任意一个,以模拟离线组件。
点击停止。
在浏览器窗口中,再次输入负载均衡器 IP 地址。
您会看到默认的 Bookshelf 应用页面。这表示即使基础架构的组件不再可用,应用仍可运行。
(可选)对其他组件重复第 2 步和第 3 步。例如,如果您之前关停 SQL Server 实例,这次则关停 IIS 实例。
只要每个组件的一个实例正在运行,应用就会继续运作。
清除数据
完成本教程后,您可以清理您创建的 Google Cloud 资源,以免这些资源日后产生费用。您可以删除整个项目,也可以删除资源。以下部分介绍如何删除这些资源。
删除项目
删除项目中的资源
在本教程开始时,您定义了变量,用于控制基础架构元素的部署位置。您将在本部分中使用这些变量进行清理。确保设置了以下变量:
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。
删除您在本教程中创建的虚拟机:
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
删除您在本教程中创建的防火墙规则和路由:
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
删除 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
删除 VPC 网络:
gcloud compute networks delete $vpc_name \ --project $project_id \ --quiet
删除您创建的负载均衡器静态 IP 地址:
gcloud compute addresses delete webapp-lb-ip \ --region $region \ --project $project_id \ --quiet
删除负载均衡器基础架构:
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
后续步骤
- 查看设计可扩缩的高可用性工作负载的最佳实践。
- 探索有关 Google Cloud 的参考架构、图表和最佳做法。查看我们的 Cloud Architecture Center。