通过 Microsoft SQL Server Always On 可用性组,您可以跨多个 SQL Server Enterprise 实例复制数据库。
与 SQL Server 故障切换集群实例类似,Always On 可用性组使用 Windows Server 故障切换集群 (WSFC) 来实现高可用性。不过,这两种功能在以下方面有所不同:
Always On 可用性组 | 故障切换集群实例 | |
---|---|---|
故障切换的范围 | 数据库组 | 实例 |
存储 | 未共享 | 已共享 |
如需详细了解比较,请参阅故障切换集群实例与可用性组的比较。
Always On 可用性组支持多种可用性模式。本教程介绍如何在同步提交模式中部署 Always On 可用性组,以便为一个或多个数据库实现高可用性。
在设置过程中,您将创建三个虚拟机实例。node-1
和 node-2
两个虚拟机实例可充当集群节点并运行 SQL Server。第三个虚拟机实例 witness
用于在故障切换情景中实现仲裁。三个虚拟机实例分布在三个可用区,并且共享一个子网。
使用 SQL Server Always On 可用性组,您可以跨两个 SQL Server 实例同步复制示例数据库 bookshelf
。
在本地 Windows 集群环境中,地址解析协议 (ARP) 通知会触发IP 地址故障切换。但是,Google Cloud会忽略 ARP 通知。因此,您必须实现以下两个选项之一:使用内部负载均衡器和分布式网络名称 (DNN)。
本文假定您已在 Google Cloud上部署了 Active Directory,而且您已基本掌握 SQL Server、Active Directory 和 Compute Engine。如需详细了解 Google Cloud上的 Active Directory,请参阅开始前须知部分。
使用 SQL Server Always On 可用性组,您可以跨两个 SQL Server 实例同步复制示例数据库 bookshelf
。内部负载均衡器可确保将流量定向到活跃节点。
如需详细了解带内部负载均衡器的 Windows Server 故障切换集群,请参阅故障切换集群。
该图包含以下部分:
- 两个虚拟机实例位于同一区域的不同可用区,分别称为
node-1
和node-2
,用于故障切换集群。其中一个节点托管 SQL Server 数据库的主副本,而另一个节点托管辅助副本。 - 第三个名为
witness
的虚拟机充当文件共享见证者,用于提供决定性投票权,实现故障切换所需的仲裁。 - 集群前面的内部负载均衡器为 SQL Server 客户端提供单个端点,并使用健康检查来确保流量定向到活跃节点。
目标
本教程旨在实现以下目标:
费用
本教程使用 Google Cloud的收费组件,包括:
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
如需完成本教程中的任务,请确保:
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- 您拥有至少一台网域控制器的 Active Directory 网域。您可以使用代管式 Microsoft AD 创建 Active Directory 域。 或者,您也可以在 Compute Engine 上部署自定义 Active Directory 环境,并设置专用 DNS 转发可用区,用于将 DNS 查询转发到您的网域控制器。
-
您有一个 Active Directory 用户,该用户有权将计算机加入网域并且能够使用 RDP 登录。如果您使用的是代管式 Microsoft AD,则可以使用
setupadmin
用户。如需详细了解 Active Directory 用户账号预配,请参阅 Active Directory 用户账号预配 - Google Cloud 项目和连接到您的 Active Directory 域控制器的虚拟私有云 (VPC)。
- 用于 Windows Server 故障转移集群虚拟机实例的子网。
准备项目和网络
如需部署 SQL Server Always On 可用性组,您必须准备Google Cloud 项目和 VPC 以进行部署。以下部分详细介绍了如何执行此操作。
配置您的项目和区域
如需准备 Google Cloud 项目以部署 SQL Server Always On 可用性组,请执行以下操作:
在 Google Cloud 控制台中,点击激活 Cloud Shell
按钮,打开 Cloud Shell。
初始化以下变量。
VPC_NAME=
VPC_NAME
SUBNET_NAME=SUBNET_NAME
替换以下内容:
VPC_NAME
:您的 VPC 的名称SUBNET_NAME
:您的子网的名称
设置默认项目 ID。
gcloud config set project
PROJECT_ID
将
PROJECT_ID
替换为您的 Google Cloud 项目的 ID。设置默认区域。
gcloud config set compute/region
REGION
将
REGION
替换为要在其中部署的区域的 ID。
创建防火墙规则
如需允许客户端连接到 SQL Server 并允许集群节点之间进行通信,您需要创建多个防火墙规则。您可以使用网络标记来简化这些防火墙规则的创建操作,如下所示:
- 两个集群节点由
wsfc-node
标记注释。 - 所有服务器(包括
witness
)均由wsfc
标记注释。
如需创建使用这些网络标记的防火墙规则,请按以下步骤操作:
- 返回到现有的 Cloud Shell 会话。
创建防火墙规则,以允许在集群节点之间传递流量。
SUBNET_CIDR=$(gcloud compute networks subnets describe $SUBNET_NAME --format=value\('ipCidrRange'\)) gcloud compute firewall-rules create allow-all-between-wsfc-nodes \ --direction=INGRESS \ --action=allow \ --rules=tcp,udp,icmp \ --enable-logging \ --source-tags=wsfc \ --target-tags=wsfc \ --network=$VPC_NAME \ --priority 10000 gcloud compute firewall-rules create allow-sql-to-wsfc-nodes \ --direction=INGRESS \ --action=allow \ --rules=tcp:1433 \ --enable-logging \ --source-ranges=$SUBNET_CIDR \ --target-tags=wsfc-node \ --network=$VPC_NAME \ --priority 10000
创建虚拟机实例
为故障切换集群创建并部署两个虚拟机实例。在任意时间点,其中一个虚拟机托管 SQL Server 数据库的主副本,而另一个节点托管辅助副本。这两个虚拟机实例必须:
- 位于同一区域,以便内部直通式网络负载平衡器可以访问它们。
- 安装了 Windows Server 故障切换集群和 SQL Server。
- 已启用 Compute Engine WSFC 支持。
使用预安装了 SQL Server 2022 的 SQL Server 高级映像。
为了在故障切换情景中提供决定性投票权,实现仲裁,请按照以下步骤部署第三个虚拟机作为文件共享见证者:
- 返回到现有的 Cloud Shell 会话。
为 WSFC 节点创建专用脚本。此脚本会安装必要的 Windows 功能,并为 WSFC 和 SQL Server 创建防火墙规则。
cat << "EOF" > specialize-node.ps1 $ErrorActionPreference = "stop" # Install required Windows features Install-WindowsFeature Failover-Clustering -IncludeManagementTools Install-WindowsFeature RSAT-AD-PowerShell # Open firewall for WSFC netsh advfirewall firewall add rule name="Allow WSFC health check" dir=in action=allow protocol=TCP localport=59998 # Open firewall for SQL Server netsh advfirewall firewall add rule name="Allow SQL Server" dir=in action=allow protocol=TCP localport=1433 # Open firewall for SQL Server replication netsh advfirewall firewall add rule name="Allow SQL Server replication" dir=in action=allow protocol=TCP localport=5022 # Format data disk Get-Disk | Where partitionstyle -eq 'RAW' | Initialize-Disk -PartitionStyle MBR -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel 'Data' -Confirm:$false # Create data and log folders for SQL Server md d:\Data md d:\Logs EOF
创建虚拟机实例。在充当集群节点的两个虚拟机上,通过将元数据键
enable-wsfc
设置为true
,再挂接一个数据磁盘并启用 Windows Server 故障切换集群:REGION=$(gcloud config get-value compute/region) ZONE1=
ZONE1
ZONE2=ZONE2
ZONE3=ZONE3
PD_SIZE=200 MACHINE_TYPE=n2-standard-8 gcloud compute instances create node-1 \ --zone $ZONE1 \ --machine-type $MACHINE_TYPE \ --subnet $SUBNET_NAME \ --image-family sql-ent-2022-win-2022 \ --image-project windows-sql-cloud \ --tags wsfc,wsfc-node \ --boot-disk-size 50 \ --boot-disk-type pd-ssd \ --boot-disk-device-name "node-1" \ --create-disk=name=node-1-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \ --metadata enable-wsfc=true \ --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1 gcloud compute instances create node-2 \ --zone $ZONE2 \ --machine-type $MACHINE_TYPE \ --subnet $SUBNET_NAME \ --image-family sql-ent-2022-win-2022 \ --image-project windows-sql-cloud \ --tags wsfc,wsfc-node \ --boot-disk-size 50 \ --boot-disk-type pd-ssd \ --boot-disk-device-name "node-2" \ --create-disk=name=node-2-datadisk,size=$PD_SIZE,type=pd-ssd,auto-delete=no \ --metadata enable-wsfc=true \ --metadata-from-file=sysprep-specialize-script-ps1=specialize-node.ps1 gcloud compute instances create "witness" \ --zone $ZONE3 \ --machine-type e2-medium \ --subnet $SUBNET_NAME \ --image-family=windows-2022 \ --image-project=windows-cloud \ --tags wsfc \ --boot-disk-size 50 \ --boot-disk-type pd-ssd \ --metadata sysprep-specialize-script-ps1="add-windowsfeature FS-FileServer"根据您使用的可用区替换 ZONE1、ZONE2、ZONE3。
若要将 3 个虚拟机实例加入 Active Directory,请对 3 个虚拟机实例中的每个实例执行以下操作:
通过查看虚拟机的串行端口输出来监控其初始化过程。
gcloud compute instances tail-serial-port-output
NAME
将
NAME
替换为虚拟机实例的名称。等待几分钟,直到您看到输出
Instance setup finished
,然后按 Ctrl+C。此时,该虚拟机实例已准备就绪,可以使用了。为虚拟机实例创建用户名和密码。
使用远程桌面连接到虚拟机,然后使用上一步中创建的用户名和密码登录。
右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
点击是以确认提升权限提示。
将该计算机加入您的 Active Directory 网域,然后重启。
Add-Computer -Domain
DOMAIN -Restart
将
DOMAIN
替换为您的 Active Directory 域的 DNS 名称。输入具有将虚拟机加入网域所需权限的账号的凭据
等待虚拟机重启。现在,您已将虚拟机实例加入 Active Directory。
预留静态 IP 地址
现在,您需要在 VPC 中预留两个静态 IP 地址。一个 IP 地址用作默认 WSFC 集群 IP 地址,另一个 IP 地址用作 SQL Server 可用性组监听器的静态 IP 地址。
在 WSFC 集群中,集群 IP 地址主要用于管理目的和访问集群资源。此虚拟 IP 地址会分配给集群本身,以便管理员管理集群并执行配置集群设置、监控节点运行状况和管理故障切换流程等任务。
在 SQL Server 可用性组的上下文中,侦听器是虚拟网络名称 (VNN) 和 IP 地址,可让客户端连接到可用性组,而无需知道哪个特定服务器是主节点。
内部负载均衡器需要内部 IP 地址才能高效地路由内部流量,并在 WSFC 集群环境中支持高可用性和负载均衡。内部负载均衡器可确保请求始终会转发到集群的当前主副本。在故障切换事件期间,负载平衡器会检测主副本中的更改,并将客户端连接重定向到新的主副本,而无需手动干预,从而最大限度地缩短停机时间并确保数据库服务的持续可用性。
在包含 SQL Server Always On 可用性组的 WSFC 中,为默认 WSFC 集群 IP 地址和可用性组监听器预留的内部静态 IP 地址也会被关联的内部负载平衡器使用。
如需在 VPC 中预留两个静态 IP 地址,请按以下步骤操作。
gcloud compute addresses create wsfc-cluster-ip \ --subnet $SUBNET_NAME \ --region $(gcloud config get-value compute/region) && \ CLUSTER_IP=$(gcloud compute addresses describe wsfc-cluster-ip \ --region $(gcloud config get-value compute/region) \ --format=value\(address\)) && \ echo "cluster IP: $CLUSTER_IP"
替换
CLUSTER_IP
变量中的集群 IP 地址,您稍后需要将其指定为集群 IP:CLUSTER_IP=
CLUSTER_IP
为可用性分组监听器预留另一个静态 IP,并在名为
LISTENER_IP
的新环境变量中捕获该地址。gcloud compute addresses create wsfc-listener-ip \ --subnet $SUBNET_NAME \ --region $(gcloud config get-value compute/region) LISTENER_IP=$(gcloud compute addresses describe wsfc-listener-ip \ --region $(gcloud config get-value compute/region) \ --format=value\(address\)) && \ echo "Listener IP: $LISTENER_IP"
将负载均衡器的预留 IP 地址替换为
LISTENER_IP
变量,您稍后需要用它来配置可用性组。LISTENER_IP=
LISTENER_IP
您的项目和 VPC 现在已准备好部署 Windows Server 故障切换集群和 SQL Server。
部署故障切换集群
您现在可以使用虚拟机实例部署 Windows Server 故障切换集群和 SQL Server。以下部分详细介绍了如何执行此操作。
正在准备 SQL Server
请按照以下步骤在 Active Directory 中为 SQL Server 创建一个新用户账号。
- 使用远程桌面连接到
node-1
。 使用您的网域用户账号登录。 - 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
为 SQL 服务器和 SQL 代理创建网域用户账号并分配密码:
$Credential = Get-Credential -UserName sql_server -Message 'Enter password' New-ADUser ` -Name "sql_server" ` -Description "SQL Admin account." ` -AccountPassword $Credential.Password ` -Enabled $true -PasswordNeverExpires $true
如需配置 SQL Server,请对 node-1
和 node-2
执行以下步骤:
- 打开 SQL Server 配置管理器。
- 在导航窗格中,选择 SQL Server 服务。
- 在服务列表中,右键点击 SQL Server (MSSQLSERVER),然后选择属性。
在登录身份下,按如下方式更改账号:
- 账号名称:
DOMAIN\sql_server
,其中DOMAIN
是 Active Directory 域的 NetBIOS 名称。 - 密码:输入您之前选择的密码。
- 账号名称:
点击确定。
当系统提示您重启 SQL Server 时,请选择是。
SQL Server 现在在网域用户账号下运行。
创建文件共享
在虚拟机实例 witness
上创建两个文件共享,以便其可以存储 SQL Server 备份并充当文件共享见证:
- 使用远程桌面连接到
witness
。 使用您的网域用户账号登录。 - 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
创建一个见证文件共享并授予自己和两个集群节点对该文件共享的访问权限。
New-Item "C:\QWitness" –type directory icacls C:\QWitness\ /grant 'node-1$:(OI)(CI)(M)' icacls C:\QWitness\ /grant 'node-2$:(OI)(CI)(M)' New-SmbShare ` -Name QWitness ` -Path "C:\QWitness" ` -Description "SQL File Share Witness" ` -FullAccess $env:username,node-1$,node-2$
创建另一个文件共享存储备份并授予 SQL Server 完整访问权限:
New-Item "C:\Backup" –type directory New-SmbShare ` -Name Backup ` -Path "C:\Backup" ` -Description "SQL Backup" ` -FullAccess $env:USERDOMAIN\sql_server
创建故障切换集群
如需创建故障切换集群,请按以下步骤操作:
- 返回到
node-1
上远程桌面会话。 - 右键点击开始按钮(或者按 Win+X),然后点击 Windows PowerShell(管理员)。
- 点击是以确认提升权限提示。
创建新集群。
New-Cluster ` -Name sql-cluster ` -Node node-1,node-2 ` -NoStorage ` -StaticAddress
CLUSTER_IP
将
CLUSTER_IP
替换为您之前创建的集群 IP 地址。返回
witness
上的 PowerShell 会话,并授予集群的虚拟机对象访问文件共享的权限。icacls C:\QWitness\ /grant 'sql-cluster$:(OI)(CI)(M)' Grant-SmbShareAccess ` -Name QWitness ` -AccountName 'sql-cluster$' ` -AccessRight Full ` -Force
返回
node-1
上的 PowerShell 会话,并将集群配置为使用witness
上的文件共享作为集群仲裁。Set-ClusterQuorum -FileShareWitness \\witness\QWitness
验证是否已成功创建集群。
Test-Cluster
您可能会看到以下警告,但可以放心地忽略。
WARNING: System Configuration - Validate All Drivers Signed: The test reported some warnings.. WARNING: Network - Validate Network Communication: The test reported some warnings.. WARNING: Test Result: HadUnselectedTests, ClusterConditionallyApproved Testing has completed for the tests you selected. You should review the warnings in the Report. A cluster solution is supported by Microsoft only if you run all cluster validation tests, and all tests succeed (with or without warnings).
您还可以通过运行
cluadmin.msc
来启动故障切换集群管理器 MMC 管理单元以查看集群的健康状况。如果您使用的是托管式 AD,请将 Windows 集群使用的计算机账号添加到 Cloud 服务网域加入账号组,以便它可以将计算机加入网域。
Add-ADGroupMember ` -Identity "Cloud Service Domain Join Accounts" ` -Members sql-cluster$
在两个节点上启用 Always On 可用性组。
Enable-SqlAlwaysOn -ServerInstance node-1 -Force Enable-SqlAlwaysOn -ServerInstance node-2 -Force
正在创建可用性组
您现在可以创建一个示例数据库 bookshelf
,将其包含在名为 bookshelf-ag
的新可用性组中,并配置高可用性。
创建数据库
创建一个新数据库。就本教程而言,数据库不需要包含任何数据。
- 返回到
node-1
上远程桌面会话。 - 打开 SQL Server Management Studio。
- 在连接到服务器对话框中,验证服务器名称是否设置为
node-1
,然后选择连接。 - 在菜单中,依次选择文件 > 新建 > 使用当前连接查询。
将以下 SQL 脚本粘贴到编辑器中:
-- Create a sample database CREATE DATABASE bookshelf ON PRIMARY ( NAME = 'bookshelf', FILENAME='d:\Data\bookshelf.mdf', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB) LOG ON ( NAME = 'bookshelf_log', FILENAME='d:\Logs\bookshelf.ldf', SIZE = 256MB, MAXSIZE = UNLIMITED, FILEGROWTH = 256MB) GO USE [bookshelf] SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON GO -- Create sample table CREATE TABLE [dbo].[Books] ( [Id] [bigint] IDENTITY(1,1) NOT NULL, [Title] [nvarchar](max) NOT NULL, [Author] [nvarchar](max) NULL, [PublishedDate] [datetime] NULL, [ImageUrl] [nvarchar](max) NULL, [Description] [nvarchar](max) NULL, [CreatedById] [nvarchar](max) NULL, CONSTRAINT [PK_dbo.Books] PRIMARY KEY CLUSTERED ([Id] ASC) WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO -- Create a backup EXEC dbo.sp_changedbowner @loginame = 'sa', @map = false; ALTER DATABASE [bookshelf] SET RECOVERY FULL; GO BACKUP DATABASE bookshelf to disk = '\\witness\Backup\bookshelf.bak' WITH INIT GO
该脚本会创建一个包含单个表的新数据库,并执行初始备份到
witness
。选择执行以运行 SQL 脚本。
配置高可用性
现在,您可以使用 T-SQL 或 SQL Server Management Studio 为可用性组配置高可用性。
使用 T-SQL
如需使用 T-SQL 为可用性组配置高可用性,请按以下步骤操作:
连接到
node-1
,然后执行以下脚本以创建 bookshelf-ag 可用性组。CREATE LOGIN [
NET_DOMAIN
\sql_server] FROM WINDOWS; GO USE [bookshelf]; CREATE USER [NET_DOMAIN
\sql_server] FOR LOGIN [NET_DOMAIN
\sql_server]; GO USE [master]; CREATE ENDPOINT bookshelf_endpoint STATE=STARTED AS TCP (LISTENER_PORT=5022) FOR DATABASE_MIRRORING (ROLE=ALL); GO GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN
\sql_server] GO连接到
node-2
并执行以下脚本。CREATE LOGIN [
NET_DOMAIN
\sql_server] FROM WINDOWS; GO CREATE ENDPOINT bookshelf_endpoint STATE=STARTED AS TCP (LISTENER_PORT=5022) FOR DATABASE_MIRRORING (ROLE=ALL); GO GRANT CONNECT ON ENDPOINT::[bookshelf_endpoint] TO [NET_DOMAIN
\sql_server] GO在
node-1
上,然后执行以下脚本以创建bookshelf-ag
可用性组。USE master; GO CREATE AVAILABILITY GROUP [bookshelf-ag] WITH (AUTOMATED_BACKUP_PREFERENCE = SECONDARY, CLUSTER_TYPE = WSFC, DB_FAILOVER = ON ) FOR DATABASE [bookshelf] REPLICA ON N'node-1' WITH ( ENDPOINT_URL = 'TCP://node-1:5022', AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, FAILOVER_MODE = AUTOMATIC, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO) ), N'node-2' WITH ( ENDPOINT_URL = 'TCP://node-2:5022', AVAILABILITY_MODE = SYNCHRONOUS_COMMIT, FAILOVER_MODE = AUTOMATIC, BACKUP_PRIORITY = 50, SEEDING_MODE = AUTOMATIC, SECONDARY_ROLE(ALLOW_CONNECTIONS = NO) ); GO
在以下脚本中,将
LISTENER_IP
替换为您之前为内部负载均衡器预留的 IP 地址,然后执行该脚本。USE master; GO ALTER AVAILABILITY GROUP [bookshelf-ag] ADD LISTENER N'bookshelf' ( WITH IP ( (N'
', N'255.255.255.0') ), PORT = 1433); GOLISTENER_IP
连接到
node-2
,然后执行以下脚本,将辅助副本加入可用性组并启用自动初始化。USE master; GO ALTER AVAILABILITY GROUP [bookshelf-ag] JOIN; ALTER AVAILABILITY GROUP [bookshelf-ag] GRANT CREATE ANY DATABASE;
检查可用性组的状态。
SELECT * FROM sys.dm_hadr_availability_group_states; GO
您应该会看到
synchronization_health_desc
显示为HEALTHY
使用 SQL Server Management Studio
如需使用 SQL Server Management Studio 为可用性组配置高可用性,请按以下步骤操作:
- 在对象资源管理器窗口中,右键点击 Always On 高可用性,然后选择新建可用性组向导。
- 在指定选项页面上,将可用性组名称设置为
bookshelf-ag
,然后选择下一步。 - 在选择数据库页面上,选择
bookshelf
数据库,然后选择下一步。 在指定副本页面上,选择副本标签页。
- 选择添加副本。
在连接到服务器对话框中,输入服务器名称
node-2
,然后选择连接。可用性副本列表现在包含 SQL Server 实例、
node-1
和node-2
。将两个实例的可用性模式设置为同步提交。
将两个实例的自动故障切换设置为启用。
选择侦听器标签页
- 选择创建可用性组监听器。
输入以下设置。
- 侦听器 DNS 名称:
bookshelf
- 端口:
1433
- 网络模式:静态 IP
- 侦听器 DNS 名称:
选择添加,然后输入您之前为内部负载均衡器预留的监听器 IP 地址 (
)。然后选择确定。LISTENER_IP
选择下一步。
在选择数据同步页面上,选择自动进行种子设定。
在验证页面上,验证所有检查是否都已成功。
在摘要页面上,选择完成。
在结果页面上,选择关闭。
创建内部负载平衡器和健康检查
集群 IP 代表 Windows 故障切换集群的单个端点。您可以使用它进行管理和管理集群资源。集群 IP 始终指向集群的主机(或主)节点。您部署的内部负载均衡器会使用健康检查来确保流量定向到集群的主机节点。由于 WSFC 工具需要多个协议可供转发(ICMP、UDP 和 TCP),因此我们建议部署具有支持所有端口的多个协议的内部负载平衡器。
如需部署内部负载均衡器,请按以下步骤操作:
- 返回到现有的 Cloud Shell 会话。
创建两个非代管式实例组(每个可用区一个),并将这两个节点添加到组中。
REGION=$(gcloud config get-value compute/region) gcloud compute instance-groups unmanaged create wsfc-group-1 --zone $ZONE1 gcloud compute instance-groups unmanaged add-instances wsfc-group-1 --zone $ZONE1 \ --instances node-1 gcloud compute instance-groups unmanaged create wsfc-group-2 --zone $ZONE2 gcloud compute instance-groups unmanaged add-instances wsfc-group-2 --zone $ZONE2 \ --instances node-2
为集群 IP 创建健康检查,以便负载均衡器从 Windows 集群的角度确定哪个节点是活动节点。Compute Engine 来宾代理响应健康检查的默认端口为
59998
。健康检查会在请求中提供集群 IP 地址,并预期从活跃节点返回 1 作为响应。gcloud compute health-checks create tcp wsfc-healthcheck \ --request=$CLUSTER_IP \ --response=1 \ --check-interval="2s" \ --healthy-threshold=2 \ --unhealthy-threshold=2 \ --port=59998 \ --timeout="1s"
创建一个后端服务,然后添加两个现有实例组。
gcloud compute backend-services create wsfc-backend \ --load-balancing-scheme internal \ --region $REGION \ --health-checks wsfc-healthcheck \ --protocol UNSPECIFIED gcloud compute backend-services add-backend wsfc-backend \ --instance-group wsfc-group-1 \ --instance-group-zone $ZONE1 \ --region $REGION gcloud compute backend-services add-backend wsfc-backend \ --instance-group wsfc-group-2 \ --instance-group-zone $ZONE2 \ --region $REGION
创建与集群 IP 关联的内部负载均衡器。
gcloud compute forwarding-rules create wsfc \ --load-balancing-scheme internal \ --address $CLUSTER_IP \ --ports ALL \ --network $VPC_NAME \ --subnet $SUBNET_NAME \ --region $REGION \ --ip-protocol L3_DEFAULT \ --backend-service wsfc-backend
如需为想要连接到 bookshelf
可用性组中的任何数据库的 SQL Server 客户端提供单个端点,请按照以下步骤部署专用于该可用性组的新内部负载均衡器:
为可用性组监听器创建健康检查,以便负载平衡器可以使用该检查来确定
bookshelf
SQL Server 可用性组中的主节点。gcloud compute health-checks create tcp wsfc-bookshelf-healthcheck \ --request=$LISTENER_IP \ --response=1 \ --check-interval="2s" \ --healthy-threshold=1 \ --unhealthy-threshold=2 \ --port=59998 \ --timeout="1s"
健康检查使用相同的 Compute Engine 访客代理端口,但在请求中提供
bookshelf
可用性组的监听器 IP 地址。创建一个新的后端服务并添加两个实例组。
gcloud compute backend-services create wsfc-bookshelf-backend \ --load-balancing-scheme internal \ --region $REGION \ --health-checks wsfc-bookshelf-healthcheck \ --protocol UNSPECIFIED gcloud compute backend-services add-backend wsfc-bookshelf-backend \ --instance-group wsfc-group-1 \ --instance-group-zone $ZONE1 \ --region $REGION gcloud compute backend-services add-backend wsfc-bookshelf-backend \ --instance-group wsfc-group-2 \ --instance-group-zone $ZONE2 \ --region $REGION
创建与 SQL Server
bookshelf-ag
可用性组监听器关联的内部负载均衡器。gcloud compute forwarding-rules create wsfc-bookshelf \ --load-balancing-scheme internal \ --address $LISTENER_IP \ --ports ALL \ --network $VPC_NAME \ --subnet $SUBNET_NAME \ --region $REGION \ --ip-protocol L3_DEFAULT \ --backend-service wsfc-bookshelf-backend
您现在可以使用 DNS 名称 bookshelf
及其在架书可用性组监听器中定义的端口连接到 SQL Server 可用性组监听器。内部负载均衡器会将流量定向到 bookshelf
可用性组的主节点。
如需在单个故障切换集群上创建多个可用性组,您必须使用单独的后端服务和单独的负载均衡器,每个可用性组都有自己的健康检查。
每个可用性分组可能都有不同的节点被指定为主节点,这些节点可能与 Windows 集群的主机节点不同。对于多个可用性组,您需要满足以下要求:
一个用于内部负载均衡器使用的可用性组监听器的预留静态 IP 地址。为每个可用性组预留一个地址。
一条针对每个可用性组的单独健康检查规则。健康检查请求会提供可用性组监听器的静态 IP 地址(也是上一步中预留的 IP 地址)。健康检查探测 GCE 代理返回的响应
1
。所有健康检查均使用端口59998
。为您要添加现有两个计算实例组的每个可用性组创建一个单独的后端服务。后端服务使用上一步中定义的健康检查。
在上一步中创建的后端服务的每个可用性组的内部负载均衡器。负载均衡器与可用性分组监听器静态 IP 地址相关联。
测试故障切换
您现在可以测试故障切换是否按预期工作:
- 返回
witness
上的 PowerShell 会话。 运行以下脚本。
while ($True){ $Conn = New-Object System.Data.SqlClient.SqlConnection $Conn.ConnectionString = "Server=tcp:bookshelf,1433;Integrated Security=true;Initial Catalog=master" $Conn.Open() $Cmd = New-Object System.Data.SqlClient.SqlCommand $Cmd.Connection = $Conn $Cmd.CommandText = "SELECT SERVERPROPERTY('ServerName')" $Adapter = New-Object System.Data.SqlClient.SqlDataAdapter $Cmd $Data = New-Object System.Data.DataSet $Adapter.Fill($Data) | Out-Null $Data.Tables[0] + (Get-Date -Format "MM/dd/yyyy HH:mm:ss") Start-Sleep -Seconds 2 }
在本指南中,我们在服务器定义
tcp:bookshelf,1433
中为可用性组监听器使用了 DNS 名称bookshelf
和端口值1433
。该脚本每两秒使用可用性组监听器连接到 SQL Server 一次,并查询服务器名称。
让该脚本保持运行。
返回到
node-1
上的远程桌面会话以触发故障切换。- 在 SQL Server Management Studio 中,转到 Always On > 高可用性 > 可用性组 > bookshelf-ag(主要),然后右键点击节点。
- 选择故障切换。
- 在选择新的主副本页面上,验证
node-2
是否被选为新的主副本,并且故障切换就绪列是否表示No data loss
。然后选择下一步。 - 在连接到副本页面上,选择连接。
- 在连接到服务器对话框中,验证服务器名称是否为
node-2
,然后点击连接。 - 选择下一步,然后选择完成。
- 在结果页面上,验证故障切换是否成功。
返回
witness
上的 PowerShell 会话。观察正在运行的脚本的输出,并注意服务器名称因故障切换从
node-1
更改为node-2
。按
Ctrl+C
停止该脚本。
清理
完成本教程后,您可以清理您创建的资源,让它们停止使用配额,以免产生费用。以下部分介绍如何删除或关闭这些资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
如需删除项目,请执行以下操作:
- In the Google Cloud console, go to the Manage resources page.
- 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.