本教程介绍了如何使用 Google Cloud NetApp Volumes 块存储和 Internet 小型计算机系统接口 (iSCSI) 协议,在 Compute Engine 虚拟机 (VM) 实例上部署 Microsoft SQL Server Always On 可用性组。将 NetApp Volumes 用于 SQL Server 存储可让您访问高性能、全代管式存储服务,该服务具有快照和克隆等高级数据管理功能。
目标
本教程将指导您完成以下任务:费用
本教程使用 Google Cloud的以下收费组件:如需根据您的预计使用量来估算费用,请使用价格计算器。
准备工作
在开始之前,请确保您��有以下各项:
-
在 Google Cloud 控制台的项目选择器页面上, 选择或创建 Google Cloud 项目。
选择或创建项目所需的角色
- 选择项目:选择项目不需要特定的 IAM 角色,您可以选择您被授予角色的任何项目。
-
创建项目:如需创建项目,您需要 Project Creator 角色
(
roles/resourcemanager.projectCreator),该角色包含resourcemanager.projects.create权限。了解如何授予 角色。
-
验证是否已为您的 Google Cloud 项目启用结算功能。
- 一个 Google Cloud 项目,其中包含 Compute Engine、网络、Identity and Access Management 和 Cloud Storage 的管理员权限。
- 一个 VPC 网络,其中包含目标区域中的子网。
- 在该区域内建立的 Active Directory 和 DNS 服务。
- 一个 Active Directory 用户,该用户有权将计算机加入网域并使用 RDP 访问虚拟机。
- 确保 VPC 防火墙规则允许节点之间进行 iSCSI (TCP 3260)、WSFC (UDP/TCP 3343)、SQL Server (TCP 1433)、SQL Server AG 端点 (TCP 5022)、SMB (TCP 445) 和 RPC (TCP 135、TCP 49152-65535) 流量。
- 启用 NetApp Volumes API。
-
在 Google Cloud 控制台中,激活 Cloud Shell。
配置网域账号
为 SQL Server 配置两个 Active Directory 账号:
- 安装账号:具有网域管理员权限(例如 DOMAIN\DomainAdmin)的账号,用于登录虚拟机并配置集群和可用性组。
- 服务账号:SQL Server 虚拟机上的 SQL Server 服务和 SQL 代理服务的账号(例如 DOMAIN\sqlsvc)。
为 SQL Server 创建 Compute Engine 虚拟机
创建两个 Compute Engine 实例(sqlnode1 和 sqlnode2),这两个实例在 Windows Server 2025 上运行 SQL Server 2022 Enterprise:
在 Google Cloud 控制台中,前往创建实例 页面。
对于名称,输入
sqlnode1。在机器配置 部分中,选择通用,然后执行以下操作:
- 在系列 列表中,选择 N4 。
- 在机器类型 列表中,选择 n4-highmem-8(8 个 vCPU、64 GB 内存) 。
选择您配置 VPC 的区域 和可用区 。
在启动磁盘 部分,点击更改 ,然后执行以下操作:
- 在公共映像 标签页上,从操作系统 列表中选择 Windows Server 上的 SQL Server 。
- 从版本 列表中,选择 Windows Server 2025 Datacenter 上的 SQL Server 2022 Enterprise 。
- 在启动磁盘类型 列表中,选择 Hyperdisk Balanced 。
- 将大小 (GB) 设置为
50。 - 要保存启动磁盘配置,请点击选择 。
展开高级选项 部分,然后展开网络 。
对于网络接口 ,选择项目的 VPC 和子网 。
在网络接口卡类型 列表中,选择 gVNIC 。
在网络服务层级 部分,选择高级 。
点击创建 。
重复这些步骤以创建第二个名为
sqlnode2的实例。
将服务器加入网域并为集群做准备
在 sqlnode1 和 sqlnode2 上执行以下步骤:
- 使用本地管理员账号连接到虚拟机。
- 在服务器管理器 中,选择本地服务器 。
- 选择 WORKGROUP 链接。
- 在计算机名称 部分,选择更改 。
- 选中网域 复选框,输入您的网域名称(例如
cvsdemo.internal),然后点击确定 。 - 在 Windows 安全性 对话框中,输入网域管理员账号的凭据,然后点击确定 。
- 当系统显示网域的欢迎辞时,请完成以下步骤:a. 点击确定 。b. 点击关闭 ,然后选择立即重启 。
- 虚拟机重启后,使用网域管理员账号连接到虚拟机。
- 将
DOMAIN\sqlsvc账号添加到虚拟机上的本地 管理员 群组。您可以使用以下 PowerShell 命令:Add-LocalGroupMember -Group "Administrators" -Member "DOMAIN\sqlsvc"
以管理员身份打开 PowerShell,然后运行以下命令以安装所需的 Windows 功能:
# Install Failover Clustering and tools Install-WindowsFeature Failover-Clustering, RSAT-Clustering-PowerShell, RSAT-Clustering-CmdInterface -IncludeAllSubFeature -IncludeManagementTools # Install and enable MPIO for iSCSI Install-WindowsFeature -Name Multipath-IO Enable-MSDSMAutomaticClaim -BusType "iSCSI" # Install .NET and other SQL prereqs Install-WindowsFeature NET-Framework-45-Core, NET-Framework-45-Features Install-WindowsFeature RSAT-AD-PowerShell
如需获取虚拟机的 iSCSI 限定名称 (IQN),请运行
iscsicpl.exe,前往配置 标签页,然后复制发起程序名称 。或者,运行以下 PowerShell 命令:Get-InitiatorPort | Select-Object NodeAddress
记录
sqlnode1和sqlnode2的 IQN。下一部分将会用到它们。示例:iqn.1991-05.com.microsoft:sqlnode1.cvsdemo.internal。
创建 NetApp Volumes 块存储卷
按照以下步骤创建主机组、存储池和 iSCSI 卷。
创建主机组
主机组可确保只有指定的主机(您的 SQL Server 虚拟机)才能访问您创建的卷。
在 Cloud Shell 中,创建一个包含
sqlnode1和sqlnode2的 IQN 的主机组:gcloud netapp host-groups create HOST_GROUP_NAME
--location=LOCATION
--type=ISCSI_INITIATOR
--hosts=SQLNODE1_IQN,SQLNODE2_IQN
--os-type=WINDOWS
--description="SQL Server AG nodes"替换以下信息:
HOST_GROUP_NAME:主机组的名称,例如sql-ag-hosts。LOCATION:主机组的区域,例如us-west1。SQLNODE1_IQN:sqlnode1的 IQN。SQLNODE2_IQN:sqlnode2的 IQN。
预配存储池
在 Cloud Shell 中,为卷创建存储池:
gcloud netapp storage-pools create POOL_NAME
--project=PROJECT_ID
--location=ZONE
--service-level=Flex
--type=Unified
--capacity=1024
--total-throughput=64
--total-iops=1024
--network=name=VPC_NAME,psa-range=PSA_RANGE_NAME替换以下信息:
POOL_NAME:存储池的名称,例如sql-pool。PROJECT_ID:您的 Google Cloud 项目 ID。ZONE:存储池的可用区,该可用区必须与虚拟机的可用区一致,例如us-west1-b。VPC_NAME:您的 VPC 网络的名称。PSA_RANGE_NAME:分配的专用服务访问通道连接范围的名称。
创建卷
为每个节点的 SQL Server 数据、日志、tempdb 和备份创建单独的卷。
在 Cloud Shell 中,为您需要创建的每个卷运行以下命令:
gcloud netapp volumes create VOLUME_NAME
--project=PROJECT_ID
--location=ZONE
--storage-pool=POOL_NAME
--capacity=200
--protocols=ISCSI
--block-devices="name=VOLUME_NAME,host-groups=projects/PROJECT_ID/locations/LOCATION/hostGroups/HOST_GROUP_NAME,os-type=WINDOWS"
--snapshot-directory=false将
VOLUME_NAME替换为每个卷的唯一名称。在本双节点教程中,您需要运行该命令八次,以便为每个节点创建数据、日志、tempdb 和备份卷(例如sqlnode1-data、sqlnode1-log、sqlnode1-temp、sqlnode1-backup、sqlnode2-data、sqlnode2-log、sqlnode2-temp和sqlnode2-backup)。
在每个 SQL 虚拟机上装载 iSCSI 卷
对于每个虚拟机(sqlnode1 和 sqlnode2),装载您为该特定节点创建的卷。
在 Google Cloud 控制台中,前往 NetApp Volumes 的 卷 页面。
选择分配给您要配置的节点的卷。记下 iSCSI 目标详细信息 部分中列出的目标门户 IP 地址。您需要使用这些地址连接到卷。
在虚拟机上,以管理员身份打开 PowerShell,然后运行以下命令,将示例 IP 替换为卷的目标门户 IP:
"10.165.128.216","10.165.128.217" | ForEach-Object { New-IscsiTargetPortal -TargetPortalAddress $_ }运行
iscsicpl.exe以打开 iSCSI 发起程序属性 。前往目标 标签页,从列表中选择一个卷目标,然后点击连接 。
在连接到目标 对话框中,选择启用多路径 ,然后点击高级 。
在高级设置 对话框中:
- 本地适配器:选择Microsoft iSCSI 发起程序。
- 发起程序 IP:选择虚拟机上的 IP 地址。
- 目标门户 IP:选择您发现的门户 IP 之一。
- 点击确定 。
在连接到目标 对话框中,点击确定 。
对与虚拟机关联的所有目标重复连接步骤。
如需为 iSCSI 设备配置 MPIO,请从控制面板 或服务器管理器 中打开 MPIO 属性 。
点击发现多路径 标签页。
选择添加对 iSCSI 设备的支持 ,然后点击添加 。如果系统提示您重启虚拟机,请重启虚拟机。
重启后,打开设备管理器 并展开磁盘驱动器 。您的 iSCSI 磁盘将显示为多路径设备。
打开磁盘管理 (
compmgmt.msc)。对于每个新磁盘:- 将磁盘联机。
- 初始化磁盘 (GPT)。
- 创建一个新卷,分配盘符(例如,D 代表数据,E 代表日志,F 代表备份,G 代表 tempdb),然后使用 NTFS 格式化该卷,并将分配单元大小 设置为 64K 。
在刚格式化的驱动器上为 SQL Server 创建目录结构。例如:
$paths = "D:\MSSQL\DATA","E:\MSSQL\Log","F:\MSSQL\Backup","G:\MSSQL\Temp" $paths | ForEach-Object { New-Item -ItemType Directory -Path $_ -Force }
配置 SQL Server
在装载各自的卷后,在 sqlnode1 和 sqlnode2 上执行以下步骤。
- 打开 SQL Server 配置管理器 。
- 在左侧窗格中,选择 SQL Server 服务 。
- 在右侧窗格中,右键点击 SQL Server (MSSQLSERVER),选择属性,前往登录标签页,然后将账号名称更改为您的服务帐号 (DOMAIN\sqlsvc)。输入密码,然后点击确定 。
- 对 SQL Server 代理 (MSSQLSERVER) 重复上一步。
- 使用 SQL Server Management Studio (SSMS) 和您的网域管理员账号连接到 SQL Server 实例。
- 为服务帐号创建登录名,并向其授予必要的权限:
USE [master]; GO CREATE LOGIN [DOMAIN\sqlsvc] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]; GO ALTER SERVER ROLE [sysadmin] ADD MEMBER [DOMAIN\sqlsvc]; GO
- 在 SSMS 中运行以下脚本,将默认数据库、日志、备份和 tempdb 路径重定向到您装载的 iSCSI 卷:
USE [master]; GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', REG_SZ, N'F:\MSSQL\Backup'; GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', REG_SZ, N'D:\MSSQL\DATA'; GO EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', REG_SZ, N'E:\MSSQL\Log'; GO -- Modify model and msdb paths ALTER DATABASE model MODIFY FILE (NAME = modeldev, FILENAME = 'D:\MSSQL\DATA\model.mdf'); ALTER DATABASE model MODIFY FILE (NAME = modellog, FILENAME = 'E:\MSSQL\Log\modellog.ldf'); ALTER DATABASE msdb MODIFY FILE (NAME = MSDBData, FILENAME = 'D:\MSSQL\DATA\MSDBData.mdf'); ALTER DATABASE msdb MODIFY FILE (NAME = MSDBLog, FILENAME = 'E:\MSSQL\Log\MSDBLog.ldf'); GO -- Modify tempdb paths ALTER DATABASE tempdb MODIFY FILE (NAME = tempdev, FILENAME = 'G:\MSSQL\Temp\tempdb.mdf'); ALTER DATABASE tempdb MODIFY FILE (NAME = templog, FILENAME = 'G:\MSSQL\Temp\templog.ldf'); GO
- 停止 SQL Server (MSSQLSERVER) 服务。
- 将现有的
model、msdb和tempdb文件从其旧位置(例如C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA)移动到驱动器 D:、E: 和 G: 上的新位置。 - 如需移动
master数据库和ERRORLOG:- 打开 SQL Server 配置管理器 。
- 右键点击 SQL Server (MSSQLSERVER),选择属性,然后前往启动参数标签页。
- 对于指向 C: 驱动器的每个现有参数
-d、-e和-l,选择该参数,然后点击移除 。 - 添加以下参数,并为每个参数点击添加 :
-dD:\MSSQL\DATA\master.mdf-lE:\MSSQL\Log\mastlog.ldf-eE:\MSSQL\Log\ERRORLOG
- 点击确定 。
- 手动将
master.mdf和mastlog.ldf分别从C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA移动到D:\MSSQL\DATA\` andE:\MSSQL\Log`。 - 将
ERRORLOG文件从其旧位置移动到 `E:\MSSQL\Log`。
- 启动 SQL Server (MSSQLSERVER) 服务。
设置 Windows Server 故障切换集群
按照以下步骤创建集群并配置仲裁见证。
配置 Windows 防火墙
在创建集群之前,请确保每个节点上的 Windows 防火墙允许 WSFC、SQL Server 和 iSCSI 的流量。
在 sqlnode1 和 sqlnode2 上,以管理员身份打开 PowerShell,然后运行以下命令:
New-NetFirewallRule -DisplayName 'Failover Clusters (UDP-In)' -Direction Inbound -Protocol UDP -LocalPort 3343 -Action Allow New-NetFirewallRule -DisplayName 'Failover Clusters (TCP-In)' -Direction Inbound -Protocol TCP -LocalPort 3343 -Action Allow New-NetFirewallRule -DisplayName 'RPC Endpoint Mapper' -Direction Inbound -Protocol TCP -LocalPort 135 -Action Allow New-NetFirewallRule -DisplayName 'File and Printer Sharing (SMB-In)' -Direction Inbound -Protocol TCP -LocalPort 445 -Action Allow New-NetFirewallRule -DisplayName 'Failover Cluster Manager RPC' -Direction Inbound -Protocol TCP -LocalPort 49152-65535 -Action Allow New-NetFirewallRule -DisplayName 'iSCSI' -Direction Inbound -Protocol TCP -LocalPort 3260 -Action Allow New-NetFirewallRule -DisplayName 'SQL Server' -Direction Inbound -Protocol TCP -LocalPort 1433 -Action Allow New-NetFirewallRule -DisplayName 'SQL Server AG Endpoint' -Direction Inbound -Protocol TCP -LocalPort 5022 -Action Allow
创建集群
- 在
sqlnode1上,打开故障切换集群管理器 (cluadmin.msc)。 - 在管理 部分中,选择验证配置 。按照向��验证
sqlnode1和sqlnode2。确保所有测试均已通过,然后再继续。 - 验证后,选择创建集群 。
- 在创建集群向导 中,将
sqlnode1和sqlnode2添加为集群节点。 - 对于用于管理集群的访问点,输入集群名称(例如
sqlcluster),并为集群提供静态 IP 地址。 - 按照提示创建集群。
为集群仲裁创建文件共享
我们建议您在第三个虚拟机上(最好是在不同的可用区中)创建一个文件共享,以用作集群仲裁见证。
- 连接到您打算用作文件共享见证的虚拟机。
- 在服务器管理器 窗口中,依次选择工具 > 计算机管理 。
- 展开系统工具 > 共享文件夹,右键点击共享,然后选择新建共享。
- 按照创建共享文件夹向导 的步骤操作。在文件夹路径 页面上,浏览或创建共享文件夹。
- 在权限 页面上,选择自定义权限 。
- 点击添加 ,然后向集群名称对象 (CNO) 账号(例如
sqlcluster$)授予完全控制 权限。 - 完成向导以创建共享。
配置集群仲裁
- 在
sqlnode1上,打开故障切换集群管理器 。 - 右键点击集群名称,然后依次选择更多操作 > 配置集群仲裁设置 。
- 在配置集群仲裁向导 中,选择下一步 。
- 在选择仲裁配置选项 页面上,选择选择仲裁见证 ,然后点击下一步 。
- 在选择仲裁见证 页面上,选择配置文件共享见证 ,然后点击下一步 。
- 对于文件共享路径,输入您创建的共享的路径(例如
\\witness-server\quorum),然后点击下一步。 - 确认您的设置,然后依次点击下一步 和完成。
配置 Always On 可用性组
将本部分中的步骤应用于两个 SQL Server 虚拟机,以启用和配置可用性组。
在 SQL Server 中启用可用性组
- 打开 SQL Server 配置管理器 。
- 在浏览器树中,选择 SQL Server 服务 。
- 右键点击 SQL Server (MSSQLSERVER),然后选择属性。
- 选择 Always On 高可用性 标签页,然后选择启用 Always On 可用性组 。
- 依次点击应用 和确定。重启 SQL Server 服务。
为可用性组创建数据库
- 使用 SSMS 连接到
sqlnode1。 - 在对象资源管理器 窗格中,右键点击数据库 ,然后选择新建数据库 。
- 对于数据库名称,输入
MyDB1,然后点击确定。 - 右键点击
MyDB1,然后依次选择任务 > 备份 。执行完整 备份。确保数据库恢复模式为完整 。 - 右键点击
MyDB1,然后依次选择任务 > 备份 。执行事务日志 备份。 - 将完整备份文件和事务日志备份文件复制到
sqlnode2。 - 使用 SSMS 连接到
sqlnode2。右键点击数据库 ,然后选择还原数据库 。 - 从
sqlnode1还原MyDB1的完整备份,并在选项 页面中指定 RESTORE WITH NORECOVERY 。 - 右键点击
sqlnode2上的MyDB1,然后依次选择任务 > 还原 > 事务日志 。还原事务日志备份,同时指定 RESTORE WITH NORECOVERY 。
创建可用性组
- 使用 SSMS 连接到
sqlnode1。 - 在对象资源管理器中,右键点击Always On 高可用性,然后选择新建可用性组向导。
- 指定可用性组名称,例如
sql-ag。 - 选择
MyDB1作为要包含的数据库。 - 在指定副本 页面上,点击添加副本 ,然后连接到
sqlnode2。 - 为两个副本启用自动故障切换,将可用性模式设置为同步提交,并将可读辅助副本设置为是。
- 前往端点 标签页,确保使用端口
5022。 - 在选择初始数据同步 页面上,选择仅加入 。
- 完成向导以创建可用性组。
为可用性组创建 DNN 资源
使用分布式网络名称 (DNN) 而不是负载均衡器,将客户端流量路由到可用性组监听器。
- 打开故障切换集群管理器,展开角色,然后选择您的可用性组角色。
- 在资源 中,右键点击可用性组资源,然后依次选择添加资源 > 客户端访问点。
- 为 DNN 监听器提供名称 ,然后完成向导。
- 将新的 DNN 资源联机。
- 默认情况下,集群会将 DNN DNS 名称绑定到集群中的所有节点。如果集群中有不托管 SQL Server 副本的节点,您必须将这些节点从 DNN 的可能所有者中排除:
- 右键点击您创建的 DNN 资源,然后选择属性 。
- 取消选中不是可用性组副本的任何节点的复选框。
- 点击确定 。
- 更新应用连接字符串以连接到 DNN 监听器名称,并添加
MultiSubnetFailover=True。
测试故障切换
使用 SSMS 连接到
sqlnode1或sqlnode2,然后运行以下查询以检查哪个副本是主副本,并检查两个副本是否都配置为同步提交和自动故障切换:-- Check primary replica SELECT ag.name AS AG_Name, ar.replica_server_name as PrimaryReplica FROM sys.dm_hadr_availability_replica_states AS ars JOIN sys.availability_groups AS ag ON ag.group_id = ars.group_id JOIN sys.availability_replicas ar ON ar.replica_id = ars.replica_id WHERE ars.role_desc = 'PRIMARY';
-- Check replica configuration SELECT replica_server_name, availability_mode_desc, failover_mode_desc FROM sys.availability_replicas WHERE group_id = (SELECT group_id FROM sys.availability_groups WHERE name = N'sql-ag');
如需启动手动故障切换,请在 SSMS 中连接到辅助副本,然后运行以下命令:
ALTER AVAILABILITY GROUP [sql-ag] FAILOVER;
故障切换后,运行
SELECT @@SERVERNAME;或重新连接到 DNN 监听器并检查服务器名称,以验证新的主副本。您还可以在 SSMS 中查看可用性组状态,方法是右键点击 Always On 高可用性 下的可用性组,然后选择显示信息中心 。
清理
删除项目
为避免系统因本教程中使用的资源向您的 Google Cloud 项目收取费用,请删除您的项目。如需了解详情,请参阅关停项目。